我正在学习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 );
这不起作用 - 处理器显示它们在gatherData内部有一些垃圾值(以及一些好的值)。
答案 0 :(得分:2)
任何点对点发送操作都可以使用与任何其他发送相同的缓冲区,因为它们不会修改缓冲区的内容。
在接收方,结果未定义,如果您不保证每个接收操作都有一个与任何其他发送或接收所使用的缓冲区不重叠的缓冲区,则可能导致程序崩溃,从收到邮件到完成收到的时间。使用MPI_Irecv
的代码看起来不错,前提是gatheredIndices
没有重叠。