2012-02-27 282 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