我有一些由Infiniband网络连接的多核计算机。我希望在共享内存池上进行一些低延迟计算,并进行远程原子操作。我知道RDMA是要走的路。在每个节点上,我将注册一个内存区域(和保护域)以进行数据共享。
在线RDMA示例通常关注单线程服务器和单线程客户端之间的单个连接。现在,我希望在每个Infiniband节点上都有一个多线程进程。我对以下内容感到非常困惑......
我应该在每个节点上准备多少个队列对,总共n个节点和m个线程的集群?更具体地说,同一节点上的多个线程可以共享同一个队列对吗?
我应该在每个节点上准备多少个完成队列?我将在每个节点上有多个线程发出远程读/写/ cas操作。如果他们要共享一个公共完成队列,则完成事件将被混淆。如果线程有自己独立的完成队列,那么它们确实会有很多。
您是否建议我使用现有的库而不是编写此软件? (嗯,或者我应该写一个并开源吗?: - )
感谢您的善意建议。
答案 0 :(得分:8)
至少在Linux上,InfiniBand动词库完全是线程安全的。因此,您可以根据需要在多线程应用程序中使用尽可能多的队列对(QP) - 多个线程可以安全地将工作请求发布到单个QP,但当然您必须确保对未完成的任何跟踪您在自己的应用程序中执行的请求等是线程安全的。
确实,每个发送队列和每个接收队列(记住QP实际上是一对队列:)都附加到单个完成队列(CQ)。因此,如果您希望每个线程都有自己的CQ,那么每个线程都需要自己的QP来提交工作。
通常,QP和CQ实际上并不是一种有限的资源 - 您可以轻松地在单个节点上拥有数百或数千个。因此,您可以设计您的应用程序,而无需过多担心您使用的队列的绝对数量。这并不是说您不必担心可伸缩性 - 例如,如果您有大量的接收队列和每个队列的大量缓冲区,那么您可能会在接收缓冲中占用太多内存,因此您最终会需要使用共享接收队列(SRQ)。
有许多中间件库使用IB;可能MPI(例如http://open-mpi.org/)是最着名的一个,在你彻底重新发明之前,可能值得评估。 MPI开发人员还发布了大量关于有效使用IB / RDMA的研究,如果您决定构建自己的系统,可能值得一试。