新聞中心

        EEPW首頁 > 嵌入式系統 > 學習方法與實踐 > 多核編程的幾個難題及其應對策略

        多核編程的幾個難題及其應對策略

        ——
        作者:周偉明 時間:2007-12-21 來源:周偉明blog 收藏
               隨著CPU的出世,方面的問題將擺上了程序員的日程,有許多老的程序員以為早就有多CPU的機器,業界在多CPU機器上的已經積累了很多經驗,CPU上的應該差不多,只要借鑒以前的多任務編程、并行編程和并行算法方面的經驗就足夠了。

               我想說的是,多核機器和以前的多CPU機器有很大的不同,以前的多CPU機器都是用在特定領域,比如服務器,或者一些可以進行大型并行計算的領域,這些領域很容易發揮出多CPU的優勢,而現在多核機器則是應用到普通用戶的各個層面,特別是客戶端機器要使用多核CPU,而很多客戶端軟件要想發揮出多核的并行優勢恐怕沒有服務器和可以進行大型并行計算的特定領域簡單。

              這次參加CSDN大會時和孟巖先生聊起多核編程時,孟巖先生對多核編程的前途感覺到很悲觀,和去年見到他時對多核編程的前景看法完全發生了改變。想來孟巖先生對多核編程方面有了很深刻的理解,由于時間問題,沒能和孟巖先生在這方面深入聊下去。在回來的路上,我重新思考了一下關于多核編程方面的困難之處,今天回到家趕緊把它寫了下來,貼出來分享給大家。

              一:串行化方面的
             1)加速系數
             衡量多處理器系統的性能時,通常要用到的一個指標叫做加速系數,定義如下:
        S(p) = 使用單處理器執行時間(最好的順序算法)/ 使用具有p個處理器所需執行時間
             2)阿姆爾達定律
             并行處理時有一個阿姆爾達定律,用方程式表示如下:
        S(p) = p / (1 + (p-1)*f)
        其中 S(p)表示加速系數
        p表示處理器的個數
        f表示串行部分所占整個程序執行時間的比例
        當f = 5%, p = 20時, S(p) = 10.256左右
        當f = 5%, p = 100時, S(p) = 16.8左右
        也就是說只要有5%的串行部分,當處理器個數從20個增加到100個時,加速系數只能從10.256增加到16.8左右,處理器個數增加了5倍,速度只增加了60%多一點。即使處理器個數增加到無窮多個,加速系數的極限值也只有20。
         
              如果按照阿姆爾達定律的話,可以說多核方面幾乎沒有任何發展前景,即使軟件中只有1%的不可并行化部分,那么最大加速系統也只能到達100,再多的CPU也無法提升速度性能。按照這個定律,可以說多核CPU的發展讓摩爾定律延續不了多少年就會到達極限。

              3)Gustafson定律


              Gustafson提出了和阿姆爾達定律不同的假設來證明加速系數是可以超越阿姆爾達定律的限制的,Gustafson認為軟件中的串行部分是固定的,不會隨規模的增大而增大,并假設并行處理部分的執行時間是固定的(服務器軟件可能就是這樣)。Gustafson定律用公式描述如下:
        S(p) = p + (1-p)*fts
        其中fts表示串行執行所占的比例
        如果串行比例為5%,處理器個數為20個,那么加速系數為20+(1-20)*5%=19.05
        如果串行比例為5%,處理器個數為100個,那么加速系數為100+(1-100)*5%=95.05
        Gustafson定律中的加速系數幾乎跟處理器個數成正比,如果現實情況符合Gustafson定律的假設前提的話,那么軟件的性能將可以隨著處理個數的增加而增加。

              4)實際情況中的串行化分析
        阿姆爾達定律和Gustafson定律的計算結果差距如此之大,那么現實情況到底是符合那一個定律呢?我個人認為現實情況中既不會象阿姆爾達定律那么悲觀,但也不會象Gustafson定律那么樂觀。為什么這樣說呢?還是進行一下簡單的分析吧。 


              首先需要確定軟件中到底有那么內容不能并行化,才能估計出串行部分所占的比例,20世紀60年代時,Bernstein就給出了不能進行并行計算的三個條件:


              條件1:C1寫某一存儲單元后,C2讀該單元的數據。稱為“寫后讀”競爭
              條件2:C1讀某一存儲單元數據后,C2寫該單元。稱為“讀后寫”競爭
              條件1:C1寫某一存儲單元后,C2寫該單元。稱為“寫后寫”競爭滿足以上三個條件中的任何一個都不能進行并行執行。不幸的是在實際的軟件中大量存在滿足上述情況的現象,也就是我們常說的共享數據要加鎖保護的問題。


              加鎖保護導致的串行化問題如果在任務數量固定的前提下,串行化所占的比例是隨軟件規模的增大而減小的,但不幸的是它會隨任務數量的增加而增加,也就是說處理器個數越多,鎖競爭導致的串行化將越嚴重,從而使得串行化所占的比例隨處理器個數的增加而急劇增加。(關于鎖競爭導致的串行化加劇情況我會在另一篇文章中講解)。所以串行化問題是多核編程面臨的一大

              5)可能的解決措施


              對于串行化方面的難題,首先想到的解決措施就是少用鎖,甚至采用無鎖編程,不過這對普通程序員來說幾乎是難以完成的工作,因為無鎖編程方面的算法太過于復雜,而且使用不當很容易出錯,許多已經發表到專業期刊上的無鎖算法后來又被證明是錯的,可以想象得到這里面的難度有多大。


              第二個解決方案就是使用原子操作來替代鎖,使用原子操作本質上并沒有解決串行化問題,只不過是讓串行化的速度大大提升,從而使得串行化所占執行時間比例大大下降。不過目前芯片廠商提供的原子操作很有限,只能在少數地方起作用,芯片廠商在這方面可能還需要繼續努力,提供更多功能稍微強大一些的原子操作來避免更多的地方的鎖的使用。

              第三個解決方案是從設計和算法層面來縮小串行化所占的比例。也許需要發現實用的并行方面的設計模式來縮減鎖的使用,目前業界在這方面已經積累了一定的經驗,如任務分解模式,數據分解模式,數據共享模式,相信隨著多核CPU的大規模使用將來會有更多的新的有效的并行設計模式和算法冒出來。


              第四個解決方案是從芯片設計方面來考慮的,由于我對芯片設計方面一無所知,所以這個解決方案也許只是我的一廂情愿的猜想。主要的想法是在芯片層面設計一些新的指令,這些指令不象以前單核CPU指令那樣是由單個CPU完成的,而是由多個CPU進行并行處理完成的一些并行指令,這樣程序員調用這些并行處理指令編程就象編寫串行化程序一樣,但又充分利用上了多個CPU的優勢。
         
              作者介紹:周偉明,自由職業,從事軟件行業十年有余。目前主要關注軟件測試、多核編程、軟件設計等基礎方面的內容。寫有《多任務下的數據結構與算法》一書,目前正在寫作《軟件測試實踐》一書,計劃在不久的將來寫一本多核編程方面的書籍。
         
              參考資料:《并行編程模式》Timothy Mattson等著 敖富江譯
                 《并行計算綜論》Jack Dongarra等編著 莫則堯等譯 
                 《并行程序設計》Barry Wilkinson等著 陸鑫達等譯 
                 《多核程序設計技術》Shameem Akhter等著 李寶峰等譯
                 《并行算法實踐》 陳國良等編著

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)
        加速度計相關文章:加速度計原理


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 徐闻县| 遂平县| 石泉县| 彩票| 东台市| 新营市| 雷州市| 皮山县| 景宁| 南投县| 平阳县| 沁阳市| 治县。| 林州市| 绩溪县| 锡林郭勒盟| 绥江县| 阳朔县| 福清市| 岢岚县| 黑水县| 元谋县| 黄浦区| 曲麻莱县| 社旗县| 武川县| 梅州市| 合作市| 黄浦区| 确山县| 新源县| 四子王旗| 东安县| 康马县| 栾城县| 嘉定区| 常州市| 嘉善县| 温州市| 库伦旗| 九台市|