
NVIDIA DOCA GPUNetIO是 NVIDIA DOCA SDK 中的一個庫,專門為實時內聯 GPU 數據包處理而設計。它結合了GPUDirect RDMA和GPUDirect Async等技術,能夠創建以 GPU 為中心的應用程序,其中 CUDA 內核可以直接與網絡接口卡(NIC)通信,用于發送和接收數據包,繞過 CPU 并將其排除在關鍵路徑之外。
DOCA GPUNetIO 的核心原理和用途已在前幾篇文章《Inline GPU Packet Processing with NVIDIA DOCA GPUNetIO》和《Realizing the Power of Real-Time Network Processing with NVIDIA DOCA GPUNetIO》以及DOCA GPUNetIO 編程指南中進行了討論。
此前,DOCA GPUNetIO與DOCA Ethernet和DOCA Flow一起,僅限于處理以太網傳輸層上的數據包傳輸。隨著 DOCA 2.7 的推出,現在有一組擴展的 API使 DOCA GPUNetIO 能夠直接從 GPU CUDA 內核使用 RoCE 或 InfiniBand 傳輸層支持 RDMA 通信。
RDMA 首字母縮寫描述了一種協議,該協議允許從一臺計算機的存儲器到另一臺計算機存儲器的遠程直接存儲器訪問,而不涉及任何一臺計算機中的操作系統。操作示例包括 RDMA 寫入和 RDMA 讀取。不能將其與GPUDirect RDMA混淆,后者與 RDMA 協議無關。GPUDirect RDMA 是 NVIDIA 在 GPUDirect 技術家族中啟用的技術之一,使網卡能夠繞過 CPU 內存副本和操作系統例程,直接發送或接收訪問 GPU 內存的數據。GPUDirect RDMA 可以由任何使用以太網、InfiniBand 或 RoCE 的網絡框架啟用。
具有 GPUNetIO 的 RDMA GPU 數據路徑
RDMA 提供了在兩個主機的主內存之間的直接訪問,而不涉及操作系統、緩存或存儲。這使得數據傳輸具有高吞吐量、低延遲和低 CPU 利用率。這是通過注冊并共享本地內存區域,以便遠程主機知道如何訪問它。
兩個對等方需要通過 RDMA 交換數據的應用程序通常遵循三個基本步驟:
步驟 1–本地配置:每個對等端在本地創建 RDMA 隊列和內存緩沖區,以便與其他對等端共享這些資源。
步驟 2–交換信息: 使用帶外(OOB)機制(例如,Linux 套接字),對等端交換有關 RDMA 隊列和要遠程訪問的內存緩沖區的信息。
步驟 3–數據路徑:兩個對等方使用遠程內存地址執行 RDMA 讀、寫、發送和接收,以交換數據。
DOCA RDMA 庫按照上面列出的三個步驟通過 InfiniBand 或 RoCE 實現 RDMA 通信,所有這些步驟都是用 CPU 執行的。隨著新GPUNetIO RDMA功能的引入,應用程序可以在 GPU 上執行步驟 3,使用 CUDA 內核管理 RDMA 應用程序的數據路徑,而步驟 1 和 2 保持不變,因為它們與 GPU 數據路徑無關。
將 RDMA 數據路徑移動到 GPU 上的好處與以太網用例中的好處相同。在數據處理發生在 GPU 上的網絡應用程序中,將網絡通信從 CPU 卸載到 GPU,使其能夠成為應用程序的主控制器,消除與 CPU 交互所需的額外延遲,知道數據何時準備就緒以及數據位于何處,這也釋放了 CPU 周期。此外,GPU 可以同時并行管理多個 RDMA 隊列,例如,每個 CUDA 塊可以在不同的 RDMA 隊列上發布 RDMA 操作。
IB Verbs 和 DOCA GPUNetIO 性能測試
在 DOCA 2.7 中,引入了一個新的 DOCA GPUNetIO RDMA 客戶機-服務器代碼示例,以顯示新 API 的使用情況并評估其正確性。這篇文章分析了 GPUNetIO RDMA 函數與 IB Verbs RDMA 函數之間的性能比較,重現了眾所周知的 perftest 套件中的一個微基準。
簡而言之,perftest 是一組微基準點,用于使用基本的 RDMA 操作測量 RDMA 帶寬(BW)和兩個對等點(服務器和客戶端)之間的延遲盡管網絡控制部分發生在 CPU 中,但可以通過啟用 GPUDirect RDMA 并指定--use_cuda標志來指定數據是否駐留在 GPU 內存中。

一般來說,RDMA 寫單向 BW 基準測試(即 ib_write_bw)在每個 RDMA 隊列上發布一個針對相同大小消息的寫請求列表,用于固定迭代次數,并命令 NIC 執行發布的寫操作,這就是所謂的“按門鈴”程序。為了確保所有寫入都已發出,在進入下一次迭代之前,它輪詢完成隊列,等待每個寫入都已正確執行的確認。然后,對于每個消息大小,可以檢索發布和輪詢所花費的總時間,并以 MB/s 為單位計算 BW。
Ib_write_bw性能測試主循環迭代中,CPU 發布一個 RDMA 寫入請求列表,命令 NIC 執行這些請求,然后等待完成后移動到下一次迭代。啟用 CUDA 標志后,要寫入的數據包將從 GPU 內存本地獲取,而不是從 CPU 內存。
實驗是用 DOCA 庫復制ib_write_bw微基準標記,使用 DOCA RDMA 作為 CPU 上的控制路徑以建立客戶端-服務器連接,并使用 DOCA GPUNetIO RDMA 作為數據路徑,在 CUDA 內核內發布寫入。這種比較并不完全一致,因為 perftest 使用 GPUDirect RDMA 來傳輸數據,但網絡通信由 CPU 控制,而 DOCA GPUNetIO 同時使用 GPUDirect RDMA 和 GPUDirect Async 來控制網絡通信和來自 GPU 的數據傳輸。目標是證明 DOCA GPUNetIO RDMA 性能與 IB Verbs 性能測試相當,后者被視為基線。
為了重現ib_write_bw數據路徑并測量針對每個消息大小發布 RDMA 寫入操作所花費的時間,CPU 記錄一個 CUDA 事件,啟動rdma_write_bw CUDA 內核,然后記錄第二個 CUDA 事件。這應該可以很好地近似 CUDA 內核使用 DOCA GPUNetIO 函數發布 RDMA 寫入所用的時間(以毫秒為單位)。在每次迭代時,GPU CUDA 內核并行發布一個 RDMA 寫入請求列表,每個 CUDA 塊中的 CUDA 線程一個。在同步所有 CUDA 線程后,只有線程 0 命令 NIC 執行寫入并等待完成,然后刷新隊列,最后再進行下一次迭代。
