2

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 选项。

4

1 回答 1

0

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

您可以使用带有MPI_Wait(或其风味)的线程 - 甚至更简单MPI_Recv。但是,不能保证您的 MPI 实现在等待消息时不会消耗 CPU。(虽然可以保证轮询MPI_Iprobe确实会消耗 100% 的 CPU。)还要小心 MPI 和线程,存在缺陷和不同的操作模式。

你为什么要首先这样做?您所做的事情可能有更好的机制,例如使用单方面的沟通。

于 2013-02-27T21:48:43.703 回答