OpenMPI学习笔记(三)之围圈报数

时间:2022-07-13 11:00:32

目标:

n 个人围成一圈, 从某一个开始报数一直循环到本人。
即rang为r的进程发送信息给:

rang为r+1的进程,如果其存在;
否则给rang为0的进程。

代码部分:

#include <mpi.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char**argv){
    MPI_Init(&argc, &argv);
    int world_size, wrank;
    MPI_Comm_size(MPI_COMM_WORLD, &world_size);
    MPI_Comm_rank(MPI_COMM_WORLD, &wrank);

    if(world_size < 2){
        printf("人数必须大于2\n");
        MPI_Finalize();
    }

    int pass = 0;
    if(wrank == 0){
        //MPI发送函数
        //函数原型 int MPI_Send ( const void * buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm );

        //int MPI_Send(数据包, 大小, 数据类型, 目的地标识, 数据包标记, 容器)
        MPI_Send(&pass, 1, MPI_INT, wrank + 1, wrank, MPI_COMM_WORLD);

        //MPI接收函数, 与Send函数对应。
        //函数原型int MPI_Recv ( void * buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status * status );

        //int MPI_Recv(数据包, 大小, 数据类型, 数据源标识, 数据包标记, 容器, MPI状态)
        MPI_Recv(&pass, 1, MPI_INT, world_size - 1, world_size - 1, MPI_COMM_WORLD, MPI_STATUS_IGNORE);

        ++pass;
        printf("我是 %d. 我收到 %d的报数. 总人数 : %d.\n", wrank, world_size - 1, pass);
    }
    else{
        //先接收后发送,否则容易造成死锁发生。
        MPI_Recv(&pass, 1, MPI_INT, wrank - 1, wrank - 1, MPI_COMM_WORLD, MPI_STATUS_IGNORE);

        ++pass; 

        //选择发送目的地, 如果当前进程rang不等于进程总数-1(即存在存在rang为r+1的进程),则发送rang为r+1的进程;否则发送给rang为0的进程。
        int dest = wrank < world_size - 1 ? wrank + 1 : 0;

        MPI_Send(&pass, 1, MPI_INT, dest, wrank, MPI_COMM_WORLD);
        printf("我是 %d. 我收到 %d的报数. 总人数 : %d.\n", wrank, wrank - 1, pass);
    }
    MPI_Finalize();
}

结果截图:

OpenMPI学习笔记(三)之围圈报数