---
# System prepended metadata

title: 平行程式 NTHU-PP-Chap13-UCX-Part3
tags: [平行程式]

---

教材:10710周志遠教授平行程式
https://www.youtube.com/playlist?list=PLS0SUwlYe8cxqw70UHOE5n4Lm-mXFXbZT

20250923 筆記
內容可能有錯僅供參考

這部分是 2023 新的 UCX 章節


[NTHU-PP-Chap13-UCX-Part3](https://www.youtube.com/watch?v=qQ1kUavHxbQ&list=PLQTDfc8kgjhMKtgumyK0gmEelnTtqJGsp&index=32&t=2s)

今日大綱
1.UCP 架構與層次
2.UCP API 使用流程與連線建立
3.UCP 溝通類型 
4.HPCX 和 UCC 介紹
5.SHARP 介紹



### UCP 架構與層次 

UCP 描述了其 programming 的方式，它具有層次結構：

1.  **Context**:
    *   通常對應到一個 **process 或 application**。
    *   一個 process 一般只會呼叫一次 UCP Init 來建立 context。
    *   Context 負責檢查 API 的 capability。
    *   它會檢查 **network interface**，確認哪些 transport 方式是可用的。
    *   它會根據 configuration 決定之後 context 可以使用的 transport。
    *   它是被回傳的 token 或 handler。
2.  **Worker**:
    *   位於 Context 下一層。
    *   通常對應到一個 **thread**。
    *   負責實際的 transport communication 運作。
    *   Worker object 是特殊的 **memory object**，可以被傳輸到遠端 process 並仍可啟動。
    *   Worker 的實作必須能與所有底層 transport (transportation layer) 相容。
    *   一個 Worker 可以操作多個 Endpoint。
3.  **Endpoint**:
    *   位於 Worker 下一層。
    *   對應到 **Queue** 或是 **connection**。
    *   Endpoint 最終是透過它來與遠端另一個 process 或電腦進行溝通。
    *   一個 Endpoint 只能被一個 Worker 操縱。

UCX 的 UCP 實作會自動幫我們選擇 transport 方式與 transport 選項。

### UCP API 使用流程與連線建立 

UCP 在做 setup 或 initialization 時相對複雜，通常用於大資料傳輸或需要高傳輸效能的場景。

#### 1. 初始化 Context

*   透過呼叫 `UCP_Init` 函式來初始化 Context。
*   初始化過程涉及許多參數，建議參考 reference。
*   有分 **parameter** 和 **configuration** 兩關的設定。
*   初始化會回傳 **context handler**。
*   初始化實作的差異性（如用於 MPI 或 share memory）會影響所需參數。

#### 2. 建立 Worker
*   下一步是呼叫 `ucp_worker_create`。
*   它需要傳入 context。
*   在 Hello World 範例中，使用了單純的 **single mode** (single process/single thread)。
*   建立 Worker 後，需要呼叫 API 取得 **Worker address**。這個 address 非常重要，它是一個特殊的 memory address，與 transport 方式相關，但 Worker 的實作確保它能被任何 transport 看懂和使用。

#### 3. 建立 Endpoint (連線建立)
*   建立 Endpoint 的目的是建立 **connection**。
*   UCP 的連線建立需要 **out-of-band communication**。
*   在建立 Endpoint 之前，Client 端必須先取得 remote 端的 **peer address** (例如 IP 或 worker address)，這些資訊需要透過傳統方式（如 **TCP/IP socket programming**）先行傳輸。
*   Server 端會將其 Worker address 傳送到 Client 端。
*   Client 端拿到這個 address 後，才能呼叫 `ucp_ep_create`，將 peer address 作為參數傳入，以完成 connection 的建立。

#### 4. Worker Progress

*   由於 UCP 的溝通多為 **非同步**。
*   需要呼叫 **`UCP_Worker_Progress`** API。
*   這個 API 像是在做 **polling**，它會要求 Worker 檢查 connection queue 內的 request 狀態，看是否已完成或有進度 (progress)。
*   Hello World 範例中的 `UCP_Wait` 函式是 user program 自己實作的 **blocking code**，它透過迴圈不斷呼叫 `progress`，直到狀態為 complete。
*   傳輸完成後，相關的 request 資源 (像是 memory) 必須被 `release` 掉。

### UCP 溝通類型 

#### 兩側通訊 (Two-Sided Communication)

*   **Send 與 Receive**。
*   這類溝通通常使用 **tag matching**：Send 和 Receive 都有一個 `tag` 欄位，兩端的 tag 必須匹配才能成功接收。
*   UCP 提供的 Send 是 **non-blocking** 的。
*   Receive API 包含 `mask` 參數，用來加速 tag matching，減少延遲 (latency)。
*   非阻塞式呼叫會產生 **status handle/token**，用於追蹤傳輸結果。
*   相關輔助 API 包含 `Cancel` (取消傳輸)。

#### 單側通訊 (One-Sided Communication, One-sided)

單側通訊（例如 RDMA）特別適合高效能傳輸。One-sided communication 的重要特點是 **不涉及 remote 端的 CPU 運算** (offload)，而是由網卡處理。

#### 前置準備：Memory Management

*   One-sided 必須先有 **memory management** 準備。
*   **Memory Map**: 呼叫 `memory map` API 來 reserve 一塊 memory region。此 region 屬於 context。
*   **Key Creation**: 之後必須產生 **memory key**。
*   Memory key 必須透過網路傳輸到 remote 端，讓對方能夠進行 One-sided 讀寫。
*   **Pack/Unpack**: Key 在傳輸前需要 `pack` 成統一形式，接收後需要 `unpack`，以確保不同架構的電腦能夠正確使用 (處理資料格式或 memory layout 差異)。

#### 操作類型

1.  **Atomic Operations (utonomic operation)**:
    *   執行很簡單、用來完成同步化的操作，例如 AD (Add)、decrease、AND 或 OR。
    *   多個遠端使用者可以同時透過網路修改同一塊 memory 上的變數。

2.  **Put**:
    *   將資料寫入遠端記憶體。
    *   **不保證** 原子性 (atonomic)，多人同時操作可能造成 race condition。
    *   通常用於 one-to-one 的 one-sided 寫入操作。

3.  **Get**:
    *   A 端呼叫 Get，將遠端 B 端的資料取回。
    *   流程包含 request 從 A 到 B，資料從 B 回到 A。

#### UCP 與 GPU 整合 

UCX 的目標是將溝通細節隱藏起來，包括 GPU 傳輸。

*   UCP 能夠 **remotely** 直接操作遠端電腦 **GPU memory** 上的資料。
*   實作上，只需將 buffer 資源配置到 **GPU global memory** (例如使用 `cuda_m_m_lock` 相關 API)。
*   後續的 UCP API 呼叫（如 Put/Get）與操作 Host memory 的方式 **一模一樣**，程式邏輯無需改變。
*   UCX 會判斷記憶體在 GPU 上，並自動使用 GPU 的 transport 方式進行傳輸。

### HPCX 與 Collective Communication (HPCX and UCC)

#### HPCX 軟體套件

*   HPCX 是一個為 High Performance Computing 設計的軟體套件 (software stack/package)。
*   它將多個元件整合在一起，包括與 UCX **編譯整合** 好的 **MPI** (如 Open MPI)。
*   它讓上層應用程式設計者可以直接使用 MPI，而底層則透過 UCX 處理溝通。
*   HPCX 包含的元件還有 **NV_N (Nvidia EFA)** 函式庫，以及 **UCC**。

#### UCC (Unified Collective Communication)

*   UCC 專注於處理 **Collective Code** (集體通訊操作)。
*   Collective Code 包含 Broadcast、Reduce、Allreduce 等操作。
*   UCC 的角色與 UCX 相似，但 UCX 專注於 P2P 溝通。
*   UCC 實作這些操作，避免使用者自己用 UCP 刻寫。
*   集體操作的實作通常是 **hierarchical (層次性)** 的。
*   UCC 的溝通需要一個 **group** 的概念，這個 group entity/context 應用於一組 connection 上。
*   使用時，可以在運行 MPI 程式時設定參數 (如 `UCC_enable=1`)，讓 PI 的集體操作走 UCC 路徑來加速。

### SHARP (Scalable Hierarchical Aggregation and Reduction Protocol)

SHARP 是一種更底層的加速技術，專為集體操作設計。

*   **硬體需求**: SHARP 需要 **特殊 Switch** (而非特殊網卡) 來運作。
*   **運作原理**: 這些特殊的 Switch（稱為 **in-network computing** 或 **programmable switch**）具有運算能力。它們可以在封包傳輸中，直接在 Switch 內進行運算處理。
*   **用途**: SHARP 用來加速 Collective Code，特別是 **aggregation** 和 **reduction**。
*   **優勢**: 提升效能、減少網路流量、提高 scalability。
*   這種技術的重點是將運算從 CPU 卸載到網路硬體中。
*   在平行程式設計中，SHARP 專注於處理 Aggregation 和 Reduction 兩種操作，因為這些操作對於分散式機器學習（如模型訓練）非常重要。
*   SHARP 是 **hardware-based solution**。通常在 InfiniBand Switch 系統中提供。


---
其他課程連結

[平行程式1C~2B Introduction parallel programming](https://hackmd.io/@6FOC2dvARe-Vz0kVSyajew/Syxh3H7Kxe)
[平行程式3A~3D The Latest Developments and Applications Using Parallel Programming](https://hackmd.io/@6FOC2dvARe-Vz0kVSyajew/HJh7QFVKle)
[平行程式4A~4B IO Parallel IO and Program Analysis](https://hackmd.io/@6FOC2dvARe-Vz0kVSyajew/HJLMsuHFgg)
[平行程式5A~5B The Latest Developments and Applications Using Parallel Programming](https://hackmd.io/@6FOC2dvARe-Vz0kVSyajew/SJh57hIFle)
[平行程式6A~6B Communication Routines and Parallel Function Code](https://hackmd.io/@6FOC2dvARe-Vz0kVSyajew/r1X9kX_Fle)
[平行程式 6C~6D Communication Routines and Parallel Function Code](https://hackmd.io/@6FOC2dvARe-Vz0kVSyajew/S1DPjoYFlx)
[平行程式 7A~8A Pthread:Synchronization Problem & Tools](https://hackmd.io/@6FOC2dvARe-Vz0kVSyajew/HJu-_0tKge)
[平行程式 8B~8D Synchronization Tools & Open Multi-Processing(OpenMP)](https://hackmd.io/@6FOC2dvARe-Vz0kVSyajew/H1ki4E2Fee)
[平行程式 9A~9B Synchronization Construct](https://hackmd.io/@6FOC2dvARe-Vz0kVSyajew/BJTYMrpKlx)
[平行程式 10A~10B Synchronization Tools & Open Multi-Processing Synchronization Construct](https://hackmd.io/@6FOC2dvARe-Vz0kVSyajew/B1cY6M1qee)
[平行程式 10C~10D Synchronization Tools & Open Multi-Processing Synchronization Construct](https://hackmd.io/@6FOC2dvARe-Vz0kVSyajew/BkgFaNg5gg)
[平行程式 11A~11B Parallel Work Pool and Termination / Parallel Sorting](https://hackmd.io/@6FOC2dvARe-Vz0kVSyajew/H1hfOw-5xl)
[平行程式 12A~12B Parallel Sorting and Pipelined Computations](https://hackmd.io/@6FOC2dvARe-Vz0kVSyajew/Symo-zQ9eg)
[平行程式 12C~12D Parallel Sorting and Pipelined Computations](https://hackmd.io/@6FOC2dvARe-Vz0kVSyajew/BJYNKDVceg)
[平行程式 13A-13B  Sychronous Parallelism](https://hackmd.io/@6FOC2dvARe-Vz0kVSyajew/HJ2UJ2Bqex)
[平行程式 14A~14B Heterogeneous Computing](https://hackmd.io/@6FOC2dvARe-Vz0kVSyajew/BksS4yP5eg)
[平行程式 14C~14D Heterogeneous Computing](https://hackmd.io/@6FOC2dvARe-Vz0kVSyajew/BJrfTUd9xx)
[平行程式 15A~15B Parallel Programming Model on GPU](https://hackmd.io/@6FOC2dvARe-Vz0kVSyajew/ByWnl-t5gg)
[平行程式 16A~16B What is Compute Unified Device Architecture(CUDA)?](https://hackmd.io/@6FOC2dvARe-Vz0kVSyajew/HyYpsjcqgl)
[平行程式 17A~18A 平行運算的CUDA](https://hackmd.io/@6FOC2dvARe-Vz0kVSyajew/H1dUeBT5lg)
[平行程式 18B~19A  記憶體層級 / CUDA的優化](https://hackmd.io/@JuitingChen/HyF44e1jge)
[平行程式 19B~19D 記憶體層級 / CUDA的優化 ](https://hackmd.io/@JuitingChen/ryPEu4lieg)
[平行程式 20A~20B CUDA優化全域和區域記憶體/共享記憶體](https://hackmd.io/@JuitingChen/r1X659Zoxl)
[平行程式 21A~21B Parallel Reduction / Distributed Computing Framework](https://hackmd.io/@JuitingChen/HyiOpozjxl)
[平行程式 NTHU-PP-Chap10-Big Data-Part1 ](https://hackmd.io/@JuitingChen/Hyc-e3Golx)
[平行程式 NTHU-PP-Chap10-Big Data-Part2 ](https://hackmd.io/@JuitingChen/ryC_QTXoxl)
[平行程式 NTHU-PP-Chap11-MapReduce](https://hackmd.io/@JuitingChen/HJgBXJOsge)
[平行程式 NTHU-PP-Chap12-Distributed Training-Part1](https://hackmd.io/@JuitingChen/ryh5hBtsge)
[平行程式 NTHU-PP-Chap12-Distributed Training-Part2](https://hackmd.io/@JuitingChen/rJ2G7kdjxg)
[平行程式 NTHU-PP-Chap12-Distributed Training-Part3](https://hackmd.io/@JuitingChen/HkA471dilx)
[平行程式 NTHU-PP-Chap13-UCX-Part1](https://hackmd.io/@JuitingChen/rJbq103ieg)
[平行程式 NTHU-PP-Chap13-UCX-Part2](https://hackmd.io/@JuitingChen/SJpNmk_ixl)
[平行程式 NTHU-PP-Chap13-UCX-Part3](https://hackmd.io/@JuitingChen/HkIUYa13xe)
