多核程式設計中的負載平衡難題
多核程式設計中的鎖競爭難題
多核程式設計的幾個難題及其應對策略(難題一)
openmp並行程式設計(二)
openmp並行程式設計(一)
雙核cpu上的快速排序效率
前面 多核程式設計中的鎖競爭難題
這篇文章中講過乙個多核程式設計中的序列化的難題,這篇文章中再來講解一下多核程式設計中的另外乙個難題,就是負載平衡方面的難題。
多核cpu中,要很好地發揮出多個cpu的效能的話,必須保證分配到各個cpu上的任務有乙個很好的負載平衡。否則一些cpu在執行,另外一些cpu處於空閒,無法發揮出多核cpu的優勢來。
要實現乙個好的負載平衡通常有兩種方案,一種是靜態負載平衡,另外一種是動態負載平衡。
1、靜態負載平衡
靜態負載平衡中,需要人工將程式分割成多個可並行執行的部分,並且要保證分割成的各個部分能夠均衡地分布到各個cpu上執行,也就是說工作量要在多個任務間進行均勻的分配,使得達到高的加速係數。
靜態負載平衡問題從數學上來說是乙個np完全性問題,richard m. karp, jeffrey d. ullman, christos h. papadimitriou, m. garey, d. johnson等人相繼在2023年到2023年間證明了靜態負載問題在幾種不同約束條件下的np完全性。
雖然np完全性問題在數學上是難題,但是這並不是標題中所說的難題,因為np完全性問題一般都可以找到很有效的近似演算法來解決。
2、動態負載平衡
動態負載平衡是在程式的執行過程中來進行任務的分配達到負載平衡的目的。實際情況中存在許多不能由靜態負載平衡解決的問題,比如乙個大的迴圈中,迴圈的次數是由外部輸入的,事先並不知道迴圈的次數,此時採用靜態負載平衡劃分策略就很難實現負載平衡。
動態負載平衡中對任務的排程一般是由系統來實現的,程式設計師通常只能選擇動態平衡的排程策略,不能修改排程策略,由於實際任務中存在很多的不確定因素,排程演算法無法做得很優,因此動態負載平衡有時可能達不到既定的負載平衡要求。
3、負載平衡的難題在那裡?
負載平衡的難題並不在於負載平衡的程度要達到多少,因為即使在各個cpu上分配的任務執行時間存在一些差距,但是隨著cpu核數的增多總能讓總的執行時間下降,從而使加速係數隨cpu核數的增加而增加。
負載平衡的困難之處在於程式中的可並行執行塊很多要靠程式設計師來劃分,當然cpu核數較少時,比如雙核或4核,這種劃分並不是很困難。但隨著核數的增加,劃分的粒度將變得越來越細,到了16核以上時,估計程式設計師要為如何劃分任務而抓狂。比如一段順序執行的**,放到128核的cpu上執行,要手工劃分成128個任務,其劃分的難度可想而知。
負載劃分的誤差會隨著cpu核數的增加而放大,比如乙個需要16個時間單位的程式分到4個任務上執行,平均每個任務上的負載執行時間為4個時間單位,劃分誤差為1個時間單位的話,那麼加速係數變成 16/(4+1)=3.2,是理想情況下加速係數 4的80%。但是如果放到乙個16核cpu上執行的話,如果某個任務的劃分誤差如果為0.5個時間單位的話,那麼加速係數變成16/(1+0.5) = 10.67,只有理想的加速係數16的66.7%,如果核數再增加的話,由於誤差的放大,加速係數相比於理想加速係數的比例還會下降。
負載劃分的難題還體現在cpu和軟體的公升級上,比如在4核cpu上的負載劃分是均衡的,但到了8核、16核上,負載也許又變得不均衡了。軟體公升級也一樣,當軟體增加功能後,負載平衡又會遭到破壞,又需要重新劃分負載使其達到平衡,這樣一來軟體設計的難度和麻煩大大增加了。
如果使用了鎖的話,一些看起來是均衡的負載也可能會由於鎖競爭變得不平衡起來,詳細情況請看:
4、負載平衡的應對策略
對於運算量較小的軟體,即使放到單核cpu上執行速度也很快,負載平衡做得差一些並沒有太大影響,實際中負載平衡要考慮的是大運算量和規模很大的軟體,這些軟體需要在多核上進行負載平衡才能較好地利用多核來提高效能。
對於大規模的軟體,負載平衡方面採取的應對策略是發展劃分並行塊的巨集觀劃分方法,從整個軟體系統層面來進行劃分,而不是象傳統的針對某些區域性的程式和演算法來進行並行分解,因為區域性的程式通常都很難分解成幾十個以上的任務來執行。
另外乙個應對策略是在工具層面的,也就是編譯工具能夠協助人工進行並行塊的分解,並找出良好的分解方案來,這方面intel已經作出了一些努力,但是還需要更多的努力讓工具的功能更強大一些才能應對核數較多時的情況。
參考資料:《並行程式設計模式》timothy mattson等著 敖富江譯
《平行計算綜論》jack dongarra等編著 莫則堯等譯
《並行程式設計》barry wilkinson等著 陸鑫達等譯
《多核程式設計技術》shameem akhter等著 李寶峰等譯
《並行演算法實踐》 陳國良等編著
多核程式設計中的負載平衡難題
多核程式設計中的負載平衡難題 多核程式設計中的鎖競爭難題 多核程式設計的幾個難題及其應對策略 難題一 openmp並行程式設計 二 openmp並行程式設計 一 雙核cpu上的快速排序效率 前面 多核程式設計中的鎖競爭難題 這篇文章中講過乙個多核程式設計中的序列化的難題,這篇文章中再來講解一下多核程...
多核程式設計中的負載平衡難題
多核程式設計中的負載平衡難題 多核程式設計中的鎖競爭難題 多核程式設計的幾個難題及其應對策略 難題一 openmp並行程式設計 二 openmp並行程式設計 一 雙核cpu上的快速排序效率 前面 多核程式設計中的鎖競爭難題 這篇文章中講過乙個多核程式設計中的序列化的難題,這篇文章中再來講解一下多核程...
多核程式設計中的負載平衡難題
多核程式設計中的負載平衡難題 多核程式設計中的鎖競爭難題 多核程式設計的幾個難題及其應對策略 難題一 openmp並行程式設計 二 openmp並行程式設計 一 雙核cpu上的快速排序效率 前面 多核程式設計中的鎖競爭難題 這篇文章中講過乙個多核程式設計中的序列化的難題,這篇文章中再來講解一下多核程...