並行算法的設計基礎
並行算法的定義和分類
- 並行算法:一些可同時執行的諸進程的集合,這些進程互相作用和協調動作從而達到給定問題的求解。
並行算法分類
- 數值計算與非數值計算
- 同步算法和異步算法
- 分布算法
- 確定算法和隨機算法
並行算法的表達
描述語言
- 可以使用類Algol、類Pascal等。
- 在描述語言中引入並行語句。
並行算法的復雜性度量
串行算法的復雜性度量
- 最壞情況下的復雜度(Worst-CASE Complexity)
- 期望復雜度(Expected Complexity)
並行算法的復雜性度量
- 運行時間t(n):包含計算時間和通信時間,分別用計算時間步和選路時間步作單位。n為問題實例的輸入規模。
- 處理器數p(n)
- 並行算法成本c(n):c(n)=t(n)p(n)
- 總運算量W(n):並行算法求解問題時所完成的總的操作步數。
Brent定理
令W(n)是某並行算法A在運行時間T(n)內所執行的運算量,則A使用p台處理器可在t(n)=O(W(n)/p+T(n))時間內執行完畢。
- W(n)和c(n)密切相關
- P=O(W(n)/T(n))時,W(n)和c(n)兩者是漸進一致的
- 對於任意的p,c(n)>W(n)
並行算法中的同步和通訊
同步
- 同步是在時間上強使各執行進程在某一點必須互相等待
- 可用軟件、硬件和固件的方法來實現
通訊
- 共享存儲多處理器使用:global read(X,Y)和global write(X,Y)
- 分布存儲多計算機使用:send(X,i)和receive(Y,j)
並行計算模型
PRAM模型
PRAM(Parallel Random Access Machine)模型是多指令流多數據流(MIMD)並行機中的一種具有共享存儲的模型。
基本概念
- 由Fortune和Wyllie於1978年提出,又稱SIMD-SM模型。有一個集中的共享存儲器和一個指令控制器,通過SM(流多處理器)的R/W交換數據,隱式同步計算。
結構圖
分類
(1)PRAM-CRCW並發度並發寫
- CPRAM-CRCW(Common PRAM-CRCW):僅允許寫入相同數據
- PPRAM-CRCW(Priority PRAM-CRCW):僅允許優先級最高的處理器寫入
- APRAM-CRCW(Arbitrary PRAM-CRCW):允許任意處理器自由寫入
(2)PRAM-CREW並發讀互斥寫
(3)PRAM-EREW互斥讀互斥寫
計算能力比較
- PRAM-CRCW是最強的計算模型,PRAM-EREW可logp倍模擬PRAM-CREW和PRAM-CRCW
優缺點
- 適合並行算法表示和復雜性分析,易於使用,隱藏了並行機的通訊、同步等細節
- 不適合MIMD並行機,忽略了SM的競爭、通訊延遲等因素。
異步APRAM模型
基本概念
- 又稱分相(Phase)PRAM或MIMD-SM。每個處理器有其局部存儲器、局部時鍾、局部程序;無全局時鍾,各處理器異步執行;處理器通過SM進行通訊;處理器間依賴關系,需在並行程序中顯式地加入同步路障。
指令類型
- 全局讀
- 全局寫
- 局部操作
- 同步
計算過程
由同步障分開全局相組成
計算時間
- 設局部操作位單位時間;全局讀/寫平均時間為d,d隨着處理器數目的增加而增加;同步路障時間為B=B(p)非降函數。
- 滿足關系2≤d≤B≤p;B=B(n)=O(dlogp)或O(dlogp/logd)令tph為全局相內各處理器執行時間最長者,則APRAM上的計算時間為:T=∑tph+B×同步障次數
優缺點
- 易編程和分析算法的復雜度。
- 但與現實相差較遠,其上並行算法非常有限,也不適合MIMD-DM模型。
BSP模型
基本概念
由Valiant(1990)提出的,“塊”同步模型,是一種異步MIMD-DM模型,支持消息傳遞系統,塊內異步並行,塊間顯式同步。
模型參數
- p:處理器數(帶有存儲器)
- l:同步障時間(Barrier synchronization time)
- g:帶寬因子(time steps/packet)=1/bandwidth
計算過程
由若干超級步組成,每個超級步計算模式為下圖:
優缺點
- 強調了計算和通訊的分離,提供了一個編程環境,易於程序復雜性分析。
- 但是需要顯式同步機制,限制至多h條消息的傳遞等。
logP模型
基本概念
由Culler(1993)年提出的,是一種分布存儲的、點到點通訊的多處理機模型,其中通訊由一組參數描述,實行隱式同步。
模型參數
- l:network latency
- o:communication overhead
- g:gap=1/bandwidth
- P:#processors
注:l和g反映了通訊網絡的容量
優缺點
- 捕捉了MPC的通訊瓶頸,隱藏了並行機的網絡拓撲、路由、協議,可以應用到共享存儲、消息傳遞、數據並行的編程模型中。
- 但難以進行算法描述、設計和分析。
BSP vs. logP
- BSP→logP:BSP塊同步→BSP子集同步→BSP進程對同步=logP
- BSP可以常數因子模擬logP,logP可以對數因子模擬BSP
- BSP=logP+Barriers-Overhead
- BSP提供了更方便的程設環境,logP更好地利用了機器資源
- BSP似乎更簡單、方便和符合結構化編程
並行算法的一般設計方法
串行算法的直接並行化
算法設計方法描述
方法描述
- 發掘和利用現有串行算法中的並行性,直接將串行算法改造為並行算法。
評注
- 由串行算法直接並行化的方法是並行算法設計的最常用方法之一
- 不是所有的串行算法都可以直接並行化的
- 一個好的串行算法並不能並行化為一個好的並行算法
- 許多數值串行算法可以並行化為有效的數值並行算法
例:快排序算法的並行化
算法:PRAM-CRCW上的快排序二叉樹構造算法
輸入:序列(A1,...,An)和n個處理器
輸出:供排序用的一顆二叉排序數
從問題描述開始設計並行算法
方法描述
- 從問題本身描述出發,不考慮相應的串行算法,設計一個全新的並行算法。
評注
- 挖掘問題的固有特性與並行的關系
- 設計全新的並行算法是一個挑戰性和創造性的工作
- 利用串的周期性的PRAM-CRCW算法是一個很好的范例
借用已有的算法求解新問題
方法描述
- 找出求解問題和某個已解決問題之間的聯系
- 改造或利用已知算法應用到求解問題上
評注
- 這是一項創造性的工作
- 使用矩陣乘法算法求解所有點對間最短路徑是一個很好的范例
利用矩陣乘法求所有點對間最短路徑
計算原理
並行算法的基本設計技術
划分設計技術
- 均勻划分技術
- 方根划分技術
- 對數划分技術
- 功能划分技術
分治設計技術
並行分治設計步驟
- 將輸入划分成若干個規模相等的子問題
- 同時(並行地)遞歸求解這些子問題
- 並行地歸並子問題的解,直至得到原問題的解
雙調歸並網絡
平衡數設計技術
設計思想
- 以樹的葉節點為輸入,中間節點為處理節點,由葉向根或由根向葉逐層進行並行處理。
倍增設計技術
設計思想
- 又稱指針跳躍(pointer jumping)技術,特別適合於處理鏈表或有向樹之類的數據結構
- 當遞歸調用時,所要處理數據之間的距離逐步加倍,經過k步后即可完成距離為2k的所有數據的計算
流水線設計技術
設計思想
- 將算法流程划分成p個前后銜接的任務片段,每個任務片段的輸出作為下一個任務片段的輸入
- 所有任務片段按同樣的速率產生出結果
評注
- 流水線技術是一種廣泛應用在並行處理中的技術
- 脈動算法(Systolic algorithm)是其中一種流水線技術
並行算法的一般設計過程
PCAM設計方法學
設計並行算法的四個階段:
- 划分(Partitioning):分解成小的任務,開拓並發性
- 通訊(Communication):確定諸任務間的數據交換,監測划分的合理性
- 組合(Agglomeration):依據任務的局部性,組合成更大的任務
- 映射(Mapping):將每個任務分配到處理器上,提高算法的性能
PCAM設計過程
划分
划分的方法描述
- 充分開拓算法的並發性和可擴展性
- 先進行數據分解(稱域分解),再進行計算功能的分解(稱功能分解)
- 使數據集和計算集互不相交
- 划分階段忽略處理器數目和目標機器的體系結構
- 能分為兩類划分:①域分解(domain decomposition);②功能分解(functional decomposition)
域分解
- 划分的對象是數據,可以是算法的輸入數據、中間處理數據和輸出數據
- 將數據分解成大致相等的小數據片
- 划分時考慮數據上的相應操作
- 如果一個任務需要別的任務中的數據,則會產生任務間的通訊
功能分解
- 划分的對象是計算,將計算划分為不同的任務,其出發點不同於域分解
- 划分后,研究不同任務所需的數據。如果這些數據不相交的,則划分是成功的;如果數據有相當的重疊,意味着要重新進行域分解和功能分解
- 功能分解是一種更深層次的分解
划分依據
- 划分是否具有靈活性?
- 划分是否避免了冗余計算和存儲?
- 划分任務尺寸是否大致相當?
- 任務數與問題尺寸是否成比例?
- 功能分解是一種更深層次的分解,是否合理?
通訊
通訊方法描述
- 通訊是PCAM設計過程的重要階段
- 划分產生的諸任務,一般不能完全獨立執行,需要在任務間進行數據交流;從而產生了通訊
- 功能分解確定了諸任務之間的數據流
- 諸任務是並發執行的,通訊則限制了這種並發性
四種通訊模式
- 局部/全局通訊
- 結構化/非結構化通訊
- 靜態/動態通訊
- 同步/異步通訊
通訊判據
- 所有任務是否執行大致相當的通訊?
- 是否盡可能的局部通訊?
- 通訊操作是否能並行執行?
- 同步任務的計算能否並行執行?
組合
方法描述
- 組合是由抽象到具體的過程,是將組合的任務能在一類並行機上有效的執行
- 合並小尺寸任務,減少任務數。如果任務數恰好等於處理器數,則也完成了映射過程
- 通過增加任務的粒度和重復計算,可以減少通訊成本
- 保持映射和擴展的靈活性,降低軟件工程成本
表面-容積效應
- 通訊量與任務子集的表面成正比,計算量與任務子集的體積成正比
- 增加重復計算有可能減少通訊量
重復計算
- 重復計算減少通訊量,但增加了計算量,應保持恰當的平衡
- 重復計算的目標應減少算法的總運算時間
組合判據
- 增加粒度是否減少了通訊成本?
- 重復計算是否已權衡了其得益?
- 是否保持了靈活性和可擴展性?
- 組合的任務數是否與問題尺寸成比例?
- 是否保持了類似的計算和通訊?
- 有沒有減少並行執行的機會?
映射
方法描述
- 每個任務要映射到具體的處理器,定位到運行機器上
- 任務數大於處理器數時,存在負載平衡和任務調度問題
- 映射的目標:減少算法的執行時間(並行的任務→不同的處理器;任務之間存在高通訊的→同一處理器)
- 映射實際是一種權衡,屬於NP完全問題
負載平衡算法
- 靜態的:事先確定
- 概率的:隨機確定
- 動態的:執行期間動態負載
- 基於域分解的:遞歸對剖;局部算法;概率方法;循環映射
任務調度算法
- 任務放在集中的或分散的任務池中,使用任務調度算法將池中的任務分配給特定的處理器
映射判據
- 采用集中式負載平衡方案,是否存在通訊瓶頸?
- 采用動態負載平衡方案,調度策略的成本如何?
參考文獻
https://wenku.baidu.com/view/b183017a1ed9ad51f01df2d7.html?rec_flag=default&sxts=1542421861193
https://wenku.baidu.com/view/17709aca3186bceb19e8bbd4.html?rec_flag=default&sxts=1542421875283
https://wenku.baidu.com/view/b994bbf6998fcc22bcd10dd7.html?rec_flag=default&sxts=1542421883056