MPI消息可用性通知

时间:2013-02-27 21:34:41

标签: sockets parallel-processing signals ipc mpi

是否有一种方法可以通知MPI特定进程的消息可用性? Currenlty我使用异步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选项。

1 个答案:

答案 0 :(得分:0)

这种机制不能以便携方式直接获得。

您可以使用MPI_Wait(或其风格)的线程 - 或者更简单地使用MPI_Recv。但是,无法保证您的MPI实现在等待消息时不会消耗CPU。 (虽然可以保证轮询MPI_Iprobe确实会占用100%的CPU。)另外要注意MPI和线程,还有陷阱和不同的操作模式。

你为什么要首先这样做?您可以采用更好的机制,例如使用单面沟通。