目标:
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();
}