11

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

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

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

  2. 我应该在每个节点上准备多少个完成队列?我将有多个线程在每个节点上发出远程读/写/cas 操作。如果他们要共享一个共同的完成队列,完成事件将被混淆。如果线程有自己独立的完成队列,那么它们真的很多。

  3. 您是否建议我拥有任何现有的库而不是编写此软件?(嗯,或者我应该写一个并开源它?:-)

感谢您的善意建议。

4

1 回答 1

9

至少在 Linux 上,InfiniBand 动词库是完全线程安全的。因此,您可以根据需要在多线程应用程序中使用尽可能多或尽可能少的队列对 (QP) - 多个线程可以安全地将工作请求发布到单个 QP,当然您必须确保任何未完成的跟踪您在自己的应用程序中执行的请求等是线程安全的。

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

一般来说,QP 和 CQ 并不是真正有限的资源——您可以轻松地在单个节点上拥有数百或数千个资源,而不会遇到麻烦。因此,您可以设计您的应用程序,而不必过多担心您正在使用的队列的绝对数量。这并不是说您不必担心可伸缩性 - 例如,如果您有很多接收队列并且每个队列有很多缓冲区,那么您可能会在接收缓冲中占用太多内存,因此您最终会需要使用共享接收队列 (SRQ)。

有许多使用 IB 的中间件库;可能 MPI(例如http://open-mpi.org/)是最有名的一个,在你过分重新发明事物之前,可能值得评估一下。MPI 开发人员还发布了大量关于有效使用 IB/RDMA 的研究,如果您决定构建自己的系统,可能值得一试。

于 2012-02-27T19:16:37.457 回答