TAwdah定理在多核時代的影響

    阿姆達爾定律是計算機系統設計的重要定量原理之一,於1967年由IBM360系列機的主要設計者阿姆達爾首先提出。該定律是指:系統中對某一部件採用更快執行方式所能獲得的系統性能改進程度,取決於這種執行方式被使用的頻率,或所佔總執行時間的比例。阿姆達爾定律實際上定義了採取增強(加速)某部分功能處理的措施後可獲得的性能改進或執行時間的加速比。簡單來說是通過更快的處理器來獲得加速是由慢的系統組件所限制。

阿姆達爾曾致力於並行處理系統的研究。對於固定負載情況下描述並行處理效果的加速比s,阿姆達爾經過深入研究給出瞭如下公式:
S=1/(a+(1-a)/n)
其中,a爲串行計算部分所佔比例,n爲並行處理結點個數。這樣,當a=0時,最大加速比s=n;當a=1時,最小加速比s=1;當n→∞時,極限加速比s→ 1/a,這也就是加速比的上限。例如,若串行代碼佔整個代碼的25%,則並行處理的總體性能不可能超過4。這一公式已被學術界所接受,並被稱做“阿姆達爾定律”(Amdahl law)。

阿姆達爾定律角度評價多核的發展趨勢

在過去的很多年裏,軟件性能的提升很大程度上源自處理器速度的增長。軟件工程師面對客戶抱怨說軟件運行得太慢的通常回答是:升級你的系統。

然而現在由於處理器速度逐漸逼近物理極限,繼續提高處理器的時鐘速度會導致發熱量顯著增加,甚至核心熔化。江郎才盡的硬件工程師想出了一個能保住自己飯碗的辦法:既然不能提高單個核心的速度,那就在一個處理器裏面封裝多個核心。於是我們進入了多核處理器的時代。

今天,隨着多核處理器的發展,計算領域正在發生具有革命性影響的轉變。

一、多核處理器的產生

CPU從誕生之日起,主頻就在不斷的提高,如今主頻之路已經走到了拐點。桌面處理器的主頻在2000年達到了1GHz2001年達到2GHz2002年達到了3GHz。但是處理器主頻的提升速度已經放慢。電壓和發熱量成爲最主要的障礙,導致在桌面處理器特別是筆記本電腦方面,IntelAMD無法再通過簡單提升時鐘頻率就可設計出下一代的新CPU

面對主頻之路走到盡頭,IntelAMD開始尋找其它方式用以在提升能力的同時保持住或者提升處理器的能效,而最具實際意義的方式是增加CPU內處理核心的數量。

多核處理器指的是在一個處理器上集成多個運算核心,從而提高計算能力。同時,爲充分發揮多核的優勢,內存訪問、中斷處理、總線結構等相關單元也做了大量的修改,多核展現在人們面前的是一個全新的體系架構,在CPU處理、內存訪問、IO總線、中端分配機制等方面都有了長足進步,加上多核與生俱來的並行能力正好滿足更高性能、更多功能的需求。

多核處理器最初的開發在很大程度上要歸功於CMOS光刻印刷工藝的持續進步。衆所周知,隨着CPU 核心的尺寸/帶寬的不斷提升,很快就會造成投資回報的遞減。因此,當核心的尺寸工藝收縮到一個小尺度上後,出於成本方面的考慮,芯片製造商通常的選擇有如下三種:生產更小的芯片、增加大量緩存、增加更多核心。當然,增加更多內存帶寬也是一種方法,但會導致處理器芯片之外的成本也會大幅增加,如修改主板(可能需要更多的PCB層)、增加DIMM插槽等。跟傳統的單核CPU相比,多核CPU帶來了更強的並行處理能力、更高的計算密度和更低的時鐘頻率,並大大減少了散熱和功耗。目前,在幾大主要芯片廠商的產品線中,雙核、四核甚至八核CPU已經佔據了主要地位。

通過劃分任務,線程應用能夠充分利用多個執行內核,並可在特定的時間內執行更多任務。多核處理器是單枚芯片(也稱爲硅核),能夠直接插入單一的處理器插槽中,但操作系統會利用所有相關的資源,將它的每個執行內核作爲分立的邏輯處理器。通過在兩個執行內核之間劃分任務,多核處理器可在特定的時鐘週期內執行更多任務。多核架構能夠使目前的軟件更出色地運行,並創建一個促進未來的軟件編寫更趨完善的架構。

多核處理器本身是單核系統達到物理極限而出現的,但是多核處理器本身也有性能提升的限制因素。這個限制因素又引導着多核技術發展的趨勢。充分發掘多核處理器的潛力,提升多核處理器的性能,必須使這個限制因素的影響降到最低。

二、阿姆達爾定律指示的限制因素

現在犯難的就是軟件工程師了:沒有了處理器速度不斷提升的免費便車,接下來不得不面對的問題就是如何有效地利用處理器裏面的多個核,也就是並行計算。

然而多核面對一個似乎無法迴避的難題:阿姆達爾定律(Amdahl's Law)。

阿姆達爾定律告訴我們:系統中某一部件由於採用某種更快的執行方式後整個系統性能的提高與這種執行方式使用頻率佔總執行時間的比例有關。由於採用特殊的方法所能獲得的加速比爲: 

在多核處理器中加速比是衡量並行程序性能的一個重要參數,定義爲Speedup=使用單處理器執行時間/使用多處理器執行時間。根據阿姆達爾定律: 

其中,s是系統中串行執行部分佔整個系統的比例,n是多核處理器中核的數目。當s=5%時,8核的加速比爲5.93倍,16核的加速比爲9.14倍,與理想狀態的8倍、16倍有不小的差距。當s=30%時,8核的加速比僅有2.58倍,16核的加速比僅有2.91倍,完全沒有發揮多核的優勢。更加糟糕的是,實際情況往往比Amdahl定律給出的結果更差。考慮到核間交互帶來的額外開銷,核間同步影響整個系統的併發處理,設計糟糕的系統在多核下甚至比單核下的性能還要低得多。

n趨近於無窮大時(即假設我們有無窮多個核心),速度提升的上限是 1/s,即速度提升的上限取決於程序不能被並行計算的部分。

這個定律的結果就是,即便我們能夠有效地並行計算一個程序的95%,剩下 5%只能串行計算的部分限制了這個程序的運行速度最多能提升1/5%=20倍。而現有的程序中很少能夠做到95%以上部分的並行計算。

而且,如果你想在一個並行、線程化的應用中使用不只一個內核,就需要某種通信/同步,而且,對於一個固定的工作負載,通信/同步開銷是作業所用 CPU 內核數量的單調遞增函數。由此,我們需要對阿姆達爾定律做些簡單修改: 

其中,T爲解決某計算問題所需的總時間,Ts是完成串行工作所需的時間,Tp 是完成所有並行工作所需的時間,N是並行工作中所使用的處理器數量,To是每顆處理器的通信與同步開銷。T正是傳統阿姆達爾定律公式中所沒有的——隨着處理器的增多,總開銷也會增加。

在沒有引入通信/同步開銷的傳統標準模型中,總時間T就是處理器數N的一個單調遞減函數,會逐漸接近於Ts。而在修改後的公式中,我們很清楚地看到,由於存在通信開銷,隨着處理器數N的增加,在達到某一臨界點後,總時間T就會開始增加。因此,對於一個完全並行的應用 (Ts=0)來說,其所需處理器的最優數量是: 

因此,能否有效降低串行執行比例和降低交互開銷決定了能否充分發揮多核的性能,其中的關鍵在於:合理劃分任務、減少核間通信。這正是當今多核處理器的發展趨勢。

三、多核的發展趨勢

根據阿姆達爾定律,我們知道爲了提升多核處理器的性能,合理劃分任務和減少核間通信是關鍵點。

1.合理劃分任務

整個系統任務可以按數據、功能等多個維度劃分爲若干子任務,分別由不同的核來執行這些子任務。

數據分解,把不同的數據報文交給不同的核處理。比如,可以按照接收數據報文的接口來劃分任務,不同接口的數據報文由不同的核處理,可以避免不同網段的流量競爭處理器資源,也可以用來保障核心業務。另一種可能的方案是按協議類型來區分,由一到多個核處理HTTP協議,其它核處理其它協議。

功能分解,把不同的功能交給不同的核處理。比如,其中一個核專門負責加解密報文處理,另一個核專門負責病毒掃描等。

靜態調度,相同的核永遠處理相同的任務。靜態調度算法不涉及到任務切換,因此係統開銷較小,但存在任務分配不公平的情況。

動態調度,同一個核可能處理不同的任務。採用動態調度算法的系統可以根據每個核的實際負載情況動態分配任務,這樣可以最大限度的利用每個核的處理能力。

合理的任務分解方案使得不同任務相對獨立,既降低了串行執行比例,也減少了核間通信的需求。

2.減少核間通信

減少核間通信的技術主要包括異步並行、無鎖編程等技術。

異步並行技術與同步並行技術相對應。後者是同步處理的一般模式,指的是一個核執行任務到某個時刻必須與其它核進行數據交換,然後才能繼續進行;前者是對同步處理的優化,數據交換不必嚴格在某個時刻進行,可以集中進行數據交換,從而減少交互的次數和時間。

無鎖編程是減少核間通信的另一個思路,通過精心設計的數據結構,兩個核可以完全不進行任務同步,同時又能協同進行工作。

四、多核處理器對軟件設計的挑戰

實際上阿姆達爾定律存在的問題是隻假定並行系統處理一個固定規模的問題,在這種情況下,再增加處理器當然沒有意義。但如果把問題規模隨着機器規模一起變大,加速比仍然可以變大。

多核處理器的出現實際上是一次計算方式的革命。爲了順應多核處理器的性能,增加程序的並行性是提升系統性能的有效手段。我們不得不面對併發和並行操作這些通常是並行計算的專業人員和高端用戶才需要面對的問題。

現在纔不過幾個核,大家還不必太害怕,將來我們可能會面臨幾百個核,簡直是核的海洋,這種情況甚至連搞並行計算的專家都感到害怕和麻煩。一個機器裏那麼多核,怎麼去很好的利用?這肯定是大家首先冒出來的一個問題。本來並行計算就很難了,再放那麼多核就更困難了。

其實90年代末就已經有人在做多核處理器的研究,其思路是把功能簡單的處理器用網絡連接起來,互相協作來解決延遲的問題。比較早的是RAW處理器,由美國MIT大學開發,是我們目前稱爲Tile結構處理器的先驅。

現在比較熱的一個Tile結構處理器研究項目叫TRIPS,其目標是實現單處理器一個週期達到萬億次操作且可靠、智能自適應的目標。但Trips所採用的體系結構與傳統的馮諾依曼體系有所不同,不是目前流行的指令流驅動,而是數據流驅動(顯示數據圖執行EDGE),以數據的到達作爲指令執行的觸發標誌,而不是根據用戶或編譯器預先規定好的指令順序來執行。該處理器每週期可以調度一個包含128條指令的指令塊映射到執行單元的網格上執行,且可以通過多態重組合的功能挖掘包括指令級並行、線程並行和數據並行等多層次的並行,從而適應不同的應用需求。該處理器2006年已經推出原型系統,是目前比較被看好的未來處理器的一個發展方向。

一般來說,並行程序設計模型主要分兩大類,一類是共享存儲模型,一類是消息傳遞模型。共享存儲模型主要是採用多線程,其主要程序開發環境是已經成爲事實工業標準的OpenMP和早期的Posix Threads,目前主要是商業編譯器如Intel等的C++Fortran編譯器提供對該語言的支持,而gcc等開源編譯器尚不能支持OpenMP

對於多核來說,馬上可以用的標準程序設計環境恐怕就是OpenMP了。而雖然可用但對一般用戶來說比較困難的是消息傳遞開發環境包括MPIPVM(目前以很少使用)等,此類開發環境是開源的,可以免費下載。其中最常用的兩個MPI標準實現是MPICH(目前是MPICH2,是MPI 2.0標準的實現,用以取代MPI 1.0版本)和LAM/MPI。其中的LAM/MPI也在從MPI1.0版本向MPI 2.0版本,其下一代軟件的名稱爲Open MPI,已經發布了正式版本。此外,由於現有機器體系結構層次非常複雜,還可以把上面幾種並行設計環境和向量並行等混合使用,充分挖掘機器的性能潛力,我們通常稱之爲混合並行。

實際上,並行算法的設計目標是挖掘問題求解過程中的並行性,尋求並行算法與並行機器體系結構的最佳匹配和映射,合理組織並行任務,減少額外消息傳遞和數據移動開銷。總體來說,開發一個並行程序可以有三種途徑,一個途徑是串行程序自動並行化。這條路目前還沒走通,大家認爲更爲實際的目標應該是人機交互的自動並行化。

第二條途徑是設計全新的並行程序設計語言。但它有一個致命的缺點就是需要全部改寫原來的程序,對用戶來說就很痛苦了,成本和風險也很高,且效率沒有保證。但是,隨着多核的出現,如果面向大衆推廣並行計算環境的話,就必須有一種新的大衆容易接受的程序設計語言,否則很難推廣普及。目前國際上正在研究幾種新的並行程序設計語言。

第三條途徑就是串行語言加並行庫或僞註釋制導語句的擴展,實際上就是增加一個庫或一些新的制導語句來幫助進行消息傳遞和並行。這正是MPIOpenMP所採取的途徑。目前也是比較容易被接受且性能高的途徑。但其程序開發效率很低,難度也比較大。

隨着處理器體系結構變得越來越複雜,從語言到機器硬件的鴻溝越來越大了,需要程序設計語言對底層體系結構進行高度抽象,使用戶的程序設計變得簡單高效,同時又不損失過多性能。編譯器就需要做很多工作來彌補這個鴻溝。

實際上並行不是目標,我們並不願意去並行,而是一種無奈的妥協。並行程序設計不但困難而且容易出錯。

我們什麼時候能不需要並行呢?當然最好是繼續增加處理器的主頻,我們看到IBM公司的Power6處理器就突破了4GHz的主頻限制,在2007年發佈時,其主頻達到5GHz,並支持十進制運算(實際上,當計算機將十進制轉換成二進制進行計算,然後再將計算結果轉換成十進制時,就會出現計算精度問題;但目前十進制計算的速度仍然不及二進制),爲繼續通過提高主頻提升性能打開了突破口;還有一個途徑就是出現革命性的新的計算技術如量子計算等。

實際上,當前並行計算的現狀是部分程序員可以進行並行編程,且大部分程序是MPI程序,OpenMP有一定比例。服務器程序大部分採用多線程。但大部分普通應用都還是串行的。

當前國際上對新一代並行程序設計語言的研究正日漸升溫。其中美國HPCS項目(高生產率計算系統)資助開發的新的高生產率並行編程語言有三種,分別屬於三個公司,包括IBMX10SUN公司的FortressCray公司的Chapel。這三個語言目前還處在原型開發階段,大規模推廣還需要時間。

此外,還有一類稱爲分割全局地址空間系統(PGAS)的並行程序設計語言,包括UPCUnified Parallel CC語言的擴展)、CAFCo-Array FortranFortran的擴展)和TitanminJava的擴展),目前已經開始在部分實際項目中得到應用,且效果不錯。

五、多核處理器的性能優化

多核性能優化的方法:收集數據分析數據、設計方案、實現方案、測試方案、收集數據……如此循環往復。

多核性能優化是個長期過程,不可能一蹴而就。首先,需要對系統進行全面的分析,弄清楚系統瓶頸到底在哪裏:處理器瓶頸,內存瓶頸,還是IO瓶頸。進一步確定是任務劃分不合理還是同步處理不合適等,設計相應的方案,再次測試,逐步優化。

應對多核處理器的軟件開發,可以有幾種解決思路,包括硬件隱藏、自動並行、OpenMP多線程、MPI優化、新並行語言等。一些新的高生產率和支持全局地址空間的並行程序語言已經出現了,而且正在快速發展,對我們應對多核處理器的挑戰提供了可能的最終解決途徑。

六、總結

    多核處理器思路的出現源自CPU主頻和功率等的物理極限。通過阿姆達爾定律可以十分清楚地知道多核處理器的性能受到那些因素的限制,即串行執行比例和交互開銷。所以多核處理器的發展趨勢是合理劃分任務、減少核間通信以及加強程序的並行性。這幾個方面都已經有一些成果,但總體上還處於探索之中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章