1. 问题描述
创建np
个进程,使第iam
个进程向iam+1
个进程发送消息,第np-1
个进程向第0
个进程发送消息,行成一个环形结构
2. 解决思路
申明一个子程序
/*************************************************
Function: ring
Description: 实现进程间环形通讯
Input: m: 发送的消息
comm:MPI通讯域
np: 进程数
iam:当前进程号
Output: n:接收的消息
Return: void
*************************************************/
void ring(int m, int *n, MPI_Comm comm, int np, int iam);
2.1 定位前后进程
已知第iam
个进程,定位前一个进程。为了防止第0
个进程减1
后得到负数,需要加上np
front = (np + iam - 1) % np;
已知第iam
个进程,定位下一个进程,为了使第np-1
个进程的下一个进程为0
,需要取模
next = (iam + 1) % np;
2.2 消息发送
思路一
使用MPI_Send
,MPI_Recv
。这对函数是阻塞式操作,为了防止死锁,需要有进程先发送消息。最直观的思路是0号进程先发送再接收,其他进程先接收再发送。但这样几乎没有并行性,效率太低;考虑让偶数号进程先发送,奇数号进程先接收