Sockets MPI消息可用性通知

Sockets MPI消息可用性通知,sockets,parallel-processing,signals,ipc,mpi,Sockets,Parallel Processing,Signals,Ipc,Mpi,在MPI中是否有一种方法可以通知特定进程的消息可用性?目前,我使用异步MPI_Iprobe和MPI_Recv进行轮询。这意味着进程必须停止它正在做的事情,并时不时地调用此方法。是否有通过信号/中断通知消息可用性的方法?另一个选择是使用单独的线程进行轮询,但我不确定这是否可以接受,因为它会占用cpu时间 int poll(int& source,int& message_id) { int flag; MPI_Status mpi_status;

在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实现使用轮询

最好的解决方案似乎是使用阻塞MPI_Probe(),然后 mpirun-n2--mca在空闲时产生
这将使轮询线程阻塞,直到消息发送。但是一些mpi实现没有mca选项。

这种机制不能以可移植的方式直接使用

您可以使用带有
MPI\u Wait
(或其风格)的线程,或者更简单的
MPI\u Recv
。但是,不能保证您的MPI实现在等待消息时不会占用CPU。(虽然可以保证在
MPI_Iprobe
上进行轮询确实会消耗100%的CPU。)也要小心使用MPI和线程,但存在陷阱和不同的操作模式


你为什么要这么做?可能有一种更好的机制来指导你的工作,例如使用单边沟通。

你能描述一下你真正想做的事情吗?我相信可能会有更好的解决方案。多线程使用MPI需要提供
MPI\u THREAD\u MULTIPLE
THREAD支持级别的实现。如果进行了相应的编译,则Open MPI会提供此功能,但如果系统上有此功能,则无法使用本机InfiniBand通信。不幸的是,它是一种双边通信,具有不同类型的消息,并且没有特定的顺序发送。首先,我必须检查它是什么消息,然后分配适当的数据结构来接收它。然后你不能在信号处理程序中这样做,分配内存不是信号安全的。它是在堆栈上预先分配的,所以这不是问题。但是我需要知道它是什么类型的信息,然后才能收到它。大多数消息是MPI_整数类型的简单通知,而其他消息包含可变字节数。我试图解决的问题是集群上的树搜索。您可能想看看这篇文章:它讨论多线程应用程序如何接收大小未知的消息<代码>MProbe是在MPI 3.0汉克斯中实现的!那看起来是一篇好论文。他们提到,对于MPI 2.2,轮询方法(我现在使用的方法)或使用线程是唯一的选择。