MPI - 跨进程共享队列

标签 mpi message-queue shared-memory distributed-computing

我有一个 MPI 程序,其中主节点会等待从属节点完成一定数量的任务(例如 1000 个)。从节点处于 while(True) 循环中,并继续从其任务中生成输出。这些任务的运行时间可能因任务和节点而异,因此,如果有 2 个从节点,并且主节点需要等待 1000 个任务,那么从节点 1 可能已完成 450 个任务,从节点 2 可能完成其他 550 个任务.

从节点“告诉”主节点总共 1000 个任务已完成的最佳方式是什么?在我看来,我需要某种跨进程的共享队列,其中从站可以在任务完成后推送数据,而主站只是轮询该队列的大小,直到达到 1000。随后,主站可以从该队列中排出数据重置从设备的队列大小以填充更多数据。

最佳答案

我推荐两种解决方案。

Gilles 指出的第一个方法是使用 MPI_ANY_SOURCE 接收 1000 条可以从任何工作人员发送的完成消息。

第二种是使用MPI_ACCUMULATE。在这种情况下,主节点共享一个初始化为 0 的窗口,然后每个工作节点在每个任务完成后使用 MPI_ACCUMULATE 来递增窗口中的值。主设备轮询它自己的本地窗口,直到达到 1000。

在这种情况下,我会坚持使用 MPI_ANY_SOURCE 而不是困惑地创建和销毁窗口。我认为没有令人信服的理由在这里增加这种复杂性。

关于MPI - 跨进程共享队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59887612/

相关文章:

c++ - 在 for 循环中处理复杂的 send recv 消息

c# - 将 EasyNetQ 用于 RabbitMQ 时自定义错误队列名称?

amazon-web-services - 在发送到 SNS 之前,我可以使用 Amazon SQS 作为延迟队列吗?

rabbitmq - 消息代理 - .NET Core 中的多供应商架构

c++ - 用户态和内核态共享内存

c++ - OpenMP 超额订阅会导致内存错误吗?

c - Open MPI 中的屏障调用卡住(C 程序)

c++ - 当 RDMA 在映射区域上运行时会发生什么?

c - MPI_Recv 和超时

c - 在 Solaris 中的父进程和子进程之间共享内存(在 C 中)