我正在构建一个简单的应用程序,它在三次迭代中构建一个逻辑圆,然后打印结果。首先,我正在使用来自进程0的阻塞Send和Recv,我使用Send和Recv,直到最终的n-1进程,该进程发送到进程0.在进程0中,我使用主代码:MPI - 进程的逻辑圆
int i;
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD,&numtasks);
MPI_Comm_rank(MPI_COMM_WORLD;&myrank);
if(myrank==0){
for(i=0;i<3;i++){
MPI_Send(msg,MPI_CHAR,myrank+1,99,MPI_COMM_WORLD);
MPI_Recv(msg,100,MPI_CHAR, numtasks-1,99,MPI_COMM_WORLD,&status);
printf("hello");
}
}
else if(myrank==(numtasks-1)){
MPI_Recv(msg,100,MPI_CHAR,numtasks-2,99,MPI_COMM_WORLD,&status);
MPI_Send(msg,100,MPI_CHAR,0,99,MPI_COMM_WORLD);
}
else{
MPI_Recv(msg,100,MPI_CHAR,myrank-1,99,MPI_COMM_WORLD,&status);
MPI_Send(msg,100,MPI_CHAR,myrank+1,99,MPI_COMM_WORLD);
}
我现在想得到3个结果,我是对的?但我仍然只有一个。其余的代码很简单,对于0以外的进程,他们从myrank-1(myrank是实际进程的数量)接收并发送给rank + 1 ...仍然我不明白...感谢您的想法。
+1击败我。 (我修改了你如何阻止的回复。) – chrisaycock
@chrisaycock:啊; 'MPI_Waitall'似乎很熟悉。 :-) +1。 –
只有第一个进程以MPI_Send开始,其他进程则以MPI_Recv开始,然后继续执行MPI_Send。它对我来说很奇怪,它只会做一次,然后什么都不做,即使它会一直做3次... – Waypoint