OpenMPI学习笔记(四)之围圈报数变形记之m圈报数

时间:2022-10-05 11:00:11

目标:

n人围成一圈,从第一个开始报数,给定一个数m,当循到m圈时,停止报数。

代码部分:

#include <mpi.h>
#include <stdio.h>
#include <stdlib.h>
#define USAGE "USAGE: mpirun [-n numberProcess] nameProcess numberCyclePositive"

int main(int argc, char**argv){ 
    if(argc != 2){
        printf("%s\n", USAGE);
        abort();    
    }   

    int cycle = atoi(argv[1]);
    if(cycle < 0){
        printf("循环次数必须为正整数!\n");
        printf("%s\n", USAGE);
        abort();        
    }

    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;
    for(int i = 0; i < cycle; i++){
        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; 
            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();
    return 0;
}

结果截图:

OpenMPI学习笔记(四)之围圈报数变形记之m圈报数

错误提示
OpenMPI学习笔记(四)之围圈报数变形记之m圈报数

注意:参数m通过main函数传入,如上图可以看出当忘了输入参数m 时会提示错误。