MPI 消息可用性通知
Posted
技术标签:
【中文标题】MPI 消息可用性通知【英文标题】:MPI message availability notification 【发布时间】:2013-02-27 21:34:40 【问题描述】:在 MPI 中是否有办法通知特定进程的消息可用性?目前,我使用异步 MPI_Iprobe 轮询,然后是 MPI_Recv 。这意味着进程必须停止它正在做的事情并时不时地调用这个方法。有没有办法通过信号/中断通知消息的可用性?另一种选择是使用单独的线程进行轮询,但我不确定这是否可以接受,因为它会消耗 cpu 时间。
int poll(int& source,int& message_id)
int flag;
MPI_Status mpi_status;
MPI_Iprobe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD,&flag,&mpi_status);
if(flag)
message_id = mpi_status.MPI_TAG;
source = mpi_status.MPI_SOURCE;
return true;
return false;
编辑:看起来 MPI 实现使用轮询 http://blogs.cisco.com/performance/polling-vs-blocking-message-passingprogress/
最好的解决方案似乎是使用阻塞 MPI_Probe() 然后 mpirun -n 2 --mca yield_when_idle 这将使轮询线程阻塞,直到发送消息。但是一些 mpi 实现没有 mca 选项。
【问题讨论】:
您能描述一下您真正想做的事情吗?我相信可能会有更好的解决方案。 MPI 的多线程使用需要提供MPI_THREAD_MULTIPLE
线程支持级别的实现。如果相应地编译,Open MPI 会提供它,但如果系统上可用,它不能使用本机 InfiniBand 通信。
【参考方案1】:
这种机制不能直接以可移植的方式使用。
您可以使用带有MPI_Wait
(或其风格)的线程,或者更简单的MPI_Recv
。但是,不能保证您的 MPI 实现在等待消息时不会消耗 CPU。 (虽然可以保证对MPI_Iprobe
进行轮询确实会消耗 100% 的 CPU。)还要小心 MPI 和线程,存在缺陷和不同的操作模式。
您为什么首先要这样做?对于您所做的事情,可能有更好的机制,例如使用单方面的沟通。
【讨论】:
不幸的是,这是一种双向通信,不同类型的消息以不特定的顺序发送。首先我必须检查它是什么消息,然后分配适当的数据结构来接收它。 那么你无论如何都不能在信号处理程序中这样做,分配内存不是信号安全的。 它是预先分配在堆栈上的,所以这不是问题。但是我需要在收到它之前知道它是什么类型的消息。大多数消息是 MPI_INTEGER 类型的简单通知,而其他消息包含可变数量的字节。我要解决的问题是在集群上进行树搜索。 您可能想看看这篇论文:unixer.de/publications/index.php?pub=103 它讨论了多线程应用程序如何接收未知大小的消息。MProbe
在 MPI 3.0 中实现
谢谢!这看起来是一篇好论文。他们提到对于 MPI 2.2,我现在使用的轮询方法或使用线程是唯一的选择。以上是关于MPI 消息可用性通知的主要内容,如果未能解决你的问题,请参考以下文章
zookeeper + LevelDB + ActiveMQ实现消息队列高可用
MPI (mpi4py) - 如果第一个 test() 返回 false,则 irecv() 和 test() 不会在循环中工作