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

标签 c++ c parallel-processing mpi openmpi

我正在尝试使用 OpenMPI 在多个工作人员之间传播数据,但是,我正在以一种相当自定义的方式进行数据划分,这种方式适合 MPI_ScatterMPI_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/

相关文章:

c++ - Xcode 静态库 - 路径异常

c++ - qvariant_cast<std::string> 返回空字符串

c - 串口终端

windows - 在 Windows 中安装 CUDA 8 和 CUDA 9

c++ - 如何正确声明通用排序算法?

c++ - 拉普拉斯算子没有给出所需的输出

c - 如何在c中通过替换另一个字符串来返回一个字符串

c - 将 (void*) 转换为 (int*) 时出现段错误

c++ - C++ 11 中的锁是否保证访问数据的新鲜度?

python - 替代 python 脚本中的 mpirun