利用並行計算機實現軟件和硬件上的並行算法的主要步驟和層次程序員
第5層是指應用層,在這一層裏描述的是須要並行計算平臺實現的應用和問題。對應所需的輸入和輸出的格式也在這層進行定義。某些輸入和輸出(I/O)接口的描述還須要考慮數據存儲的位置和時間的相關性。這一層的結果會被更低一層採納以便指導並行算法的開發工做。 第4層是算法開發層,這裏須要考慮到應用在問題中的實現。須要應用實現的計算內容決定了算法的具體任務和任務之間的相互依賴關係。在這一階段的程序,算法的並行性並不必定會顯現出來,由於在探索算法子任務執行的時候仍然在運用傳統的線性思考。在這一階段,也不須要考慮子任務的時間調度和處理器分配的問題。可能在這階段就將這些問題解決的作法看起來很誘人,可是這樣作會拔苗助長,由於這會掩蓋程序中潛在的並行性。該層的結果是一個依賴圖,或是一個有向圖,或者是一個歸納了任務之間依賴關係的鄰接矩陣。 第3層是並行化層,在這一層將試着釋放算法中潛在的並行性。這一層接收了第4層對算法的描述而且給出了基於軟件實現的線程時間調度和處理器分配。另外一種選擇是在這一層進行基於超大規模集成電路的硬件實現的任務調度和處理器分配。 第2層是代碼層,在本層中並行算法用高級語言表示爲代碼。使用何種語言取決於目標並行計算在何種平臺執行。 第1層的目標是算法的實現,或是在並行計算機平臺的應用。實現的途徑能夠是在並行計算平臺上使用多線程,也能夠是在特定用途集成電路(ASIC)上或者現場可編程門陣列(FPGA)上使用特定的應用並行處理系統。
表示某個算法的有向無向圖算法
- 一般用有向圖(DG)來直觀表示算法的子任務之間的數據依賴關係。DG在描述算法的時候表示依賴圖,須要用帶箭頭的線段強調子任務之間的數據流向關係。
- 定義1:一個依賴圖是邊和結點的集合。結點表示算的子任務,邊表示子任務用到的數據。數據包括輸入、輸出和中間結果。
- 注意:在一個依賴圖中出現的不帶箭頭的邊表示此邊鏈接的兩個結點之間沒有數據依賴關係,它們只是共用算法中的某一個變量。這個變量能夠是輸入、輸出或者在算法中做爲I/O媒介的中間結果。
- 定義2:DG是有向邊和結點的集合。結點表示算法須要處理的子任務,有向邊表示子任務之間的數據依賴關係。一個子任務的輸出在一條邊的開端部分,箭頭指向的一端表示一個子任務的輸入。
- 定義3:有向無環圖(DAG)是指一個沒有任何環路的DG。
- 定義4:一個DG中的輸入邊是指只有目標結點而沒有任何源結點的邊,表述了算法的一個輸入。在圖中能夠看到有3條這樣的輸入邊,分別表示輸入in0、in1和in2。
- 定義5:一個DG中的輸出邊是指只有源結點而沒有目標結點的邊,表達了算法的一個輸出。在圖中能夠看到有3條這樣的輸出邊,分別表示了輸出out0、out1和out2。
- 定義6:一個DG中的內部邊是指既有源節點又有目標結點的邊,表達了算法的一個內部變量。
- 定義7:一個DG中的輸入結點是指全部的入邊都是輸入邊的結點。在圖中能夠看到0、一、2都表示輸入結點。輸入結點所表示的子任務在算法輸入變量就緒後就被處理。
- 定義8:一個DG中的輸出結點是指全部的出邊都是輸出邊的結點。在圖中能夠看到結點7和9都表示輸出結點。可是結點3不是輸出結點,由於結點3的一條出邊是指向結點7的內部邊。
- 定義9:一個DG中的內部結點是有至少一條入邊和至少一條出邊的結點。
根據子任務的依賴關係能夠大體將算法分爲以下幾類:編程
- 串行算法的特色是因爲相互之間存在數據依賴關係,子任務必須一個一個地按順序執行。這一類算法的DG是由一系列相互關聯的子任務構成的隊列。圖中展現了一個串行算法的DG。此算法是用來計算斐波那契數列的。爲了獲得n10,子任務T10進行了以下計算:n10=n8+n9。在此n0=0和n1=1是初始條件已經給出。很明顯,爲了獲得某一位的斐波那契數只能計算在它以前的數。
- 並行算法的特色是因爲相互之間不存在數據依賴關係,子任務能夠同時併發執行。此算法的DG就像是許多獨立的子任務組成的一組任務,相互之間沒有聯繫。圖中展現了一個並行算法的DG。Web服務器上的數據處理應用就是一種簡單的並行算法,每一次數據請求都被看作獨立的任務交給不一樣的處理器來響應。同時運行瀏覽器,字處理程序等多個程序時操做系統的多任務調度算法也是一種並行算法。
- SPA的特色是子任務被分配至不一樣層次,每一個層次以內的子任務能夠併發執行,可是各個層次需按照必定的順序執行。當須要執行的層次只有一層時,這個SPA就是並行算法。當每一層都只有一個子任務時,這個SPA是串行算法。圖中展現了CORDIC算法的DG,CORDIC算法就是一個典型的SPA,它有n層迭代,在第i次迭代時須要執行如下運算:
- xi+1=xi+myiδi
- yi+1=yi-xiδi
- zi+1=zi+θi
- 在此等式中x,y和z都是進行迭代的數據,每次迭代以後都會被更新。δi和θi是存在表單中的常量。m是用來控制計算類型的參數,θi的數值是預設的,與i有關。此算法每次迭代都會進行這三項操做。
- NSPA不屬於上述分類中的任何一種,NSPA算法的DG也沒有規律可循。根據算法DG是否有環將NSPA分爲兩類:①DAG;②有向有環圖(DCG)。
- 圖中分別展現了一個DAG算法和一個DCG算法。DCG算法常見於離散時間回饋控制系統。輸入信號做爲子任務T0的初始濾波或者輸入信號條件。子任務T1的輸出一般是錯誤信號,而後這個信號會做爲一種反饋輸入子任務T2中。
- NSPA的依賴圖有兩種典型構造:結點用來表示構成算法的子任務,有向邊則表示子任務之間的數據流向。一個結點的一條出線表示輸出,入線表示輸入。若Ti的輸出指向Tj,則代表Tj依賴於Ti。在圖中則用「結點i的一條有向邊指向結點j」來表示這種依賴關係。
一個算法的DG有以下3個重要屬性:瀏覽器
- Work任務數(W)表示算法完成須要處理的子任務總數。
- Depth深度(d)表示任意一個輸入結點到任意一個輸出結點之間的最大路徑長度,也被稱爲關鍵路徑。
- Parallelism並行度(P),也稱爲並行程度,表示能夠併發執行的最大結點數。由此數據能夠決定該算法須要的處理器的數目不會超過P,保證算法執行過程當中不會出現沒必要要的處理器。
- Karp等介紹了RIA的概念。這類算法的涵蓋範圍很廣,包括信號處理,圖像和視頻處理,線性代數應用,以及基於網格結構的數字模擬程序。上圖是一個RIA的依賴圖,用作示例的是圖像匹配算法。對於RIA算法,此處不使用DAG來表示,而是用依賴圖的概念來表示。
- 依賴圖和DAG相似,可是依賴圖中的鏈接邊是無向邊而非有向邊。
- RIA中的任務之間的依賴關係圖十分複雜。串行算法和並行算法,甚至SPA算法的並行度計算都不復雜。且RIA算法的並行計算很是困難。
矩陣相乘算法就是一種簡單的RIA算法:服務器
要求:輸入矩陣A和B
1 for i=0:I-1 do 2 for j=0:J-1 do 3 temp=0 4 for k=0:K-1 do 5 temp=temp+A(i,k)×B(k,j) 6 end for 7 C(i,j)=temp 8 end for 9 end for 10 RETURN C
- 該算法中出現的變量和算法的因子i、j、k有着正則依賴關係。通常狀況下此類算法經過依賴圖來進行研究,依賴圖能展現須要執行的子任務之間的關係。當算法只有1個或者2個因子時,依賴圖的展現很是直觀。可是矩陣相乘的算法中出現了3個因子,所以它的依賴圖是三維的,很難直觀表示。
- 在設計並行計算系統時須要注意的一些重要問題。
- 處理器之間的通訊應該採用內部互聯網絡。此網絡應該有能力支持任意兩個處理器之間的即時通訊。
- 任務分割表示將原始程序或應用分爲幾個程序段,以便稍後將這些程序段分配至各個處理器上。
- 粗粒度分割是指分配至各個處理器的程序段體積較大。
- 細粒度分割則是指程序段的體積較小。
- 程序段能夠是不一樣的軟件進程或者是線程。由程序員或者是編譯器決定分割方式。程序員或操做系統必需要確保子任務的同步執行以保證程序的正確性和數據的完整性。