使用一个缓冲区在 MPI 中 send\receive 多个消息是否可以?
Is it OK to send\receive multiple messages in MPI using one single buffer?
我正在学习 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 中有一些垃圾值(以及一些好的值)。
任何点对点发送操作都可以使用与任何其他发送操作相同的缓冲区,因为它们不会修改缓冲区的内容。
在接收方,结果是不确定的,如果您不保证每个接收操作都有一个不与任何其他发送或接收所使用的缓冲区重叠的缓冲区,则可能会导致程序崩溃,从接收的时间发布到完成的时间。如果 gatheredIndices
.
中没有重叠,您使用 MPI_Irecv
的代码看起来没问题
我正在学习 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 中有一些垃圾值(以及一些好的值)。
任何点对点发送操作都可以使用与任何其他发送操作相同的缓冲区,因为它们不会修改缓冲区的内容。
在接收方,结果是不确定的,如果您不保证每个接收操作都有一个不与任何其他发送或接收所使用的缓冲区重叠的缓冲区,则可能会导致程序崩溃,从接收的时间发布到完成的时间。如果 gatheredIndices
.
MPI_Irecv
的代码看起来没问题