C 为什么这个MPI程序不能用两个以上的处理器输出更多的信息?

C 为什么这个MPI程序不能用两个以上的处理器输出更多的信息?,c,mpi,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]退出程序。我不知道为什么

这个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();
}
#包括
#包括
#包括
/*运行两个进程*/
int main(int argc,char*argv[]){
int秩,i,计数;
浮点数据[100],数值[200];
MPI_状态;
MPI_Init(&argc,&argv);
MPI通信等级(MPI通信世界和等级);
如果(秩==1){

对于(i=0;i您的2级处理器正在等待接收从未发送到它的数据。让我们逐步检查您的代码:处理器1进入
if
块并向处理器0发送信息。处理器0在
else
块中接收此信息并继续。处理器2也进入
else
块并正在等待从其他处理器接收信息,但没有任何东西会发送任何信息,因此它只是挂起。为了避免这种情况,请添加一个
MPI_发送(数据,100,MPI_浮点,1,55,MPI_COMM_WORLD);
命令在三个处理器上运行。或者,使用循环将数据发送到非秩1的所有处理器。

因为您只将数据发送到秩=0的进程和秩=1的进程。这就是为什么它可以在两个进程(0和1)中正常工作的原因。对于更多进程,秩为2,3,4,5…的进程将进入
else
块并等待未发送的数据。这就是它们停止执行的原因(等待永远不会发送的数据)。您应该使秩为1的进程将数据发送到所有其他进程,并使用封装发送操作的单个for循环,并在
MPI\u send
调用中将for循环迭代器作为目标秩