sockets - MPI消息可用性通知

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

最佳答案

这样的机制不是以便携式方式直接可用的。

您可以使用带有MPI_Wait(或其 flavor )的线程-或更简单地使用MPI_Recv。但是,不能保证您的MPI实现在等待消息时不会消耗CPU。 (尽管可以保证通过MPI_Iprobe进行轮询确实会消耗100%的CPU。)另外,对于MPI和线程也要小心,存在陷阱和不同的操作模式。

您为什么首先要这样做?对于您的工作,可能会有更好的机制,例如使用单面沟通。

关于sockets - MPI消息可用性通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15122875/

相关文章:

sockets - 为什么 FreeBSD 获取 TCP 套接字选项需要锁定写锁?

java - 字节还是整数?哪一个通过套接字发送速度更快?

python - Ipython 并行和多核进程

python - numba - guvectorize 比 jit 快一点

Golang 捕捉信号

c++ - 为什么我的 linux 信号处理程序只运行一次

javascript - Node.js - Socket.io 只能通过 localhost 访问

c - 在linux中的同一个套接字上接收来自不同组的多播数据

objective-c - Obj-C设计模式: parallel task launcher

perl - 我如何在 Perl 中捕获和处理信号?