在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选项。
最佳答案
这样的机制不是以便携式方式直接可用的。
您可以使用带有MPI_Wait
(或其 flavor )的线程-或更简单地使用MPI_Recv
。但是,不能保证您的MPI实现在等待消息时不会消耗CPU。 (尽管可以保证通过MPI_Iprobe
进行轮询确实会消耗100%的CPU。)另外,对于MPI和线程也要小心,存在陷阱和不同的操作模式。
您为什么首先要这样做?对于您的工作,可能会有更好的机制,例如使用单面沟通。
关于sockets - MPI消息可用性通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15122875/