为什么这个MPI程序不能输出超过2个处理器的更多信息?

时间:2014-09-30 18:15:45

标签: c mpi

这个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();
}

2 个答案:

答案 0 :(得分:5)

因为您仅将数据发送到rank == 0的流程,其中流程为rank == 1。这就是为什么它适用于2个进程(0和1)。使用更多进程时,级别为2,3,4,5 ....的进程将进入else块并等待未发送的数据。这就是为什么他们停止执行(等待永远不会发送的数据)。您应该使用等级1的进程将数据发送到所有其他进程,使用单个for循环封装发送操作,并将for循环迭代器作为MPI_Send调用中的目标排名。

答案 1 :(得分:2)

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