# MPI [TOC] # MPI 介紹 MPI 標準是由 MPI 論壇(由來自行業和學術界的並行計算專家組成的一個開放小組)創建和維護的。MPI 定義了一種 API ,該 API 用於高性能 Process 間通信(IPC) MPI 定義了一個高級 API,這意味著它抽象了實際上用於在進程之間傳遞消息的任何底層傳輸。這個想法是,發送者 Process X 可以有效地說「將此陣列的 1,073 個雙精度值發送給 Process Y」。相應的接收者 Process Y 簡單的「從 Process X 接收一個 1,073 個雙精度值的陣列」。輕而易舉的,由 1,073 個雙精度值組成的數組到達 Y 的等待緩衝區。 MPI 標準的許多實現都支持多種平台,操作系統和網絡類型。有些實現是開源的,有些則是閉源的。顧名思義,Open MPI 是開源實現之一。典型的 MPI 傳輸網絡包括(但不限於):以太網上的各種協議(例如 TCP、iWARP、UDP、ETH Frames),或者 share memory 和 InfiniBand ## MCA 架構 由於 MPI 涵蓋不同層次的技術(從最上層抽象的並行計算、POSIX、網路通訊等)所以需要定義良好的架構,才能夠妥善地實現以上功能,並且為了因應 HPC Application 差異極大的特性,需要提供可算法的更換性。 為了實現上述需求,Open MPI 定義了 MCA 架構 > mca 就是個架構的名詞不用多想。 ### Framework 功能 #### Framework 抽象概念 :::info 首先,為了 Open MPI 將常見的功能分類,並將其命名為 Framework。 > 一個 Framework 代表一種 MPI 的功能 ::: 舉例來說,Framework 之一的 MPI byte transfer layer - 簡稱 btl,該 Framework 代表了 MPI 傳輸方式這種功能(這不是 OSI 7 層的傳輸層),功能有很多種協定可以選擇,舉凡以下都具有傳輸的功能: - TCP - share memory - openFabrics - MPI-2 I/O functionality,簡稱 io,代表 MPI 的 IO 功能 - Process launching and monitoring,簡稱 plm,這功能代表要如何管理 MPI Process, - 普通的 cluster 可以使用 ssh 來溝通以及管理 - 進階的可以使用 SLRUM 來管理 process。 ![](https://i.imgur.com/6bwuZqa.png) > 小技巧,看到 XXX Framework 太抽象,就把它看成 xxx 功能。 io Framework -> io 功能 > 🌟只有 MPI 這裡能這樣翻譯喔 #### Open MPI 的開發者如何實際 implenment Framework :::info Open MPI 想做的功能很多,所以 Framework 很多,並且會不斷成長,於是乎寫出這些功能就需要妥善分類。 ::: Open MPI 將功能分成三類: - OMPI:btl, io - ORTE:plm - OPAL:timer 分三類的用途在於分層: - OPAL 實現了許多基礎功能,例如:Debug 用的 backtrace,專為 MPI 所用的 memcpy,更高精度的 timer,這些大家都會用到的功能,都在這一層被實現(code 寫出來)。 - ORTE 在 OPAL 之上,實現了消息傳遞的 API,以及啟動、監視和終止並行作業的功能。 - OMPI 層是最高的抽象層,並且是唯一公開給應用程序的層。 OMPI 主要用來實現 MPI 標准定義的所有 Function。 > 但這些層次並非緊密相依,在一些高性能要求的 OMPI Function,也許會跳過前兩層直接 call OS。 ![](https://i.imgur.com/81Xskh0.png) ### Component 組件 組件的另一個常用詞是 Plugin 「插件」。它是一個獨立的代碼集合,可以捆綁到可在運行時和/或編譯時插入 Open MPI 代碼庫的插件中。 :::success 換句話說,組件就是代表該用何種方法完成 Framework 的要求,例如 btl 要用以下何者來傳輸資料。我們便可以將下述稱為三種不同的組件。 - TCP - share memory - openFabrics ::: ### Module 實現(code 怎寫) 但是每一種方法都有不同的實現方式,光 TCP 的算法就無數種了,所以為了容納不同的演算法,OpenMPI 開發者可以為每個 Component 實現不同的實作方式。 ### mca 小結 所以到此為止,MCA 架構內用 Framework 定義了不同的功能需求,用 Component 定義了功能的不同種方法,Module 代表了方法該用何種演算法實現。 :::success 例如我們現在有 - Framework:傳輸功能的需求 - Component:TCP 或 IB 這 2 種方法 - Module:N 種 TCP 優化算法的 Code ::: 我們便能夠利用 MPI 的 MCA 架構,取出相對應的 code file,建立適當的 struct 來描述 MPI 執行的環境,進而編譯或執行我們的 mpi_hello.cc ![](https://i.imgur.com/XbKaqqt.png) ## Ref - 名詞解析 https://www.open-mpi.org/faq/?category=developers - Framework 整理 https://www.open-mpi.org/faq/?category=tuning#frameworks - 從 Open MPI 開發者的角度理解 Open MPI https://www.aosabook.org/en/openmpi.html # OFED :::warning 參考這篇 https://hackmd.io/@William-Mou/SywOmi7kD ::: InfiniBand 定義了傳出規範,但卻沒有標準的驅動程式。原始的 IB 標準只列出一組的動作例如 ibv_open_device 或是 ibv_post_send。子程式的語法由供應商自行定義。常見標準是由 OpenFabrics Alliance 所開發。它以雙許可證方式發布,GNU通用公共許可證或BSD許可證用於 GNU/Linux 以及 FreeBSD,且 WinOF 在 Windows 下可以選擇 BSD 許可證。它已被大多數 InfiniBand 供應商採用,用於 GNU/Linux、FreeBSD 以及 Windows。 ## OFED 用途 OpenFabrics Enterprise Distribution (OFED)是一組開源軟件驅動、核心內核代碼、中間件和支持InfiniBand Fabric的用戶級接口程序。 我們可以想像在上面的定義後,OFED 進一步的撰寫了更多的 IB 功能,舉凡 IPoIB(在 IB 網路上實現乙太網的 IP 機制)、RDMA 等等。 OFED 除了由 OpenFabrics 官方釋出的開源版本外 https://www.openfabrics.org/downloads/OFED/ 也有由 Mellanox 再次撰寫並打包的 MLNX_OFED https://www.mellanox.com/support/mlnx-ofed-matrix?mtag=linux_sw_drivers 不論何者,都能夠妥善利用 opensmd 管理 IB 網路,並提供進階功能 IPoIB、RDMA