我正在构建一个简单的应用程序,它在三次迭代中构建一个逻辑循环,然后打印结果。首先,我使用阻塞Send和Recv,从进程0开始,我使用Send和Recv,直到最后的n-1进程,发送到进程0.在进程0中,我在main中有这个代码:
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是实际进程的数量)收到并发送到排名+ 1 ......仍然我没有得到它...谢谢你想法。
答案 0 :(得分:3)
MPI_Send
可以选择等待接收方拨打MPI_Recv
。因此,如果您的所有流程都是通过调用MPI_Send
开始的,那么所有流程都会挂起。请尝试使用MPI_Isend
,然后检查是否已使用MPI_Waitall
收到每封邮件。
编辑:我不知道我是如何设法忽略第一个if
块中存在循环的事实...... *尴尬*。我想我过分关注MPI部分。尝试运行代码而不用循环(但循环体仍然存在);然后它应该按预期工作(例如,n = 3个过程):
现在,再次重新插入循环。完全相同的事情将发生,除了过程0将在步骤4之后继续并将发送到进程1,已退出。尝试将循环插入else if
和else
块,或者从if
块中删除循环并将整个if / else if / else
包裹在循环中。