最近讀了《並行程序設計導論》這本書。感覺這本書講得挺好的,適合入門。
通過幾個例子(pi的計算,積分,n個數累加)講述了用MPI,PThreads和OpenMP進行並行編程。
一、並行計算概論
兩種主要並行系統編程:分佈式內存系統的編程和 共享內存系統的編程。
圖a爲共享內存系統,圖b爲分佈式內存系統
共享內存系統
在共享內存系統中,各個核能夠共享訪問計算機的內存,理論上每個核都能夠讀、寫內存的所有區域。可以通過檢測和更新共享內存中的數據來協調各個核。
共享內存系統最常見的例子就是我們平常使用的PC機。
分佈式系統
在分佈式內存系統中,每個核都擁有自己的私有內存,核之間的通信是顯式的,必須使用類似於在網絡中發送消息的機制。
分佈式系統成爲集羣,每個節點都是一個獨立的PC,通過網絡將節點連在一起。
二、MPI、PThreads、OpenMP的區別
MPI | 分佈式系統 | 通過通信子的相互發送消息進行信息交流。 |
PThreads | 共享內存系統 | 使用POSIX線程庫(使用的是API),通過信號函數進行信息交流。重新設計程序,相比OpenMP更靈活。 |
OpenMP | 共享內存系統 | 使用的是預編譯指令。在原有的程序中,增加一些預編譯指令(需要編譯器的支持),使編譯器將那部分代碼編譯成並行計算的代碼。可在原有串行程序的代碼中添加預編譯指令,使串行程序成爲並行程序,更快捷。 |
選擇哪個API
首先看應用使用內存的多少來選使用分佈式系統編程還是共享內存系統編程。
如果選擇分佈式系統編程,毫無疑問就選MPI
如果選擇共享內存系統編程,就需要考慮並行化程序的細節。如果是一個大而複雜的串行程序,就需要考慮是否適合採用OpenMP。如果程序涉及線程之間複雜的同步,那麼Pthreads會更容易些。
三、書中一些算法
1.函數與座標軸面積的計算
2.並行排序算法
由於冒泡排序法的按對排序特性,並行化意義不打,但其一個變種奇偶交換排序更適合並行化
3.矩陣向量乘法
四、GPU
在並行計算中最有前途的發展方向之一就是使用GPU進行通用計算。
CUDA與OpenCL (參考文檔:點擊打開鏈接)
CUDA | OpenCL |
只支持NVDIA的GPU | 支持設備廣 |
支持彙編 | 不支持彙編 |
預編譯 | 在線編譯 |