# 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。  > 小技巧,看到 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。  ### 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  ## 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
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.