是否有一种方法可以通知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选项。
答案 0 :(得分:0)
这种机制不能以便携方式直接获得。
您可以使用MPI_Wait
(或其风格)的线程 - 或者更简单地使用MPI_Recv
。但是,无法保证您的MPI实现在等待消息时不会消耗CPU。 (虽然可以保证轮询MPI_Iprobe
确实会占用100%的CPU。)另外要注意MPI和线程,还有陷阱和不同的操作模式。
你为什么要首先这样做?您可以采用更好的机制,例如使用单面沟通。