參考:關於OpenMPI的代碼閱讀指導太難找了,直接讀真的是有些力不從心,後來發現官網就有,不過版本有點舊,但是不影響。
可先參考這個,http://www.aosabook.org/en/openmpi.html
博客的內容主要參考:https://www.open-mpi.org/video/?category=internals#Cisco_JeffSquyres
1. MPI 概述
- 頂層的網絡API
- 將底層傳輸抽象出來
- Simple things are simple
- 對高性能友好
- 超低延遲傳輸
- rapid ascent to wire-rate bandwith 快速上升到線速帶寬
- 通常用於高性能領域但也是一個非常成熟的IPC API
2. 版本信息
- 規則:..
- = 奇數 新特性系列/ 偶數 穩定版
- 1.5->1.6在一個分支,並且API兼容
3. 構建和安裝OpenMPI
用戶構建:
- 和其他開源軟件差不多make,install
- 時間同步的網絡文件系統
- 提示:保存構建日誌
2>&1 | tee xx.log
- –with-verbs 選項
開發者構建:
- 需要更多依賴,automake之類的
- 不要覆蓋系統安裝的庫,另開一個文件夾
- 用Autotools構建,*.pl
- 一般情況下不需要更改autogen,除非更改版本,configure.ac,*.m4等構建文件
- Debug 模式構建:如果./configure 監測到.git .svn之類的文件夾,自動激活debug構建
- 會導致性能降低
- configure
- 也不用每次都run,除非更改了autogen或者添加或者移除一些框架和插件
- make
- 可以單獨make模塊
- 有一些不被安裝的模塊
- 自動生成的config.h
- 頭文件
- libtool convenience 庫
4. OpenMPI 代碼架構
4.1 概覽
- 第三方庫
- hardware locality (hwloc),服務器拓撲/局部性
- libevent,文件描述符,計時器,信號事件引擎,狀態機
- libltdl
- VampirTrace
- 大部分由C構成74% ohloh.net
- 4 space tabs no tabs
- 定值在==左邊 NULL==foo
- 不建議C++
- 命名規則:前綴規則
- 基本按照模塊文件夾順序命名
- typedef 來申明結構體( _t結尾) 和函數指針( _fn_t結尾)
4.2 抽象層架構
抽象層架構:
- OMPI
- Public MPI API
- 後端MPI語義和支持邏輯
- ORTE
- No knowledge of MPI
- 並行運行系統支持上層
- 啓動,監控每個進程
- 將單獨的進程組合成jobs
- 發送 stdin/stdout/stderr
- OPAL
- single process 語義 only
- 可移植的系統級別功能:atomic,ip interfaces,hwloc
- 基本工具 (linked lists)
- glue code
- 自頂向下不可逆
4.3 插件架構
- 每個上述project結構都是
- main/ core code
- components (a.k.a. “plugins”)
- frameworks
- MCA(Modular Component Architecture) 是OpenMPI中非常關鍵的一個概念,可以理解爲模塊,每個模塊下有許多插件Components,即插即用,當一個Component和資源鏈接起來就成了一個Module,可以理解爲C++中的一個實例,而Component是一個類。
- OpenMPI 是由Frameworks組成的一個複雜的工程