我正在使用 MPI 非阻塞消息在 2 个任务之间进行通信。通信模式如下:每个任务都有一个从其他任务接收消息的主线程。它有 5 个左右的工作线程来进行计算并向其他任务发送消息。主线程循环,测试传入消息。这是它唯一做的事情。
我的问题是,虽然任务 0 瞬间接收到任务 1 发送的所有信息(发送和接收的消息数量大致匹配),但任务 1 只接收到任务 0 发送的消息的大约 1/4。运行一分钟后,有数百个数以千计的未完成消息。
使用 PAPI,我确定任务 1 似乎阻止了测试和 irecv。指令吞吐量仅为 0.03 instr/cycle,而其他任务则 > 0.2,并且在调试器中停止任务表明它正在尝试获取锁。但是,阻塞的接收和测试不是针对“丢失”消息的,而是针对另一类更罕见的消息。
我意识到如果不实际尝试代码,很难说出可能导致这种情况的原因,但我发现 MPI 性能存在如此不对称令人费解。跟不上接收的任务并不是因为缺乏尝试,它实际上是把所有的时间都花在测试传入的消息上。
我正在使用带有 MPI_THREAD_MULTIPLE 的 OpenMPI 1.5.3,并且通信是通过 sm 进行的(这两个任务在同一个节点上)。
任何如何追踪这一点的想法将不胜感激。