平行計算:MPI 與 OpenMP 的挑戰與記憶體模型
如果一台電腦執行數值模擬不夠用,那就多串聯幾台電腦一起工作。如果資金充裕,那麼更多的電腦將更為提昇數值模擬整體效能,不是嗎?聽起來很不錯呦,但事情如果那麼簡單就好了。
回到幾十年前那的一台電腦還是僅有單一核心(core)的年代。單純地把幾台電腦串聯後執行任務工作,就是個 distributed memory model 的系統了。每個 core 各自獨立擁有自己的記憶體,各自獨立執行自己的任務,彼此互不干預與影響。想當然爾,在此結構下核心 A 不能去存取核心 B 的記憶體[1]。
然而,共同執行同一程式 (program)的核心之間不能不溝通。總是要跟同事更新一下最新進度吧。那在核心之間如何溝通呢?在 distributed memory model 中,核心之間可以透過「訊息傳遞」(Message Passing) 的方式溝通[2,3]。就像郵寄實體信件,核心A可以向核心B寄送訊息,而核心B也真的會收到來自核心A,藉此以達核心間溝通的目的。
電腦問世之初後有很長一段時間每個電腦只有一顆核心 (single core)。一開始提升運算效能的方法很單純,那就是提高時脈頻率( Clock Rate)。換句話說,就是提高核心每秒的工作速度。一路上從 ENIAC 時脈頻率100 kHz [4],衝到今天一般 CPU 都有GHz 等級的時脈頻率。單一核心時的工作速度愈來愈快,但同時也愈來愈接近物理限制,而無法再大幅躍進單一核心的工作速度。因此工程師磨刀霍霍轉向多核心(multi-Core )的方向繼續推進計算效能。現今的連手機都是多核心處理器,更不用提電腦的處理器了。
把很多顆核心塞到同一個處理器的時候,就像把本來獨棟莊園的住戶全部都更到一棟公寓大樓內,鄰居那麼近,如果原本空間就有限的花園(記憶體)還要分割成每戶均等小小一塊,那每戶只能使用盆栽般大小的空間了。此時,相較於 distributed memory model ,採用 shared memory model / shared-address-space,讓每個核心自獨立擁有自己的 local 記憶體外,當然是和其他核共享同一個隨機存取記憶體( Random Access Memory ,RAM)阿。
在此背景下,OpenMP for Fortran 1.0 於1997年出世,不需要大幅修改程式,OpenMP 就能協助程式設計師將程式工作分配給同一個 處理器中的不同核心[5,6,7]。聽起來很美好,但 OpenMP 的魔法只能作用在「一個」處理器中。當有一個系統有多於兩個處理器時,還是得請求 MPI 共同支援。
![]() |
Fig.2 Shared memory model 每個核心自獨立擁有自己的 local 記憶體外,當然是和其他核共同存取同一份記憶體。 |
MPI 比 openMP 更早問世,如果不想花時間和精力整修程式,原有的 MPI 程式可以在多核心處理器下使用嗎?答案是可以的。原有的 MPI 程式可以直接在多核心處理器上有效運行。因為每個 MPI 進程都會擁有自己獨立的記憶體空間,而這些空間是從整體記憶體中分割出來的,如圖 3所示。因此,唯一要付出的成本就是隨著核心數目線性成長的總體記憶體需求量。
當一個處理器裡有 4 個 核心時,花錢可以擴充記憶體,即可無痛提昇計算效能;但當一個處理器裡的核心數目愈來愈多時,除了痛不欲生的荷包,每個核心所能擁有的獨立記憶體空間變得捉襟見肘。這是因為對於任何機台而言,整體記憶體是有其上限。隨著核心數量的增加,總記憶體需求線性增長,但整體記憶體容量卻無法無限擴展。如圖 4 所示,因為核心數增加而記憶體需由用量暴增,所以尋找 shared memory model 的解方勢在必行。
- Grama, Ananth, et.al.. Introduction to Parallel Computing. Addison-Wesley, 2003.
- Walker, D W. 1992. "Standards for message-passing in a distributed memory environment". United States. https://www.osti.gov/servlets/purl/7104668.
- CORPORATE The MPI Forum. 1993. MPI: a message passing interface. In Proceedings of the 1993 ACM/IEEE conference on Supercomputing (Supercomputing '93). Association for Computing Machinery, New York, NY, USA, 878–883. https://doi.org/10.1145/169627.169855
- Shurkin, Joel.,.Engines of the mind: the evolution of the computer from mainframes to microprocessors. New York: Norton, 1996. ISBN 978-0-393-31471-7.
- R. Chandra, R. Menon, L. Dagum, D. Kohr, D. Maydan, J. McDonald, Parallel Programming in OpenMP. Morgan Kaufmann, 2000. ISBN 1-55860-671-8
- Quinn Michael J, Parallel Programming in C with MPI and OpenMP McGraw-Hill Inc. 2004. ISBN 0-07-058201-7
- OpenMP.org. https://www.openmp.org/