【发布时间】:2017-10-14 16:47:38
【问题描述】:
我一直在使用 MPI_Scatter / MPI_Gather 进行各种并行计算。我注意到的一件事是,经常调用 MPI_Barrier() 来同步处理器,类似于 OpenMP 屏障指令。我正在为一个项目调整我的代码并在下面注释掉我的 MPI_Barrier() 行,发现计算仍然正确。为什么会这样?我可以理解为什么需要第一个 MPI_Barrier() - 其他处理器不需要等待;一旦他们从处理器 MASTER 获得数据,他们就可以开始计算。但是在 MPI_Gather 之后是否需要 MPI_Barrier,或者 MPI_Gather 内部是否已经有隐式屏障?
编辑:在这种情况下,正在处理的数据大小是否重要?
MPI_Scatter(&sendingbuffer,sendingcount,MPI_FLOAT,receivingbuffer,sendcount,
MPI_INT,MASTER_ID,MPI_COMM_WORLD);
// PERFORM SOME COMPUTATIONS
MPI_Barrier(); //<--- I understand why this is needed
MPI_Gather(localdata,sendcount, MPI_INT, global,sendcount, MPI_INT, MASTER_ID, MPI_COMM_WORLD);
//MPI_Barrier(); <------ is this ever needed?
【问题讨论】:
-
另外,MPI 的缓冲功能将为您做一些默认的安全工作。您的“发送者”会将您的数据发送到“接收者”系统缓冲区。然后在“接收器”内部,它将您的数据从系统缓冲区传输到应用程序缓冲区。因此,对于少量数据,您可以假设您的程序是安全的。
-
关于您的编辑:不,在这种情况下,数据大小不会影响正确性。
标签: c synchronization mpi distributed-computing