通过OpenMPI进行非阻塞数据共享

我正在尝试使用OpenMPI在多个工作人员之间传播数据,但是,我正在以相当自定义的方式进行数据划分,这种方式不适用于MPI_ScatterMPI_Broadcast 。 我想要做的是给每个处理器一些工作在一个队列(或其他一些异步机制),这样他们可以在第一块数据上做他们的工作,采取下一个块,重复直到不再有块。

我知道MPI_Isend ,但是如果我用MPI_Isend发送数据,我不能修改它直到它完成发送; 强迫我使用MPI_Wait ,因此必须等到线程完成接收数据!

是否有解决此问题的标准解决方案,还是我必须重新考虑我的方法?

使用MPI_ISEND并不一定意味着在远程端收到消息。 它只是意味着缓冲区可以重用。 可能是消息已由Open MPI在内部缓冲,或者消息实际上已在另一端收到。 这取决于您的邮件大小。

另一种选择是让您的工作人员在需要时让主过程进行工作,而不是将其推送给他们。 然后主人只能根据需要工作。 您可以为第一条消息执行MPI_SCATTER ,因为每个人都将收到一些数据。 然后,让主服务器执行MPI_RECV(MPI_ANY_SOURCE)以从其中一个工作进程获取消息。