我正在学习MPI,不知道是否可以使用同一个数组发送或接收多个消息。
每个处理器都需要向其他处理器发送其本地数据的不同部分(也需要接收其他处理器的数据)。
假设我有四个处理器。我使用以下代码:
MPI_Request sendReqs[4];
MPI_Status sendStats[4];
MPI_Request recReqs[4];
MPI_Status recStats[4];
// locData is an array of integers. I need to distribute chunks of it
// assume I have four processors
for( i = 0 ; i < 4; i++) {
send = locData + indices[2*i]; // location at buffer to start ith send
count = indices[2*i+1] - indices[2*i] + 1; // how many we send to i
MPI_Isend(send, count, MPI_INT, i, rank, MPI_COMM_WORLD, sendReqs[i] );
}
同样地,这个可以吗?
// gatheredData is where each processor stores data it gets form others
// assume I have four processors
for( i = 0 ; i < 4; i++) {
start = gatheredData + gatheredIndices[2*i];
count = gatheredIndices[2*i+1] - gatheredIndices[2*i] + 1;
MPI_Irecv(start, count, MPI_INT, i, i, MPI_COMM_WORLD, &recReqs[i]);
}
我结束这个通话,以确保每个人都得到了数据。
MPI_Waitall(4, sendReqs, sendStats);
MPI_Waitall(4, recReqs , recStats );
这行代码无法正常工作 - 处理器显示gatheredData内部包含一些垃圾值(以及一些正常的值)。
MPI_Alltoall
和MPI_Alltoallv
来代替。参见这里:http://www.mpich.org/static/docs/v3.1/www3/MPI_Alltoall.html 和 http://www.mpich.org/static/docs/v3.1/www3/MPI_Alltoallv.html - Patrick