2012-02-27 221 views
8

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

在线RDMA示例通常关注单线程服务器和单线程客户端之间的单个连接。现在我想在每个Infiniband节点上都有一个多线程的进程。我对下面很是不解......

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

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

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

谢谢你的建议。

回答

8

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

确实,每个发送队列和每个接收队列(记住QP实际上是一对队列:)连接到单个完成队列(CQ)。所以如果你想让每个线程都有自己的CQ,那么每个线程都需要自己的QP来提交工作。

一般而言,QP和CQ不是真正的有限资源 - 您可以轻松地在单个节点上拥有数百或数千个节点,而且没有问题。所以你可以设计你的应用程序,而不用担心你使用的绝对队列数太多。这并不是说你不必担心可扩展性 - 例如,如果每个队列有很多接收队列和大量缓冲区,那么在接收缓冲区中可能会占用太多内存,所以最终会导致需要使用共享接收队列(SRQ)。

有一些使用IB的中间件库;可能MPI(例如http://open-mpi.org/)是最着名的一个,可能值得在评估之前对自己的事情进行重新设计。 MPI开发者还发布了大量关于高效使用IB/RDMA的研究,如果您决定构建自己的系统,这可能值得寻求。

+0

并且队列对(QP),完成队列(CQ)和共享接收队列(SRQ)的源代码必须自行编写,或者我可以准备好它们的实现(作为最佳实践)并且它们可以在哪里采取? – Alex 2013-09-01 22:31:38