程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 多核編程中的負載平衡難題

多核編程中的負載平衡難題

編輯:關於PHP編程

多核CPU中,要很好地發揮出多個CPU的性能的話,必須保證分配到各個CPU上的任務有一個很好的負載平衡。否則一些CPU在運行,另外一些CPU處於空閒,無法發揮出多核CPU的優勢來。


  要實現一個好的負載平衡通常有兩種方案,一種是靜態負載平衡,另外一種是動態負載平衡。


  1、靜態負載平衡


  靜態負載平衡中,需要人工將程序分割成多個可並行執行的部分,並且要保證分割成的各個部分能夠均衡地分布到各個CPU上運行,也就是說工作量要在多個任務間進行均勻的分配,使得達到高的加速系數。


  靜態負載平衡問題從數學上來說是一個NP完全性問題,Richard M. Karp, Jeffrey D. Ullman, Christos H. Papadimitriou, M. Garey, D. Johnson等人相繼在1972年到1983年間證實了靜態負載問題在幾種不同約束條件下的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已經作出了一些努力,但是還需要更多的努力讓工具的功能更強大一些才能應對核數較多時的情況。


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved