InfiniBand:传输速率取决于 MPI_Test* 频率
Posted
技术标签:
【中文标题】InfiniBand:传输速率取决于 MPI_Test* 频率【英文标题】:InfiniBand: transfer rate depends on MPI_Test* frequency 【发布时间】:2014-03-29 03:14:50 【问题描述】:我正在编写一个多线程 OpenMPI 应用程序,使用来自多个线程的 MPI_Isend 和 MPI_Irecv 在 InfiniBand RDMA 上的列之间每秒交换数百条消息。
传输大约为 400 - 800KByte,每个 rank 产生大约 9 Gbps 的输入和输出,完全在 FDR 的容量范围内。简单的 MPI 基准测试也显示出良好的性能。
通过在专用线程中使用 MPI_Testsome 轮询所有活动传输来检查传输是否完成。
我实现的传输速率取决于消息速率,但更重要的是还取决于 MPI_Testsome 的轮询频率。也就是说,如果我每 10 毫秒轮询一次,则请求完成的时间比我每 1 毫秒轮询一次的时间要晚。
我希望如果我每 10 毫秒而不是每 1 毫秒轮询一次,我最多会在 9 毫秒后收到完成请求的通知。我不希望传输本身会通过减少对 MPI_Testsome 的调用来延迟完成,从而减慢总传输速率。我希望 MPI_Testsome 完全是被动的。
这里有人知道为什么会发生这种行为吗?
【问题讨论】:
【参考方案1】:观察到的行为是由于在 Open MPI 中实现操作进程的方式所致。发布发送或接收,无论是同步还是异步完成,都会导致一系列内部操作排队。进展基本上是那些排队操作的处理。您可以在库构建时选择两种模式:一种使用异步进程线程,另一种没有,后者是默认模式。
当库在启用异步进程线程的情况下编译时,后台线程会负责并处理队列。这允许后台传输与用户代码并行开始,但会增加延迟。如果没有异步进程,操作会更快,但进程只能在用户代码调用 MPI 库时发生,例如而在MPI_Wait
或MPI_Test
和家人。 MPI_Test
系列函数的实现方式是尽可能快地返回。这意味着库必须在调用中做一些事情之间进行权衡,从而减慢它的速度,或者快速返回,这意味着每次调用中进行的操作更少。
一些 Open MPI 开发人员,尤其是 Jeff Squyres,不时访问 Stack Overflow。他可能会提供更多细节。
这种行为几乎不是 Open MPI 特有的。除非有大量硬件辅助,否则 MPI 通常按照相同的方法实现。
【讨论】:
谢谢!我没有意识到异步进程不是默认设置。我确实有一个'btl_openib_async_event_thread'正在运行(根据gdb)。 'btl_openib_use_async_event_thread' 选项也被设置。我将从重建 OpenMPI 开始,看看我是否可以更精细地控制这方面。openib
异步线程不是我提到的异步进程线程。它从 InfiniBand 完成队列中读取通知消息,可能会更新进程队列中未决事件的状态。以上是关于InfiniBand:传输速率取决于 MPI_Test* 频率的主要内容,如果未能解决你的问题,请参考以下文章
IPoIB 和 TCP over Infiniband 的区别