並行字首求和的演算法

2022-02-24 23:13:51 字數 1059 閱讀 1140

本文參考calvin lin和lawrence snyder的,《principles of parallel programming》(並行程式設計原則)。

與求和緊密相關的操作是字首求和,在許多並行程式語言中也稱為掃瞄(scan)。與求和操作一樣,首先仍有n個值的序列,

但希望計算的是如下的序列,

其中,每個 yi 是輸入前 i 個元素的和,即有,

以並行方式求解字首和不如求累加和那樣明顯(累加和樹形分層求和,時間負責度為 logn),因為它需要順序求解所有中間值。初看起來,好像字首求和既沒有優勢,又不可能找到更好的解,但事實上字首求和能以並行的方式完成。

通過對成對求和方法的觀察,可以發現只要對該方法略加修改就可以計算字首值。求解的思路是,每個儲存有 xi  的葉處理器能夠計算值 yi ,只要它知道在它左邊所有元素的和,即他的字首,在成對求和的過程中,我們知道所有子樹的和,而如果能保留這些資訊,就能確定這些字首而無需直接對它們求和。為做到這一點,我們從根開始,它的字首(即在序列元素之前的所有元素和)是0。這也是它的左子樹的字首,而它的左子樹的總和則是它的右子樹的字首。歸納地應用這一思路,我們可以得到如下規則:

圖:字首和的計算。其中,黃色節點是沿樹向上掃瞄,用成對求和演算法計算得到的值;淺綠色節點是字首,沿樹向下掃瞄,用以下簡單規則得到:將來自父節點的值送往左子節點,而將來自左子節點的和(上傳而來)與來自父節點的值兩者相加,並將結果送往右子節點

沿樹向下移動的值是子節點的字首(參見圖,其中向下移動的值是淺綠色方框表示)。

這種計算稱為並行字首計算。它在樹中進行一次向上和向下掃瞄,但掃瞄中處於每一層上的所有操作可以同時完成。因此,在每個節點上最多隻需要進行兩次加法,一次向上和一次向下,加上路由的邏輯操作。由上可見,並行字首求和具有對數的時間複雜性。許多類似的順序操作在這方面要差於並行字首方法。

順序和並行演算法的根本差別在於構造並行演算法時需要改變計算的次序。

C語言實現並行求和演算法

1 問題描述 將陣列a均勻劃分成m個片段,每個陣列片段最多有 n m 1 m 個元素。每個陣列片段分別由乙個執行緒負責區域性求和,最後這些部分和加起來就得到陣列中所有元素的總和。2 相關 此 在gcc4.3下編譯通過 include include include define num thread...

矩陣按行 列 求和CUDA並行演算法設計

通過矩陣按行求和與按列求和兩個示例介紹cuda並行演算法設計的思路,希望對大家有所幫助。很多公司cuda工程師面試也會考察這個題目。1.矩陣按行求和 矩陣a m n b m b i a 0 a 1 a n 1 序列 define a i j a i n j void sum row t a,t b,...

矩陣按行 列 求和CUDA並行演算法設計

通過矩陣按行求和與按列求和兩個示例介紹cuda並行演算法設計的思路,希望對大家有所幫助。很多公司cuda工程師面試也會考察這個題目。1.矩陣按行求和 矩陣a m n b m b i a 0 a 1 a n 1 序列 define a i j a i n j void sum row t a,t b,...