Open MPI的目標、概念及實現


  目前,許多可用的MPI實現只關注HPC(高性能計算)的部分方面或是專注於解決某個具體問題,這導致了這些MPI實現不兼容、如果獨立安裝組合來獲取它們的特有功能。Open MPI是在LAM/MPI,LA-MPI, and FT-MPI的基礎上的一種全新的基於構件概念的MPI實現,提供了以前MPI實現無法實現的獨特的組合方法。Open MPI的基於構件的體系結構不僅為第三方研究提供了穩定的平台,也使得獨立軟件附件能夠在運行時組合。本文從總體上介紹了Open MPI的目標、概念、設計及實現。

一、Open MPI的目標
  Open MPI並不是LAM/MPI, LA-MPI和FT-MPI的簡單組合,而是一種全新的MPI實現,其完全實現了MPI-1.2和MPI-2規約,並且完全支持並發和多線程應用(也就是MPI_THREAD_MULTIPLE)。
  為了有效有效支持大范圍的並行機,開發了高性能驅動程序,其中包括TCP/IP, shared memory, Myrinet, Quadrics, and Infiniband,更多的機器支持可能會基於用戶、市場和研究需要而增加。對於網絡傳輸錯誤,Open MPI提供了一種可選的特性來檢測數據的完整性。通過使用報文分段和拆分到多個網絡設計,Open MPI不僅可以達到可用帶寬的最大值,而且當節點使用多台網絡設備的時候,可以動態處理網絡設備的數據丟失。
  Open MPI的運行時環境提供了啟動和管理並行應用的基本服務。

二、Open MPI的體系結構
  Open MPI的設計以MPI構件架構(MPI Component Architecture, MCA)為中心。雖然構件編程已被工業界廣泛應用,但在HPC領域中應用卻沒有很長時間。Open MPI由三個主要的功能域組成,如圖1所示。

 

 

 

圖1 Open MPI體系結構

  • MPI構件架構(MPI Component Architecture, MCA),是Open MPI的核心,為所有其它層次提供管理服務的基礎組件結構;
  • 構件框架(Component frameworks),存在於每個主要的功能域中,以管理模塊;
  • 模塊(Modules),是自包含的軟件單元,帶有已定義好的接口,可以在運行時和其它模塊進行配置組合。

  MCA管理構件框架並為它們提供服務,如接收高層抽象的運行時參數,並通過構件框架向下傳遞到模塊。MCA也能尋找構造時的構件,並調用相關的hooks以配置、構造和安裝這些構件。

  每個構件框架致力於單獨的任務,例如提供並行任務控制或執行MPI集合操作。一旦需要,構件框架會發現、加載、使用、卸載模塊。每個構件框架有不同的機制和使用場景,有些在一個時刻只用一個模塊,而有些會同時用到所有模塊。
  模塊是自我包含的軟件單位,可以自我配置、自我構造和自我安裝。模塊包含在構件框架中,以接口的形式為高層抽象或MPI的其它部分提供需要的服務。

  下面是Open MPI構件框架的部分列表(包含MPI功能,不包含運行時環境構件):

  • 點到點傳遞層(Point-to-point Transport Layer, PTL):一個PTL模塊相當於一個專用的網絡協議和設備,主要負責MPI進程間字節傳遞的“有線協議”。PTL模塊需要識別MPI的語義,多個PTL模塊可以在一個進程中使用,同時允許多個網絡的使用。PTL模塊支持TCP/IP, shared memory, Quadrics elan4, Infiniband和Myrinet。
  • 點到點管理層(Point-to-point Management Layer, PML):PML的主要功能是為MPI層和所有可用的PTL模塊之間提供報文分段、調度和重新裝配服務。
  • 聚合通信(Collective Communication, COLL):是MPI聚合操作的后端,支持組內通信域和組間通信域間功能。
  • 進程拓撲(Process Topology, TOPO):提供組內通信夫域的笛卡爾和圖的映射功能。基於集群和風格的計算可能受益於此拓撲意識的通信域,允許MPI基於位置來優化通信域。
  • 約簡操作(Reduction Operations):MPI固有的約簡操作的后端功能(例如MPI_SUM)。模塊可以利用平台專用的指令集來優化在目標平台上的性能。
  • 並行IO(Parallel I/O):IO模塊實現並行文件和設備的存取。

  Open MPI框架類型的多樣性使得第三方開發者可以使用Open MPI作為一個研究平台、一個商業產品的開發工具、甚至是不同算法和技術的比較機制。
  Open MPI的構件架構為終端用戶和庫開發者提供了許多優勢:1)它允許一個MPI進程內使用多個構件。例如,一個進程可以同時使用多個網絡設備驅動;2)為第三方軟件的使用提供了方便,支持源碼和二進制版本;3)提供了細粒度的、運行時、用戶可控的構件選擇機制。

2.1模塊生命周期
  雖然每個框架是不同的,但我們可以用MPI進程中的COLL框架為示例來說明模塊的使用和生命周期:
  1)在MPI_INIT階段,COLL框架尋找所有可用的模塊。模塊可能是靜態鏈接到MPI庫,或是在已知位置共享的庫模塊。
  2)所有的COLL模塊被詢問它們是否需要在進程中運行,模塊可以選擇不運行。例如,一個基於Infiniband的模塊,如果沒有可用的Infiniband NICs可以選擇不運行。所有選擇運行的模塊將會組成一個可運行的模塊清單。
  3)當每個通信域(包括MPI_COMM_WORLD和MPI_COMM_SELF)被創建時,每個可用模塊被詢問是否需要在新通信域中使用。模塊可以拒絕被使用,例如,一個基於共享內存的模塊只有當通信域中的所有進程都在相同的物理節點上時,才允許被使用。通信域將會選擇最高優先級的模塊使用。
  4)一旦模塊被選中,將會被初始化。給模塊分配資源,當聚合操作被調用時,其潛在的預計算信息將會被使用。
  5)當MPI的聚合操作在那個通信域被調用,這個模塊相關的后端功能被調用去執行這個操作。
6)COLL模塊生命周期的最后階段發生在通信域被銷毀的時候,主要是釋放資源和與通信域關聯的預計算信息。

三、實現細節
  主要討論Open MPI設計的兩個方面:它的面向對象方法和模塊管理機制。

3.1面向對象方法
  Open MPI使用簡單C語言面向對象系統實現,使用基於單一繼承和引用計數的retain/release內存管理模型。一個object由一個結構體和單一實例化的class標識符組成。結構體的首個元素一個是指定父類結構體的指針。
  宏指令會對C++類似的語義(如new, construct, destruct, delete)產生影響。因為C++項目的豐富經驗和某些平台編譯方面的問題,使得在開發Open MPI使用了面向對象方法,而不是直接使用C++。
  一旦構造,對象引用計數被設置為1。當對象retain,計數遞增,當對象release,計數遞減。當計數到達0,會運行對象的析構器並釋放內存。
3.2模塊發覺和管理
  Open MPI提供了三種不同機制,將模塊添加到MPI庫中:

  • 在Open MPI配置階段,一個腳本會遍歷構造樹,並生成一個模塊發覺列表。這些模塊會被配置、編譯並靜態鏈接到MPI庫中。
  • 與上面方法類似,在配置階段發覺的模塊也可以被編譯成共享庫,並安裝、在運行時被重新發覺。
  • 對於不想提供源代碼和第三方庫開發者,可以獨自配置和編譯他們的模塊並以二進制的形式生成共享庫。用戶可以安裝這些模塊到合適的目錄下,以便Open MPI可以在運行時發覺這些模塊。

  在運行時,Open MPI首先發覺靜態鏈接到MPI庫的所有模塊,然后搜索多個目錄(如$HOME/ompi/, ${INSTALLDIR}/lib/ompi/),找到所有可用的模塊,並按照框架類型排序。為了簡化運行時發覺,共享庫模塊有其專用的命名制式來指定它們的MCA構件框架類型和它們的模塊名。

  模塊通過它們的名字和版本號指定。這使得MCA可以管理相同構件的不同版本,也確保在一個MPI進程中使用的模塊是相同的,即名字和版本號都一致。為了提高靈活性,Open MPI提供了多種機制來選擇指定模塊,或傳遞運行時參數到模塊,或傳遞命令行參數到mpirun、環境變量、文本文件和MPI屬性。

四、總結
  Open MPI是MPI的一種全新實現,支持MPI-2、多個並發用戶線程、處理進程和網絡故障的多種選擇等。

五、參考資料

[1]. Gabriel, E., et al., Open MPI: Goals, concept, and design of a next generation MPI implementation. Recent Advances in Parallel Virtual Machine and Message Passing Interface, 2004: p. 353-377.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM