gpt4 book ai didi

c - 为什么 MPI_Sendrecv 会阻塞?

转载 作者:太空狗 更新时间:2023-10-29 16:08:32 25 4
gpt4 key购买 nike

假设我有 n 个进程,每个进程都拥有一个本地数据,比如说一个 int

现在我想重新实现 MPI_Allreduce() 函数,即计算所有这些 int 的全局总和,然后将结果总和广播回进程。

我试着像下面的代码那样做:

  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;
}

因此进程以环形方式通信,但它是阻塞的。为什么?如何更改代码以使其正常工作?

注意:请不要建议替代(更好)的问题解决方案(显然,其中之一是使用 MPI_Allreduce() 函数)。我的目标是了解为什么此代码片段无法正常工作。

最佳答案

每个人都试图从自己那里接收,但他们都在发送给伙伴;因为 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);

这样,在每次迭代中,第 3 级(比如说)发送给第 4 级,第 4 级从第 3 级接收,因此 sendrecv 完成。 (我还冒昧地为循环中的每次迭代赋予了自己的标记,这在这里并不是必需的,但如果存在其他不匹配的消息类型错误,通常有助于发现错误。)

关于c - 为什么 MPI_Sendrecv 会阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12168603/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com