RDMA内存共享

11

我有几台多核计算机通过Infiniband网络连接。 我想在共享内存池上进行一些低延迟计算,并具有远程原子操作。 我知道RDMA是可行的方法。在每个节点上,我将为数据共享注册内存区域(和保护域)。

在线RDMA示例通常关注单线程服务器和单线程客户端之间的单个连接。 现在,我想在每个Infiniband节点上运行一个多线程进程。 我对以下内容非常困惑...

  1. 对于n个节点和m个总线程的群集,我应该在每个节点上准备多少队列对? 具体地说,同一节点上的多个线程是否可以共享同一队列对?

  2. 在每个节点上,我应该准备多少完成队列? 我将在每个节点上发出多个线程的远程读/写/比较并交换操作。 如果它们共享一个公共完成队列,则完成事件将混杂在一起。 如果线程有自己的分离完成队列,那么会真正有很多。

  3. 您建议我使用现有库而不是编写此软件吗? (嗯,还是我应该编写一个并开源吗?:-)

谢谢您的建议。

1个回答

11

在Linux上,InfiniBand verbs库完全支持多线程。因此,在多线程应用程序中,您可以使用任意数量的队列对(QP)--多个线程可以安全地向单个QP提交工作请求,尽管您必须确保您自己应用程序中跟踪未完成请求等事项是线程安全的。

每个发送队列和每个接收队列(请记住,QP实际上是一对队列 :))都连接到单个完成队列(CQ)。因此,如果您希望每个线程拥有自己的CQ,则每个线程都需要其自己的QP来提交工作。

总体来说,QP和CQ并不是真正的有限资源--您可以在单个节点上轻松拥有数百或数千个而无需担心。因此,您可以设计您的应用程序而不必过于担心您正在使用的队列的绝对数量。这并不是说您不必担心可扩展性--例如,如果您有大量接收队列和每个队列有大量缓冲区,则可能会在接收缓冲区中占用太多内存,因此最终需要使用共享接收队列(SRQ)。

有许多中间件库使用IB; Open MPI(例如http://open-mpi.org/)可能是最著名的一个,值得在您开始重新发明东西之前进行评估。MPI开发人员还发布了大量关于高效使用IB / RDMA的研究,这些研究可能值得寻找,以防您决定构建自己的系统。


队列对(QPs)、完成队列(CQ)和共享接收队列(SRQs)的源代码必须自己编写,还是可以获取它们的实现准备好(作为最佳实践),并且它们可以从哪里获取? - Alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接