使用MPI_Barrier()在迭代步骤之间同步数据是否是个好主意。请参阅下面的伪代码。
While(numberIterations< MaxIterations)
{
MPI_Iprobe() -- check for incoming data
while(flagprobe !=0)
{
MPI_Recv() -- receive data
MPI_Iprobe() -- loop if more data
}
updateData() -- update myData
for(i=0;i<N;i++) MPI_Bsend_init(request[i]) -- setup request
for(i=0;i<N;i++) MPI_Start(request[i]) -- send data to all other N processors
if(numberIterations = MaxIterations/2)
MPI_Barrier() -- wait for all processors -- CAN I DO THIS
numberIterations ++
}
答案 0 :(得分:0)
只有在程序的正确性取决于它的情况下才应使用障碍。从您的伪代码中,我无法判断是否是这种情况,但是循环中途的一个障碍看起来非常可疑。
答案 1 :(得分:0)
无论是否有障碍,您的代码都会陷入僵局。您在发送任何数据之前会在每个级别中收到,因此所有级别都不会进入发送呼叫。大多数应用程序在每次迭代后都会调用MPI_Allreduce
而不是屏障,因此所有排名都可以决定错误级别是否足够小,任务队列是否为空等等,从而决定是否终止。
答案 2 :(得分:0)
在本文http://static.msi.umn.edu/rreports/2008/87.pdf中,它表示您必须在MPI_Free_request()
之前致电MPI_Bsend_init()
。