我有几台由Infiniband网络连接的多核计算机.我希望在共享内存池上进行一些低延迟的计算,并使用远程原子操作。我知道RDMA是最好的选择。在每个节点上,我将为数据共享注册一个内存区域(和保护域)。
在线RDMA示例通常集中在单线程服务器和单线程客户端之间的单个连接上。现在,我希望在每个Infiniband节点上都有一个多线程进程。我很困惑于以下几点..。
谢谢你的善意建议。
发布于 2012-02-27 19:16:37
至少在Linux上,InfiniBand谓词库是完全线程安全的。因此,您可以在多线程应用程序中使用任意数量或尽可能少的队列对(QPs) --多个线程可以安全地将工作请求发送到单个QP,当然,您必须确保在自己的应用程序中对未决请求的任何跟踪都是线程安全的。
确实,每个发送队列和每个接收队列(请记住,QP实际上是一对队列:)被附加到单个完成队列(CQ)。因此,如果希望每个线程都有自己的CQ,那么每个线程都需要自己的QP来提交工作。
一般来说,QPs和CQs并不是真正有限的资源--在一个节点上可以轻松地拥有数百个或数千个节点。这样你就可以设计你的应用程序,而不用担心你使用的队列的绝对数量。这并不是说您不必担心可伸缩性--例如,如果每个队列有很多接收队列和大量缓冲区,那么您可能会在接收缓冲区中占用太多内存,因此您最终需要使用共享接收队列(SRQ)。
有许多使用IB的中间件库;可能MPI (如http://open-mpi.org/)是最著名的中间件库,在您进行太大的创新之前,这一点可能是值得评估的。MPI开发人员还发表了大量关于高效使用IB/RDMA的研究报告,如果您确实决定构建自己的系统,这可能是值得研究的。
https://stackoverflow.com/questions/9470512
复制相似问题