隨着多核時代的到來與流行,傳統的單線程串行程序的編程模式必將改變,取而代之的將是並行編程。目前已經有五種主要並行編程模型,下面將對此五種模型進行概括性的分析與比較:
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的編寫、正確性調試和性能調度復雜。
參考資料: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等,但都不常用。