隨着多核時代的到來與流行,傳統的單線程串行程序的編程模式必將改變,取而代之的將是並行編程。目前已經有五種主要並行編程模型,下面將對此五種模型進行歸納性的分析與比較:程序員
1. MPI編程
MPI(Message Passing Interface)消息傳遞接口是MPI論壇發佈的一個庫,而不是一門實現語言,支持C/C++/Fortran。是一種消息傳遞編程模型,爲進程間通訊服務。MPI提供了一種與平臺無關,能夠被普遍使用的編寫消息傳遞程序的標準。用它來編寫消息傳遞程序,不只實用、可移植、高效和靈活,並且和當前已有的實現沒有太大的變化。目前MPI的主要實現有如下三種:架構
優勢:能夠在集羣上使用,也能夠在單核/多核CPU上使用,它能協調多臺主機間的並行計算,所以並行規模上的可伸縮性很強,能在從我的電腦到世界TOP10的超級計算機上使用。分佈式
缺點:第一,基於消息傳遞,須要顯示劃分和分佈計算任務,顯示進行消息傳遞與同步,且不易增量開發串行程序的並行性;第二,使用進程間通訊的方式協調並行計算,這致使並行效率較低、內存開銷大、不直觀、編程麻煩。函數
參考資料:MPI論壇性能
2. OpenMP優化
OpenMP(Open Multi Processing)是由Open ARB發佈的一種用於並行編程的規範,是創建在串行語言上的擴展,目前能夠在C/C++/Fortran中使用。ui
OpenMP由三部分組成:編譯指導(compiler directive)、運行庫(runtime library)和環境變量(environment variables)。其語言模型基於如下假設:執行單元是共享一個地址空間的線程,即OpenMP是基於派生/鏈接(fork/join)的編程模型。Fork/join的並行機制以下圖所示:編碼
Fork/join並行機制:並行區前,串行命令派生出多條並行命令並行執行,執行到並行區末等待,等全部並行任務都結束,再轉到串行執行。線程
OpenMP有兩種經常使用的並行開發形式:一是經過簡單的fork/join對串行程序並行化;二是採用單程序多數據對串行程序並行化。
優勢:第一,共享存儲模型,使得程序員沒必要進行數據劃分和分佈,使得開發並行程序比較容易;第二,更適合於SMP系統;第三,主要面向循環級的並行開發,能夠容易地實現增量性的並行化。
缺點:第一,OpenMP只適用於SMP結構;第二,OpenMP主要開發循環級的並行程序,受此限制,對某些應用並不適合;第三,OpenMP的編寫、正確性調試和性能調度複雜。
參考資料:Open ARB - OpenMP
3. Intel IPP
Intel IPP(Integrated Performance Primitives),Intel集成性能基元是Intel函數庫的第二代。Intel爲每種新的多核處理器都發佈一個IPP函數庫(C/C++ API),專用於多核架構,提供了調度優化的函數庫,其中涉及的領域有數學、信號處理、音頻視頻、圖像處理與編碼、字符串、密碼學。 IPP的組成以下圖所示:
優勢:是通過性能高度優化的庫,執行效率高。
缺點:專用於Intel處理器和某些領域,不方便移植。
參考資料:Intel IPP產品介紹
4. Intel TBB
Intel TBB(Threading Building Blocks),Intel線程構建模塊,是一個爲建立可靠的、可移植的和可擴展的並行程序的C++模板庫。專用於編寫高層抽象的C++程序,和可移植的程序。
優勢:可移植、可擴展。
缺點:性能沒有IPP高。
參考資料:Intel TBB產品介紹
5. MapReduce
MapReducesh是Google的人研究出來的一個模型,開發的一個針對大規模羣組中的海量數據處理的分佈式編程模型。
參考資料:http://www.mapreduce.org/
此外,並行編程模式還有X3H5, Phreads, HPF等,但都不經常使用。