这个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#include #include /* 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(); }
antonio.. 5
因为您只将数据发送到rank == 0
带有进程的进程rank == 1
.这就是为什么它适用于2个进程(0和1).对于更多进程,具有等级2,3,4,5 ....的进程将进入该else
块并等待未发送的数据.这就是为什么他们停止执行(等待永远不会发送的数据).您应该使用等级1的进程将数据发送到所有其他进程,使用单个for循环封装发送操作并将for循环迭代器作为MPI_Send
调用中的目标等级.
因为您只将数据发送到rank == 0
带有进程的进程rank == 1
.这就是为什么它适用于2个进程(0和1).对于更多进程,具有等级2,3,4,5 ....的进程将进入该else
块并等待未发送的数据.这就是为什么他们停止执行(等待永远不会发送的数据).您应该使用等级1的进程将数据发送到所有其他进程,使用单个for循环封装发送操作并将for循环迭代器作为MPI_Send
调用中的目标等级.