"Deadlock"与MPI_Waitall
"Deadlock" with MPI_Waitall
我试图从每个进程发送一些数据到它的邻居(按排名)。要做到这一点,我试图使用非阻塞发送和接收呼叫MPI_Isend
/MPI_Irecv
和对MPI_Waitall
的相应呼叫,以确保在使用数据之前发生传输。
下面是我想做的一个最小的例子
#include <mpi.h>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
MPI_Init(&argc,&argv);
int rank,comm_size;
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&comm_size);
MPI_Request reqs[4];
int sbuff1[10];
int sbuff2[10];
int rbuff1[10];
int rbuff2[10];
int count = 0;
if(rank>0)
{
MPI_Irecv(rbuff1,10,MPI_INT,rank-1,0,MPI_COMM_WORLD,&reqs[count]);
count++;
MPI_Isend(sbuff1,10,MPI_INT,rank-1,1,MPI_COMM_WORLD,&reqs[count]);
count++;
}
if(rank<comm_size-1)
{
MPI_Irecv(rbuff2,10,MPI_INT,rank+1,2,MPI_COMM_WORLD,&reqs[count]);
count++;
MPI_Isend(sbuff2,10,MPI_INT,rank+1,3,MPI_COMM_WORLD,&reqs[count]);
count++;
}
MPI_Waitall(count,reqs,MPI_STATUS_IGNORE);
if(rank==0)
cout << "Successfully exchanged data." << endl;
MPI_Finalize();
return 0;
}
不幸的是,这段代码从来没有成功打印出最后的消息。
我的问题是:数据是否正确发送,但我对MPI_Waitall
的调用是错误的?如果是这样,我需要做什么改变,使这个简单的代码运行,如果不是什么是错误的?
您设置的发送/接收标签不匹配。
#include <mpi.h>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
MPI_Init(&argc,&argv);
int rank,comm_size;
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&comm_size);
MPI_Request reqs[4];
int sbuff1[10];
int sbuff2[10];
int rbuff1[10];
int rbuff2[10];
int count = 0;
if(rank>0)
{
MPI_Irecv(rbuff1,10,MPI_INT,rank-1,0,MPI_COMM_WORLD,&reqs[count]);
count++;
MPI_Isend(sbuff1,10,MPI_INT,rank-1,1,MPI_COMM_WORLD,&reqs[count]);
count++;
}
if(rank<comm_size-1)
{
/// changed tag 2 -> 1
// MPI_Irecv(rbuff2,10,MPI_INT,rank+1,2,MPI_COMM_WORLD,&reqs[count]);
MPI_Irecv(rbuff2,10,MPI_INT,rank+1,1,MPI_COMM_WORLD,&reqs[count]);
count++;
/// changed tag 3 -> 0
// MPI_Isend(sbuff2,10,MPI_INT,rank+1,3,MPI_COMM_WORLD,&reqs[count]);
MPI_Isend(sbuff2,10,MPI_INT,rank+1,0,MPI_COMM_WORLD,&reqs[count]);
count++;
}
MPI_Waitall(count,reqs,MPI_STATUS_IGNORE);
if(rank==0)
cout << "Successfully exchanged data." << endl;
MPI_Finalize();
return 0;
}
使它工作
$> mpirun -n 5 ./testling
Successfully exchanged data.
运行在x86_84 Linux与mpich2 v1.5 (Hydra)
相关文章:
- 是"deadlock"吗?如何在多线程中避免它?
- OpenCV OpenCL Thread Saftey - Deadlock (将 cv::Mat 更改为 UMat)
- 是否有一个术语来表示"single mutex deadlock"(具有非递归互斥锁的死锁类型情况)?
- IDirect3DDevice9 Release deadlock
- RPi2, OpenMAX, Deadlock
- Linux 3.0: futex-lock deadlock bug?
- WaitForSingleObject Deadlock
- std::thread.join() deadlock
- "Deadlock"与MPI_Waitall
- __syncthreads() Deadlock