c-为什么这个MPI程序不能用2个以上的处理器输出更多的信息



这个MPI程序是用C编写的。当我输入2作为处理器数量时,输出如下:

P:0 Got data from processor 1 
P:0 Got 100 elements 
P:0 value[5]=5.000000 

但当我输入3个或更多处理器时,程序会输出

P:0 Got data from processor 1 
P:0 Got 100 elements 
P:0 value[5]=5.000000 

然后它停了下来,其他的东西都没有打印出来。我必须用[ctrl]+[c]退出程序。我不知道为什么程序会暂停。我希望你能给我一些提示或指引。

这是代码:

#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
/* Run with two processes */
int main(int argc, char *argv[]) {
        int rank, i, count;
        float data[100],value[200];
        MPI_Status status;
        MPI_Init(&argc,&argv);
        MPI_Comm_rank(MPI_COMM_WORLD,&rank);
        if(rank==1) {
                for(i=0;i<100;++i) data[i]=i;
                MPI_Send(data,100,MPI_FLOAT,0,55,MPI_COMM_WORLD);
        } else {
                MPI_Recv(value,200,MPI_FLOAT,MPI_ANY_SOURCE,55,MPI_COMM_WORLD,&status);
                printf("P:%d Got data from processor %d n",rank, status.MPI_SOURCE);
                MPI_Get_count(&status,MPI_FLOAT,&count);
                printf("P:%d Got %d elements n",rank,count);
                printf("P:%d value[5]=%f n",rank,value[5]);
        }
        MPI_Finalize();
}

因为您只将数据发送给具有rank == 0的进程和具有rank == 1的进程。这就是为什么它适用于2个进程(0和1)。随着进程的增加,秩为2,3,4,5…的进程将进入else块并等待未发送的数据。这就是他们停止执行的原因(等待永远不会发送的数据)。您应该让秩为1的进程将数据发送给所有其他进程,用一个for循环封装发送操作,并将for循环迭代器作为MPI_Send调用中的目标秩。

您的秩为2的处理器正在等待接收从未发送给它的数据。让我们逐步了解您的代码:处理器1进入if块并将信息发送给处理器0。处理器0在else块中接收到该信息并继续。处理器2也进入else块并等待从其他处理器接收信息,但没有任何东西向它发送任何信息,因此它只是挂起。为了解决这个问题,添加一个MPI_Send(data,100,MPI_FLOAT,1,55,MPI_COMM_WORLD);命令在三个处理器上运行。或者,使用一个循环发送到所有不是秩1的处理器。

最新更新