dmi*_*tru 3 c parallel-processing mpi
假设我有n个进程,并且每个进程都拥有一段本地数据,比如一个int.
现在我想重新实现MPI_Allreduce()函数,即计算所有这些整数的全局和,然后将得到的和返回给进程.
我试着像在下面的代码中那样做:
int temp;
int my_sum = temp = my_data;
for (int i = 1; i < size; ++i) {
int partner = (my_rank + 1) % size;
MPI_Sendrecv_replace(&temp, 1, MPI_INT,
partner, 0,
my_rank, 0,
MPI_COMM_WORLD, MPI_STATUS_IGNORE);
my_sum += temp;
}
Run Code Online (Sandbox Code Playgroud)
所以进程在一个环形通信中进行通信,但它正在阻塞.为什么?如何更改代码以使其正常工作?
注意:请不要建议问题的替代(更好)解决方案(显然,其中之一是使用MPI_Allreduce()函数).我的目标是理解为什么这段代码片段不能正常工作.
每个人都试图从自己那里接受,但他们正在向他们发送partner; 因为partner永远不会收到正在发送的消息,并且my_rank永远不会从这里收到消息,所以有一个挂起.
如果您正在尝试发送数据parter,那么您需要确保partner从您那里接收,这意味着每个人都需要从以下地址接收(myrank - 1 + size) % size:
int spartner = (my_rank + 1) % size;
int rpartner = (my_rank - 1 + size) % size;
MPI_Sendrecv_replace(&temp, 1, MPI_INT,
spartner, i,
rpartner, i,
MPI_COMM_WORLD, MPI_STATUS_IGNORE);
Run Code Online (Sandbox Code Playgroud)
这样,等级3(比方说)发送到4,等级4在每次迭代时从等级3接收,因此sendrecv完成.(我也冒昧地通过循环给每个迭代它自己的标记,这在这里不是必需的,但如果存在其他不匹配消息类型错误,通常会帮助查找错误.)