平行計算:MPI 與 OpenMP 的挑戰與記憶體模型

如果一台電腦執行數值模擬不夠用,那就多串聯幾台電腦一起工作。如果資金充裕,那麼更多的電腦將更為提昇數值模擬整體效能,不是嗎?聽起來很不錯呦,但事情如果那麼簡單就好了。

回到幾十年前那的一台電腦還是僅有單一核心(core)的年代。單純地把幾台電腦串聯後執行任務工作,就是個 distributed memory model 的系統了。每個 core 各自獨立擁有自己的記憶體,各自獨立執行自己的任務,彼此互不干預與影響。想當然爾,在此結構下核心 A 不能去存取核心 B 的記憶體[1]。

然而,共同執行同一程式 (program)的核心之間不能不溝通。總是要跟同事更新一下最新進度吧。那在核心之間如何溝通呢?在 distributed memory model 中,核心之間可以透過「訊息傳遞」(Message Passing) 的方式溝通[2,3]。就像郵寄實體信件,核心A可以向核心B寄送訊息,而核心B也真的會收到來自核心A,藉此以達核心間溝通的目的。

偷懶是科技進步的動力。如果每次都要跟硬體搏鬥,那真的會讓人望之卻步。因此,在1994 年的夏天 Message Passing Interface (MPI) 1.0 問世了。因為時下主流硬體商、學界和業界的共同努力,這個支援 Fortran 和 C 的函式庫,不僅簡單易用,而且俱備高度的可移植性和可擴充性。時至今日,仍然常見其身影,但同時過去的光榮也成為現在的隱憂。

電腦問世之初後有很長一段時間每個電腦只有一顆核心 (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.1 Distributed memory model
每個核心都有一份屬於自己的獨立的記憶體,而核心之間透過訊息傳遞介面溝通。每個核心都可以向其他核心寄送訊息,而會收到來自其他核心訊息。
Fig.2 Shared memory model
每個核心自獨立擁有自己的 local 記憶體外,當然是和其他核共同存取同一份記憶體。



MPI 比 openMP 更早問世,如果不想花時間和精力整修程式,原有的 MPI 程式可以在多核心處理器下使用嗎?答案是可以的。原有的 MPI 程式可以直接在多核心處理器上有效運行。因為每個 MPI 進程都會擁有自己獨立的記憶體空間,而這些空間是從整體記憶體中分割出來的,如圖 3所示。因此,唯一要付出的成本就是隨著核心數目線性成長的總體記憶體需求量。

當一個處理器裡有 4 個 核心時,花錢可以擴充記憶體,即可無痛提昇計算效能;但當一個處理器裡的核心數目愈來愈多時,除了痛不欲生的荷包,每個核心所能擁有的獨立記憶體空間變得捉襟見肘。這是因為對於任何機台而言,整體記憶體是有其上限。隨著核心數量的增加,總記憶體需求線性增長,但整體記憶體容量卻無法無限擴展。如圖 4 所示,因為核心數增加而記憶體需由用量暴增,所以尋找 shared memory model 的解方勢在必行。

Fig.3 
Fig.4  在使用 MPI 和 OpenMP 平行化 EIRENE-NGM 程式時的記憶體使用量比較。
D.V. Borodin, et. al., "Fluid, kinetic and hybrid approaches for neutral and trace ion edge transport modelling in fusion devices", Nucl. Fusion 62 (2022) 086051




  1. Grama, Ananth, et.al.. Introduction to Parallel Computing. Addison-Wesley, 2003.
  2. Walker, D W. 1992. "Standards for message-passing in a distributed memory environment". United States. https://www.osti.gov/servlets/purl/7104668.
  3. 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
  4. 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.
  5. R. Chandra, R. Menon, L. Dagum, D. Kohr, D. Maydan, J. McDonald, Parallel Programming in OpenMP. Morgan Kaufmann, 2000. ISBN 1-55860-671-8
  6. Quinn Michael J, Parallel Programming in C with MPI and OpenMP McGraw-Hill Inc. 2004. ISBN 0-07-058201-7
  7. OpenMP.org. https://www.openmp.org/

Popular posts from this blog

【讀書筆記】改變世界的十七個方程式

【讀書筆記】我想開始去跑步