我正在尝试使用 OpenMPI 在多个工作人员之间传播数据,但是,我正在以一种相当自定义的方式进行数据划分,这种方式不适合 MPI_Scatter
或 MPI_Broadcast
。我想做的是给每个处理器一些队列中的工作(或其他一些异步机制),这样他们就可以在第一个数据 block 上完成他们的工作,获取下一个 block ,重复直到没有更多 block 。
我知道 MPI_Isend
,但是如果我用 MPI_Isend
发送数据,在发送完成之前我不能修改它;迫使我使用 MPI_Wait
,因此无论如何都必须等到线程完成接收数据!
这个问题是否有标准的解决方案,或者我必须重新考虑我的方法?
最佳答案
使用 MPI_ISEND
并不一定意味着在远程端接收到消息。它只是意味着缓冲区可以重用。可能是消息已由 Open MPI 在内部缓冲,或者消息实际上已在另一端收到。这取决于您的邮件大小。
另一种选择是让您的工作人员在需要时向主流程请求工作,而不是将其推送给他们。然后主人可以只在需要的时候工作。您可以为第一条消息执行 MPI_SCATTER
,因为每个人都会收到一些数据。然后,让主进程执行 MPI_RECV(MPI_ANY_SOURCE)
以从其中一个工作进程获取消息。
关于c++ - 通过 OpenMPI 进行非阻塞数据共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18674540/