我正在编写一个多线程的OpenMPI应用程序,使用来自几个线程的MPI_Isend和MPI_Irecv在InfiniBand RDMA上的排名之间每秒交换数百条消息。
传输大小为400-800K字节,为每个排名生成约9 Gbps的流出和流入数据,远远低于FDR的容量。简单的MPI基准测试也显示出良好的性能。
使用MPI_Testsome在专用线程中轮询所有活动传输,以检查传输是否完成。
我所实现的传输速率取决于消息速率,但更重要的是MPI_Testsome的轮询频率。也就是说,如果我以10毫秒的频率轮询,请求完成的时间比我每1毫秒轮询要晚。
我希望,即使我以10毫秒的频率轮询而不是每1毫秒轮询,我也最多只能在9毫秒内被通知传输已完成。我不希望传输本身通过减少MPI_Testsome的调用延迟完成,并因此降低总体传输速率。我期望MPI_Testsome完全是被动的。
有人知道为什么会出现这种行为吗?
openib
异步线程不是我提到的异步进度线程。它从InfiniBand完成队列中读取通知消息,可能会更新挂起事件在进度队列中的状态。 - Hristo Iliev