---
# System prepended metadata

title: 平行程式 12C~12D Parallel Sorting and Pipelined Computations
tags: [平行程式]

---

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

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

12C~12D Parallel Sorting and Pipelined Computations

今日大綱
空間資料結構 (例如：KD-Tree)
KD-Tree 的兩種建構方法
Pipeline (管線化)
Pipeline 的三種類型
Synchronous Computation (同步計算)
屏障 (Barrier) 的實作方式

### **1. 空間資料結構 (例如：KD-Tree)**

- **目的**：用於加速空間查詢，例如尋找最近的物體。
- **演算法來源**：假設每個物體都處於最佳位置，並且只需沿一條路徑找到目標，中間遇到的其他點都可以被忽略。最終，總會有一個物體需要被處理到「最底層」，變成單獨的個體。
- **時間複雜度**：
    - **搜尋**：由於是平衡的樹，其深度為 `log N`，所以每個物體只需要走 `log N` 的路徑即可。
    - **建構/更新**：
        - 原先可能是 `N^2` (例如每個物體都要被查詢 N 次)。
        - 透過優化，假設每個物體只需要處理一次，並且每個物體都可能需要查詢 `T` 次，則其時間複雜度為 `T * N log N`。
        - **需要重新調整**：由於物體的位置會改變，T 樹必須重新調整或重建。雖然只是輕微的位置改變，但 T 樹仍需調整。
- **平衡的重要性**：
    - 如果樹是不平衡的，則查詢路徑深度可能很高，導致計算時間增加。
    - 物體在空間中均勻分佈時，不平衡的情況很常見。

#### **1.1 KD-Tree 的兩種建構方法**

1. **第一種方法：簡單空間切割 (Spatial Position Based Cutting)**
    
    - **優點**：切割方式非常簡單，不論物體位置如何，都直接切割空間。
    - **缺點**：如果物體在空間中不是均勻分佈，這種方法很難確保樹是平衡的。除非物體的分佈本身就很均勻 (例如宇宙中的物體分佈)。
    - **近似度 (Approximation)**：相較於第二種方法，這種方法的近似度較好，因為它考慮了空間位置。
    - **效率**：計算速度較慢。
2. **第二種方法：基於物體數量分佈切割 (Object Distribution Based Cutting)**
    
    - **目的**：確保建構出來的樹**絕對平衡 (absolutely balanced)**。
    - **機制**：
        - 切割空間時，不是根據空間的絕對位置，而是根據切割後物體的數量分佈來決定切割位置。
        - 例如，在 M 維空間中，它會沿著一個維度進行切割 (如先 X 再 Y)，並選擇一個位置，使切割線兩邊的物體數量相同。
        - 透過遞迴方式不斷切割，直到每個節點代表一個單獨的物體。
    - **優點**：**確保絕對平衡**，使得查詢時更容易保證平衡性。
    - **缺點**：
        - **近似度較差**：由於只考慮物體數量，不考慮空間概念，可能導致空間上非常接近的兩個物體被分到不同的分支，無法被視為單一物件或聚合，降低了近似的準確度。
        - 切割模式不規則。
    - **效率**：計算速度會比較快，特別是平行計算時。

#### **1.2 N-body 問題與平行化考量**

- N-body 問題是如何近似並減少計算量的一個基本應用。
- **平行化方式**：
    - 每個人（或處理器）只處理一個 `t` 到 `N` 的路徑。
    - 也可以多個處理器同時進行。
- **共享資料結構**：T 樹是一個共享的資料結構。在遞迴切割 (recursive partition) 時，當多個處理器同時讀寫節點範圍時，需要使用 **鎖定 (lock)** 機制來保護共享資源，以避免存取問題。

---

### **2. Pipeline (管線化)**

- **基本概念**：
    - 將一個複雜的計算過程拆分成多個階段。
    - 每個階段由一個處理器負責計算。
    - 整個計算過程是從第一個階段到最後一個階段依序進行，最終得到結果。
- **主要優點**：當計算過程複雜且計算量大時，可以讓不同的處理器同時處理不同階段的工作，實現平行化，從而加速計算並減少計算時間。
- **常見應用**：大量製造業、CPU 指令處理。

#### **2.1 Pipeline 的三種類型**

1. **Type 1: 實例級管線 (Instance-Level Pipelining)**
    
    - **特性**：處理**一個問題的多個實例 (multiple instances)**。
    - **例子**：
        - 生產大量汽車：每個階段處理不同輛車的生產。
        - CPU 處理大量指令：不同階段處理不同指令。
        - 計算多個陣列的總和 (summing number in an array)：當有多個陣列 A1, A2, A3... N 時，可以將每個陣列透過管線處理。
    - **運作方式**：
        - 每個階段 (P0, P1, ..., Pn) 負責一個處理步驟。
        - 第一個實例 (Instance 0) 先進入 P0，完成後進入 P1。
        - 當 Instance 0 進入 P1 時，Instance 1 可以進入 P0，依此類推。
        - 這樣不同階段就可以同時處理不同實例。
    - **適用條件**：必須有一個以上的實例 (instance) 才能啟用管線化。如果只有一個實例，則與序列執行 (serial code) 無異，沒有任何好處。
    - **缺點**：存在**開銷 (overhead)**。需要一段時間來「填充 (fill)」管線，前 P-1 個週期是空的。同樣，管線清空也需要時間。因此，只有當實例數量遠大於處理器數量時，才能顯著降低執行時間（接近除以 P 而非減半）。
    - **MPI 實現**：可透過 send/receive 操作，讓每個處理器接收值、相加、再發送出去，形成管線。
2. **Type 2: 資料級管線 (Data-Level Pipelining)**
    
    - **特性**：處理**一個單一問題實例 (single instance)**，但該實例包含一系列資料項目。
    - **運作方式**：問題的計算過程中包含許多操作，這些操作可以應用在不同的資料項目上，從而在資料層面實現加速。
    - **適用條件**：資料項目的數量遠大於處理器數量，才能達到加速效果。
    - **例子**：
        - **插入排序 (Insertion Sort)**：雖然它是一個單一排序問題，但每個數字在插入時都需要與已排序的數字比較並推移。
        - **管線化插入排序機制**：
            - 假設有 P 個處理器，每個處理器負責比較一個新來的數字。
            - 每個處理器收到一個數字後，與自己手上的數字比較：
                - 如果新數字較小，將新數字推給下一個處理器，自己保留原來的較大數字。
                - 如果手頭沒有數字，則保留新數字。
            - 不同數字可以同時在不同的處理器中進行比較和推移，實現平行工作。
        - **時間複雜度優化**：插入排序的序列時間複雜度為 `O(N^2)`。透過管線化實作，可將時間複雜度降低到 `O(N)` (N 為資料項目數量，P 為處理器數量，最差情況下，最後一個數字可能需要經過 2N 個步驟才能到位，因此是 `O(2N)` 或 `O(N)`)。
3. **Type 3: 重疊式管線 (Overlapping Pipelining / Interdependent Stages)**
    
    - **特性**：比 Type 2 更特殊，階段之間可以**重疊執行**。即前一個階段還未完全完成時，只要有足夠的資訊或資料，下一個階段就可以開始計算。
    - **好處**：讓不同階段的計算時間可以**重疊 (overlap)**，從而實現更快的計算速度。即使每個階段的結束時間可能不同，只要結果不受影響，這種重疊是允許的。
    - **例子**：
        - **解線性方程組 (Solving Linear Equations)**：特別是像上/下三角矩陣 (upper/lower triangular matrix) 形式的方程組。
        - **背向代入法 (Back Substitution)**：
            - 對於 `Ax = B` 形式的方程組，如果 `A` 是下三角矩陣，可以從最底層的 `X0` 開始解 (因為該列只包含 `X0`)。
            - 解出 `X0` 後，將其代入上一項解 `X1`，依此類推，逐步解出所有 `Xn`。
            - **管線化應用**：
                - 可以將每個 `Xi` 的計算分配給一個專門的處理器。
                - **關鍵點**：當 `X0` 計算完成後，即使其所在的階段還未完全結束，`X0` 的值就可以立即推送到後面的所有處理器。
                - 後面的處理器在收到 `X0` 的值後，可以立即開始計算其方程中涉及 `X0` 的部分，而無需等待前一個階段完全完成所有計算。
                - 這樣，不同階段的計算就可以重疊，傳遞的資訊 (例如 `X0`) 可以向前傳播，讓後面的處理器提前開始計算，提高效率。
        - **程式碼結構**：每個處理器 `Pi` 負責計算 `Xi`，它會累加其前面所有 `Xj` (j < i) 乘以對應係數的結果，然後進行減法和除法以得到 `Xi`。
        - **時間複雜度優化**：如果能充分重疊，其時間複雜度可以降到 `O(N)`。
    - **一般性考量**：每個階段的計算量應盡量平均，因為最慢的階段會成為瓶頸。

---

### **3. Synchronous Computation (同步計算)**

- **定義**：指某些平行計算過程中，需要所有處理器在**某個特定點進行同步 (synchronization point)** 的行為。
- **非互斥性**：同步計算並非獨立於其他計算類型，一個計算方法可能同時屬於多種類型。
- **原因**：主要由於資料依賴性 (data dependence) 的存在，需要同步點來避免資料不一致問題。
- **實作機制**：透過**屏障 (barrier)** 或**鎖定 (locking)** 機制來實現。
- **例子**：
    - 作業中的 Jacobi 迭代法：在每次迭代完成後需要同步所有結果，否則結果會錯誤。
    - 許多平行演算法，只要在計算過程中需要處理器同步，都屬於同步計算。
- **注意事項**：
    - 要小心鎖定問題，如果屏障或鎖定使用不當，可能會導致處理器互相等待，形成**死結 (deadlock)**。
    - 需要仔細判斷同步點的位置，通常是基於資料依賴性需求。

#### **3.1 屏障 (Barrier) 的實作方式**

1. **計數器屏障 (Counter Barrier / Centralized Barrier)**
    
    - **機制**：
        - 有一個**主控 (main) 處理器**或共享計數器。
        - 每個處理器到達屏障時，向主控發送訊息 (send message) 並等待回覆。
        - 主控處理器接收所有處理器的訊息並計數。
        - 當所有處理器都到達 (計數達到總處理器數量) 後，主控會發送一個通知訊息 (notify message) 給所有處理器，告知它們可以繼續執行。
    - **階段**：分為**抵達階段 (arrival face)** 和**離開階段 (departure face)**。
    - **缺點**：
        - **中心化 (centralized)**：主控處理器會成為**瓶頸 (bottleneck)**。
        - **訊息量大**：由於有抵達和離開兩個階段，需要傳遞的訊息數量相對較多。
2. **蝴蝶屏障 (Butterfly Barrier / Decentralized Barrier)**
    
    - **機制**：
        - 採用**分散式 (decentralized)** 的同步方式。
        - 通訊模式像蝴蝶一樣，從密集的通訊變得稀疏。
        - 每個處理器在到達屏障時，會與其夥伴進行訊息交換。
        - 對於每個處理器，它會接收兩個訊息。當它收到這兩個訊息時，就表示所有相關處理器都已到達，它可以從屏障回傳。
        - 這種方法類似於遞迴地合併 (merge) 操作，最終讓所有處理器繼續執行。
    - **優點**：
        - **無主控瓶頸 (no main bottleneck)**：每個處理器處理的訊息數量很平均。
        - 每個處理器只需處理兩個訊息。
        - 迭代次數為 `log N`。
        - 雖然總訊息量可能較多，但由於訊息分散在不同處理器上，且每個處理器只處理少量訊息，不易產生瓶頸問題。

#### **3.2 Deadlock**

- 在同步計算中，如果不小心打亂了執行順序，可能會導致所有處理器互相等待，形成 Deadlock。這是需要特別小心的問題。


---
其他課程連結

[平行程式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)
