描述:系統中某部件因爲採用某種方式使系統性能改進後,整個系統性能的提升與該方式的使用頻率或佔總的執行時間的比例有關。 程序員
主要應用:改善「系統瓶頸」性能。 算法
Amdahl定律定義了加速比: 編程
加速比=採用改進措施後性能/未採用改進措施前的性能 緩存
=未採用改進措施前執行某任務時間/採用改進措施後執行某任務的時間 性能優化
n個處理器加速因子S=n/[1+(n-1)f]:f爲非平行百分比,n越大,S不能超過1/f 服務器
歸納地講,阿姆達爾定律並不否認並行計算的價值。相反,它提醒咱們要想達到並行性能就必須考慮整個程序。 網絡
而對於不熟悉計算機的讀者來講,能夠用一下比較恰當的比喻使讀者可以更加清楚的理解這個定律:一我的從A到B須要走一個肯定的路程,爲60千米。但他在前30千米的速度爲20km/h,因此不管他在後半程怎麼加速,整個行程的平均速度也達不到60km/h。 數據結構
在過去的不少年裏,軟件性能的提高很大程度上源自處理器速度的增加。軟件工程師面對客戶抱怨說軟件運行得太慢的一般回答是:升級你的系統。
然而如今因爲處理器速度逐漸逼近物理極限,繼續提升處理器的時鐘速度會致使發熱量顯著增長,甚至核心熔化。江郎才盡的硬件工程師想出了一個能保住本身飯碗的辦法:既然不能提升單個核心的速度,那就在一個處理器裏面封裝多個核心。因而咱們進入了多核處理器的時代。
今天,隨着多核處理器的發展,計算領域正在發生具備革命性影響的轉變。
CPU從誕生之日起,主頻就在不斷的提升,現在主頻之路已經走到了拐點。桌面處理器的主頻在2000年達到了1GHz,2001年達到2GHz,2002年達到了3GHz。可是處理器主頻的提高速度已經放慢。電壓和發熱量成爲最主要的障礙,致使在桌面處理器特別是筆記本電腦方面,Intel和AMD沒法再經過簡單提高時鐘頻率就可設計出下一代的新CPU。
面對主頻之路走到盡頭,Intel和AMD開始尋找其它方式用以在提高能力的同時保持住或者提高處理器的能效,而最具實際意義的方式是增長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了。而雖然可用但對通常用戶來講比較困難的是消息傳遞開發環境包括MPI和PVM(目前以不多使用)等,此類開發環境是開源的,能夠免費下載。其中最經常使用的兩個MPI標準實現是MPICH(目前是MPICH2,是MPI 2.0標準的實現,用以取代MPI 1.0版本)和LAM/MPI。其中的LAM/MPI也在從MPI1.0版本向MPI 2.0版本,其下一代軟件的名稱爲Open MPI,已經發布了正式版本。此外,因爲現有機器體系結構層次很是複雜,還能夠把上面幾種並行設計環境和向量並行等混合使用,充分挖掘機器的性能潛力,咱們一般稱之爲混合並行。
實際上,並行算法的設計目標是挖掘問題求解過程當中的並行性,尋求並行算法與並行機器體系結構的最佳匹配和映射,合理組織並行任務,減小額外消息傳遞和數據移動開銷。整體來講,開發一個並行程序能夠有三種途徑,一個途徑是串行程序自動並行化。這條路目前還沒走通,你們認爲更爲實際的目標應該是人機交互的自動並行化。
第二條途徑是設計全新的並行程序設計語言。但它有一個致命的缺點就是須要所有改寫原來的程序,對用戶來講就很痛苦了,成本和風險也很高,且效率沒有保證。可是,隨着多核的出現,若是面向大衆推廣並行計算環境的話,就必須有一種新的大衆容易接受的程序設計語言,不然很難推廣普及。目前國際上正在研究幾種新的並行程序設計語言。
第三條途徑就是串行語言加並行庫或僞註釋制導語句的擴展,實際上就是增長一個庫或一些新的制導語句來幫助進行消息傳遞和並行。這正是MPI和OpenMP所採起的途徑。目前也是比較容易被接受且性能高的途徑。但其程序開發效率很低,難度也比較大。
隨着處理器體系結構變得愈來愈複雜,從語言到機器硬件的鴻溝愈來愈大了,須要程序設計語言對底層體系結構進行高度抽象,使用戶的程序設計變得簡單高效,同時又不損失過多性能。編譯器就須要作不少工做來彌補這個鴻溝。
實際上並行不是目標,咱們並不肯意去並行,而是一種無奈的妥協。並行程序設計不但困難並且容易出錯。
咱們何時能不須要並行呢?固然最好是繼續增長處理器的主頻,咱們看到IBM公司的Power6處理器就突破了4GHz的主頻限制,在2007年發佈時,其主頻達到5GHz,並支持十進制運算(實際上,當計算機將十進制轉換成二進制進行計算,而後再將計算結果轉換成十進制時,就會出現計算精度問題;但目前十進制計算的速度仍然不及二進制),爲繼續經過提升主頻提高性能打開了突破口;還有一個途徑就是出現革命性的新的計算技術如量子計算等。
實際上,當前並行計算的現狀是部分程序員能夠進行並行編程,且大部分程序是MPI程序,OpenMP有必定比例。服務器程序大部分採用多線程。但大部分普通應用都仍是串行的。
當前國際上對新一代並行程序設計語言的研究正日漸升溫。其中美國HPCS項目(高生產率計算系統)資助開發的新的高生產率並行編程語言有三種,分別屬於三個公司,包括IBM的X十、SUN公司的Fortress和Cray公司的Chapel。這三個語言目前還處在原型開發階段,大規模推廣還須要時間。
此外,還有一類稱爲分割全局地址空間系統(PGAS)的並行程序設計語言,包括UPC(Unified Parallel C,C語言的擴展)、CAF(Co-Array Fortran,Fortran的擴展)和Titanmin(Java的擴展),目前已經開始在部分實際項目中獲得應用,且效果不錯。
多核性能優化的方法:收集數據分析數據、設計方案、實現方案、測試方案、收集數據……如此循環往復。
多核性能優化是個長期過程,不可能一蹴而就。首先,須要對系統進行全面的分析,弄清楚系統瓶頸到底在哪裏:處理器瓶頸,內存瓶頸,仍是IO瓶頸。進一步肯定是任務劃分不合理仍是同步處理不合適等,設計相應的方案,再次測試,逐步優化。
應對多核處理器的軟件開發,能夠有幾種解決思路,包括硬件隱藏、自動並行、OpenMP多線程、MPI優化、新並行語言等。一些新的高生產率和支持全局地址空間的並行程序語言已經出現了,並且正在快速發展,對咱們應對多核處理器的挑戰提供了可能的最終解決途徑。
多核處理器思路的出現源自CPU主頻和功率等的物理極限。經過阿姆達爾定律能夠十分清楚地知道多核處理器的性能受到那些因素的限制,即串行執行比例和交互開銷。因此多核處理器的發展趨勢是合理劃分任務、減小核間通訊以及增強程序的並行性。這幾個方面都已經有一些成果,但整體上還處於探索之中。