求和例子總結
資料並行
其他任務劃分方法
假定已有求解問題的序列演算法,我們將 其改為並行版本
並行演算法與體系結構緊密相關!
設計乙個並行演算法
計算任務的分解
❑ 如何將平行計算工作分解,交由眾多程序/執行緒併發執行
保持依賴關係
❑ 計算結果與序列演算法保持一致
額外開銷
❑ 有多種型別的開銷,要盡量降低
競爭條件與資料依賴
執行結果依賴於兩個或更多事件的時序, 則存在競爭條件(race condition)資料依賴(data dependence)就是兩個內 存操作的序,為了保證結果的正確性,
必須保持這個序
同步(synchronization)用來將多個執行緒 的執行序列化,或是將併發資料訪問串 行化
n 個數求和的例子
1.序列演算法
sum = 0;
for (i = 0; i
< n; i++)
2. 並行演算法
版本1:計算任務劃分
假定每個核心計算連續n/t個元素的部分和(t為執行緒數或處理器數)
int block_length_per_thread = n/t;
int start = id * block_length_per_thread;
for (i=start; i...);
sum += x; }
分析1. 迴圈步之間的求和運算存在依賴→ 執行緒間依賴
❑ 但可以重排順序,因為加法運算滿足結合律
2. 取數-加法-存結果必須是原子操作,以保持結果與序列執行一致
3. 定義
原子性(atomicity):一組操作要麼全部執行要麼全不執行,則稱其是原子的。即不會得到部分執行的結果。
互斥(mutual exclusion):任何時刻都只有乙個執行緒在執行.
版本2:加鎖
插入互斥(mutex),保證任何時刻只有乙個執行緒讀數-加法-存結果——原子操作
int block_length_per_thread = n/t;
mutex m;
int start = id * block_length_per_thread;
for (i=start; i...); mutex_lock(m);
sum += my_x;
mutex_unlock(m);
}
版本3:粗粒度
在將區域性和加到全域性和時才加鎖
int block_length_per_thread = n/t;
mutex m;
int my_sum;
int start = id * block_length_per_thread;
for (i=start; i...);
my_sum += my_x;
}mutex_lock(m);
sum += my_sum;
mutex_unlock(m);
版本4:消除鎖
「主「執行緒完成部分和相加
int block_length_per_thread = n/t;
mutex m;
shared my_sum[t];
int start = id * block_length_per_thread;
for (i=start; i...);
my_sum[id] += my_x; }
if (id == 0)
synchronize_cores(); // 所有參與執行緒都設定障礙
if (id == 0) { // 主線程
sum = my_sum[0];
for (i=1; i版本6:多核並行求全域性和
求和例子總結如何設計並行演算法
任務並行
將求解問題的計算分解為任務,分配給多個核心
資料並行
並行演算法筆記(三) 並行演算法設計(二)
case1 並行歸併排序 對n個元素a 1 n 排序,則將a均勻分為p組,其中p為處理器個數,按如下過程排序 case2 歸併演算法 valiant歸併 對長度為p,q的有序陣列a和b歸併,則將a均勻分為p sqrt p 組,每組有p sqrt p 個元素,將b劃分為q sqrt q 組,每組q s...
並行演算法 並行演算法的設計技術和並行程式開發
目前普遍使用的並行演算法的設計技術 1 流水線技術 將任務分割成許多子任務,每個處理器完成其中乙個,且第乙個處理器完成第乙個子任務後,第二個處理器可以開始完成第二個子任務 2 分治策略 將原問題分成若干個特徵相同的子問題,分別處理。類似超執行緒技術 常見的分治策略 任務分割 資料分割 3 平衡樹方法...
並行演算法 並行演算法的初步認識
今年的課程中增加了,並行演算法的課程,我一看,一門課程都掛上 演算法 了,肯定厲害呀。這我可要認真學習它。我把我自己的見解和大家分享一下,要是有錯誤的地方一定要指出啊。這是我畫的乙個思維導圖,好像是什麼也看不出來。咱們按照順序乙個乙個的介紹哈。我不知道大家是什麼情況,我是從小學開始,學什麼都是從定理...