在介紹這三者的差異之前,先提一下 Shared Memory 跟 Distributed Memory的差異:
Shared Memory: 共享記憶體,意指多處理器共享相同記憶體,通常都是單一機器。(圖1)
- 優點: 所有的處理器都共享相同的記憶體,所以程式的撰寫設計上相對容易。
- 缺點: 擴充性( Scalability )變差,每多使用一個處理器所分到的記憶體就變小,且對連接多處理器到記憶體的bus產生更大的負荷。
![]() |
圖1. Shared Memory |
Distributed Memory: 分散式記憶體,每個處理器各自擁有專屬的記憶體,而且無法看見他人的記憶體,只能透過傳遞的方式將資料跟其他處理器交換。(圖2)
- 優點: 擴充性( Scalability )相對好。 程式的可移植性(portability)相對好。 processor間資料傳遞的媒介較不會堵塞。
- 缺點: 程式撰寫的難度較高。 處理器間的資料都要透過溝通才可取得。
![]() |
圖2. Distributed Memory |
簡單介紹了shared memory跟distributed memory之後,再稍微跟介紹MPI、OpenMP、CUDA的差異:
- 採用Shared Memory架構 : (適用於單一機器上)
OpenMP: 程式設計師在程式可以平行化的部分,利用progma告知compilier要平行化的部分,讓支援OpenMP的compilier自動將此部分平行化。
CUDA: 利用GPU多核和許多內建的矩陣、向量運算的指令的特性來加速運算,特別注意到CUDA運算時只能用顯示卡上面的記憶體,所以設計時都要先將主記憶體的資料搬到顯示卡上記憶體之後才能運算。(因為這樣的特性,我個人認為CUDA比較適合處理同筆資料反覆運算(repeat iteration)的問題)
- Distributed Memory 思維: (可適用於單一或多機器上)
MPI(Message Passing Interface Standard): 視每個process為一計算單元(包含處理器和記憶體),將各處理器之間的溝通抽象化,所以不論是單一或多機器上都可以利用此方式撰寫平行計算的程式。而在此模式下,程式設計師要自己負責process間的溝通。優點是可移植性相對高。
這三種API各有其自己的特色,且計算的效率取決於解決什麼樣的問題、以及程式如何設計,而沒有一定最快最好解決所有問題的單一API。
上學期剛選修完一門平行計算的課程,也花了不少心力在上面,未來準備將這些心得整理成一系列的文章,歡迎有興趣或有任何問題的網友來交流。
參考資料:
Michael J. Quinn, "Parallel Programming in C with MPI and OpenMP"
沒有留言:
張貼留言