目标:
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;
}
结果截图:
错误提示
注意:参数m通过main函数传入,如上图可以看出当忘了输入参数m 时会提示错误。