多核程式設計中的鎖競爭現象
多核程式設計中的負載平衡難題
多核程式設計的幾個難題及其應對策略(難題一)
openmp並行程式設計(二)
openmp並行程式設計(一)
雙核cpu上的快速排序效率
在前一篇講解多核程式設計的幾個難題及其對策(難題一)的文章中提到了鎖競爭會讓序列化隨cpu的核數增多而加劇的現象,這篇文章就來對多核程式設計的鎖競爭進行深入的分析。
為了簡化起見,我們先看乙個簡單的情況,假設有4個對等的任務同時啟動執行,假設每個任務剛開始時有乙個需要鎖保護的操作,耗時為1,每個任務其他部分的耗時為25。這幾個任務啟動執行後的運**況如下圖所示:
圖1:對等任務的鎖競爭示意圖
在上圖中,可以看出第1個任務直接執行到結束,中間沒有等待,第2個任務等待了1個時間單位,第3個任務等待了2個時間單位,第3個任務等待了3個時間單位。
這樣有3個cpu總計等待了6個時間單位,如果這幾個任務是採用openmp裡的所有任務都在同一點上進行等待到全部任務執行完再向下執行時,那麼總的執行時間將和第四個任務一樣為29個時間單位,加速係數為:(1+4×25)/ 29 = 3.48
即使以4個任務的平均時間27.5來進行計算,加速係數=101/27.5 = 3.67
按照阿姆爾達定律來計算加速係數的話,上述應用中,序列時間為1,並行處理的總時間轉化為序列後為100個時間單位,如果放在4核cpu上執行的話,加速係數=p / (1 + (p-1)*f) = 4/(1+(4-1)*1/101) = 404/104 = 3.88
這就產生了乙個奇怪的問題,使用了鎖之後,加速係數連阿姆爾達定律計算出來的加速係數都不如,更別說用
gustafson
定律計算的加速係數了。
其實可以將上面
4個任務的鎖競爭情況推廣到更一般的情況,假設有鎖保護的序列化時間為
1,可並行化部分在單核
cpu上的執行時間為t,
cpu核數為
p,那麼在
p個對成任務同時運**況下,鎖競爭導致的總等待時間為:1+
2+…+
p =p*(p-1)/2
耗時最多的乙個任務所用時間為:
p + t/p
使用耗時最多的乙個任務所用時間來當作並行執行時間的話,加速係數如下
s(p) = (t+1) / (p + t/p) = p*(t+1) / (p*p+t)(鎖競爭下的加速係數公式)
這個公式表明在有鎖競爭情況下,如果核數固定情況下,可並行化部分越大,那麼加速係數將越大。在並行化時間固定的情況下,如果
cpu核數越多,那麼加速係數將越小。
還是計算幾個實際的例子來說明上面公式的效果:
令t=100, p=4,
加速係數=4×(
100 +1)/ (4*4+100) = 3.48
令t=100, p=16,
加速係數=
16×(
100+1) / (16*16+100) = 4.54
令t=100, p=64,
加速係數=
64×(
100+1) / (64*64+100) = 1.54
令t=100, p=128,
加速係數=
128×(
100+1) / (128*128+100) = 0.78
從以上計算可以看出,當核數多到一定的時候,加速係數不僅不增加反而下降,核數增加到
128時,加速係數只有
0.78
,還不如在單核
cpu上執行的速度。
上面的例子中,鎖保護導致的序列**是在任務啟動時呼叫的,其實對等任務中在其他地方呼叫的鎖保護的序列**也是一樣的。
對等型任務的鎖競爭現象在實際情況中是很常見的,比如伺服器軟體,通常各個客戶端處理任務都是對等的,如果在裡面使用了鎖的話,那麼很容易造成上面說的加速係數隨
cpu核數增多而下降的現象。
以前的伺服器軟體一般執行在雙
cpu或四
cpu機器上,所以鎖競爭導致的加速係數下降現象不明顯,進入多核時代後,隨著
cpu核數的增多,這個問題將變得很嚴重,所以多核時代對程式設計提出了新的挑戰。以前的多工下的程式設計思想放到多核程式設計上不一定行得通。
所以簡單地認為多核程式設計和以前的多工程式設計或平行計算等同的話是不切實際的,在講序列化難題的那篇文章中提出了一些解決方面的對策,但是那些對策還有待業界繼續努力才能做得到。
當然由於目前市面上銷售的多核cpu還是雙核和四核的,等到16核以上的cpu大規模進入市場可能還有幾年時間,相信業界在未來的幾年內能夠對於上面對等任務上的鎖競爭問題找到更好的解決方案。
作者介紹:周偉明,自由職業,從事軟體行業十年有餘。目前主要關注軟體測試、多核程式設計、軟體設計等基礎方面的內容。寫有《多工下的資料結構與演算法》一書,目前正在寫作《軟體測試實踐》一書,計畫在不久的將來寫一本多核程式設計方面的書籍。
多核程式設計中的鎖競爭難題
多核程式設計中的鎖競爭現象 多核程式設計中的負載平衡難題 多核程式設計的幾個難題及其應對策略 難題一 openmp並行程式設計 二 openmp並行程式設計 一 雙核cpu上的快速排序效率 在前一篇講解多核程式設計的幾個難題及其對策 難題一 的文章中提到了鎖競爭會讓序列化隨cpu的核數增多而加劇的現...
多核程式設計中的鎖競爭難題
多核程式設計中的鎖競爭現象 多核程式設計中的負載平衡難題 多核程式設計的幾個難題及其應對策略 難題一 openmp並行程式設計 二 openmp並行程式設計 一 雙核cpu上的快速排序效率 在前一篇講解多核程式設計的幾個難題及其對策 難題一 的文章中提到了鎖競爭會讓序列化隨cpu的核數增多而加劇的現...
多核程式設計中的鎖競爭難題
多核程式設計中的鎖競爭現象 多核程式設計中的負載平衡難題 多核程式設計的幾個難題及其應對策略 難題一 openmp並行程式設計 二 openmp並行程式設計 一 雙核cpu上的快速排序效率 在前一篇講解多核程式設計的幾個難題及其對策 難題一 的文章中提到了鎖競爭會讓序列化隨cpu的核數增多而加劇的現...