C 为什么这个MPI程序会暂停

C 为什么这个MPI程序会暂停,c,mpi,C,Mpi,在main中循环的每次迭代中,列组0向多个从属列组中的每一个执行一次发送,但每个从属列组发送的接收数量与从属列组总数相同。由于没有与后续接收匹配的发送,因此接收器会无限期阻塞,程序会挂起。多亏Novelocrat的回答,正确的代码实际上是: Sent 0 to process 1 Sent 0 to process 2 Sent 1 to process 1 Sent 1 to process 2 Process 1 has received 0 Proc

main
中循环的每次迭代中,列组0向多个从属列组中的每一个执行一次发送,但每个从属列组发送的接收数量与从属列组总数相同。由于没有与后续接收匹配的发送,因此接收器会无限期阻塞,程序会挂起。

多亏Novelocrat的回答,正确的代码实际上是:

     Sent 0 to process 1  
 Sent 0 to process 2  
 Sent 1 to process 1  
 Sent 1 to process 2  
 Process 1 has received 0  
 Process 2 has received 1  
 Process 1 has received 2  
 Sent 2 to process 1  
 Sent 2 to process 2  
 Process 1 has received 0  
 Process 2 has received 1  
 Process 1 has received 2
#包括
#包括
#包括
//#定义尺寸3
无效主控形状(整数n,整数大小)
{

对于(int j=1;j为什么每个人都发布他们的代码并期望人们进行调试?因为我们不了解发生了什么…事情是如何工作的。有没有更好的方法来问这类问题?是的,我也认为这可能是问题所在。但我还可以如何重新组织代码?我想让代码保持在函数中这不是问题关于函数。在外循环的每次运行中,主循环只与每个从循环进行一次交互,但每个从循环尝试与主循环进行多次交互。看看你的循环结构。所以我想我应该去掉从循环中的for循环。哦,还有,你在
从循环中的打印存在-循环索引不是进程秩。太基本了联盟,整个主要的()是在三个不同的进程上执行的…我还没有清楚地掌握这一点,所以,如果你真的要向所有的从属列组发送一个值
n
,你可能应该将其表述为
MPI\u Bcast
,而不是循环
MPI\u Send
。是的。我目前正在编写玩具程序来帮助我掌握MPI的窍门。是Linux上是否有任何调试环境可以发送有用的信息?我目前正在使用终端。如果程序挂起,我不知道为什么会发生这种情况。人们似乎使用的标准工具是商用调试器Alinea DDT。我想不出一个通用的自由软件工具,但DDT可能对个人用户免费东南方。
     Sent 0 to process 1  
 Sent 0 to process 2  
 Sent 1 to process 1  
 Sent 1 to process 2  
 Process 1 has received 0  
 Process 2 has received 1  
 Process 1 has received 2  
 Sent 2 to process 1  
 Sent 2 to process 2  
 Process 1 has received 0  
 Process 2 has received 1  
 Process 1 has received 2
#include <stdio.h>
#include <mpi.h>
#include <stdlib.h>
//#define SIZE 3

void master(int n,int size)
{
    for(int j=1;j<size;j++){
    MPI_Send(&n,1,MPI_INT,j,1,MPI_COMM_WORLD);
    printf("\n Sent %d to process %d",n,j);
    fflush(stdout);
    }
}

void slave(int size)
{
    int k=0,rank=0;
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    MPI_Status status;
    MPI_Recv(&k,1,MPI_INT,0,1,MPI_COMM_WORLD,&status);
    printf("\n Process %d has received %d",rank,k);
    fflush(stdout);

}

int main(int argc,char** argv)
{

    MPI_Init(&argc,&argv);
    int la_size;
    int rank;
    MPI_Comm_size(MPI_COMM_WORLD,&la_size);

    MPI_Comm_rank(MPI_COMM_WORLD,&rank);

    for(int i=0;i<3;i++){
    if(rank==0)
        master(i,la_size);
    else
        slave(la_size);

    }
    MPI_Finalize();
    printf("\nprogram finished...");
    fflush(stdout);
    return 0;

}