五種主要多核並行程式設計方法分析與比較
隨著多核時代的到來與流行,傳統的單執行緒序列程式的程式設計模式必將改變,取而代之的將是並行程式設計。目前已經有五種主要並行程式設計模型,下面將對此五種模型進行概括性的分析與比較:
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中使用。
OpenMP由三部分組成:編譯指導(compiler directive)、執行庫(runtime library)和環境變數(environment variables)。其語言模型基於以下假設:執行單元是共享一個地址空間的執行緒,即OpenMP是基於派生/連線(fork/join)的程式設計模型。Fork/join的並行機制如下圖所示:
Fork/join並行機制:並行區前,序列命令派生出多條並行命令並行執行,執行到並行區末等待,等所有並行任務都結束,再轉到序列執行。
OpenMP有兩種常用的並行開發形式:一是通過簡單的fork/join對序列程式並行化;二是採用單程式多資料對序列程式並行化。
優點:第一,共享儲存模型,使得程式設計師不必進行資料劃分和分佈,使得開發並行程式比較容易;第二,更適合於SMP系統;第三,主要面向迴圈級的並行開發,可以容易地實現增量性的並行化。
缺點:第一,OpenMP只適用於SMP結構;第二,OpenMP主要開發迴圈級的並行程式,受此限制,對某些應用並不適合;第三,OpenMP的編寫、正確性除錯和效能排程複雜。
3. Intel IPP
Intel IPP(Integrated Performance Primitives),Intel整合效能基元是Intel函式庫的第二代。Intel為每種新的多核處理器都發佈一個IPP函式庫(C/C++ API),專用於多核架構,提供了排程優化的函式庫,其中涉及的領域有數學、訊號處理、音訊視訊、影象處理與編碼、字串、密碼學。 IPP的組成如下圖所示:
優點:是經過效能高度優化的庫,執行效率高。
缺點:專用於Intel處理器和某些領域,不方便移植。
4. Intel TBB
Intel TBB(Threading Building Blocks),Intel執行緒構建模組,是一個為建立可靠的、可移植的和可擴充套件的並行程式的C++模板庫。專用於編寫高層抽象的C++程式,和可移植的程式。
優點:可移植、可擴充套件。
缺點:效能沒有IPP高。
5. MapReduce
MapReducesh是Google的人研究出來的一個模型,開發的一個針對大規模群組中的海量資料處理的分散式程式設計模型。
此外,並行程式設計模式還有X3H5, Phreads, HPF等,但都不常用。