mpi4py初始化和運(yùn)行時(shí)設(shè)置

上一篇中我們介紹了 mpi4py 并行讀/寫(xiě) numpy npy 文件的方法,下面我們將介紹 mpi4py 軟件包初始化相關(guān)的一些設(shè)置。

初始化及運(yùn)行時(shí)設(shè)置

有在 C/C++/Fortran 等其它計(jì)算機(jī)語(yǔ)言下編寫(xiě) MPI 并行計(jì)算程序經(jīng)驗(yàn)的讀者都知道,在使用 MPI 時(shí)除了要導(dǎo)入 MPI 的相應(yīng)頭文件之外,還要首先調(diào)用 MPI_Init/MPI_Init_thread 來(lái)初始化 MPI 環(huán)境,然后才能使用 MPI 庫(kù)提供的各項(xiàng)功能,在結(jié)束 MPI 程序時(shí)一般還需要調(diào)用 MPI_Finalize 以結(jié)束 MPI 環(huán)境。但是在使用 mpi4py 時(shí),我們一般并沒(méi)有調(diào)用 mpi4py 中對(duì)應(yīng)的函數(shù) mpi4py.MPI.Init/mpi4py.MPI.Init_thread 和 mpi4py.MPI.Finalize,這是為什么呢?原來(lái)在導(dǎo)入和使用 mpi4py 時(shí),mpi4py 軟件包會(huì)做大量的初始化工作。在導(dǎo)入 mpi4py 時(shí)如果不做一些特定的設(shè)置,就會(huì)采用 mpi4py 的默認(rèn)初始化設(shè)置,其中就包括對(duì) mpi4py.MPI.Init/mpi4py.MPI.Init_thread 和 mpi4py.MPI.Finalize 的默認(rèn)調(diào)用。這些默認(rèn)的初始化設(shè)置在大多數(shù)情況下都是合適的,并不需要我們顯式地進(jìn)行設(shè)置,因此能夠節(jié)省我們一部分工作,使我們可以簡(jiǎn)潔而方便地編寫(xiě) Python 環(huán)境下的 MPI 并行計(jì)算程序。但是在某些情況下,我們需要進(jìn)行一些特定的初始化設(shè)置,mpi4py 允許定制一些特定的初始化選項(xiàng),我們只需在導(dǎo)入 mpi4py 的 MPI 模塊之前進(jìn)行相應(yīng)的設(shè)置或調(diào)用相應(yīng)的函數(shù)即可。下面是 mpi4py 提供的初始化及運(yùn)行時(shí)設(shè)置函數(shù):

mpi4py.rc(**kargs)

mpi4py 運(yùn)行時(shí)設(shè)置(Runtime configuration)函數(shù)??梢栽O(shè)置的參數(shù)包括:initialize 是否在 import MPI 時(shí)自動(dòng)調(diào)用 MPI.Init 函數(shù)以初始化 MPI 環(huán)境,默認(rèn)為 True;threads 是否要求多線程支持,默認(rèn)為 True;thread_level,要求的線程級(jí)別,默認(rèn)為 'multiple',可供選擇的級(jí)別有 'multiple', 'serialized', 'funneled' 和 'single';finalize,是否在程序退出時(shí)自動(dòng)調(diào)用 MPI.Finalize,默認(rèn)為 None,表示和 initialize 的值相同,也可以設(shè)置為 True 或 False;fast_reduce,是否使用樹(shù)算法進(jìn)行快速的規(guī)約操作,默認(rèn)為 True;recv_mprobe,是否采用匹配的 probe 方法來(lái)接收消息,默認(rèn)為 True;errors,錯(cuò)誤處理策略,默認(rèn)為 'exception',表示發(fā)生錯(cuò)誤時(shí)會(huì)拋出異常,還可以設(shè)置為 'default',表示使用 MPI 的默認(rèn)錯(cuò)誤處理機(jī)制,或?yàn)?'fatal',表示將所有的錯(cuò)誤都設(shè)置成嚴(yán)重級(jí)別,此時(shí)程序遇到錯(cuò)誤時(shí)一般會(huì)中止。

我們可以調(diào)用以上函數(shù)進(jìn)行初始化及運(yùn)行時(shí)設(shè)置,也可以直接設(shè)置 rc 的相應(yīng)參數(shù)完成同樣的設(shè)置工作。rc 的對(duì)應(yīng)屬性默認(rèn)設(shè)置為:

rc.initialize = True
rc.threads = True
rc.thread_level = 'multiple'
rc.finalize = None
rc.fast_reduce = True
rc.recv_mprobe = True
rc.errors = 'exception'

想要改變某項(xiàng)設(shè)置,只需設(shè)置 rc 的對(duì)應(yīng)屬性為一個(gè)不同的值即可,如 rc.initialize = False。

其它相關(guān)函數(shù)

另外,下面是一些初始化及運(yùn)行時(shí)相關(guān)的其它函數(shù)方法:

mpi4py.get_include()

返回 mpi4py 軟件包的頭文件目錄。一些使用 mpi4py 的擴(kuò)展模塊的編譯需要指定 mpi4py 的相關(guān)頭文件路徑,可以使用該函數(shù)返回頭文件路徑。例如,可以使用 Python distutils (或者 numpy 的 distutils)如下編譯一個(gè)擴(kuò)展模塊:

import mpi4py
Extension('extension_name', ...
        include_dirs=[..., mpi4py.get_include()])
mpi4py.get_config()

返回一個(gè)包含 MPI 相關(guān)信息的字典。

mpi4py.profile(name, **kargs)

MPI profiling 支持。name 是要導(dǎo)入的 profiler 庫(kù)。其它可設(shè)置參數(shù)有:path,一系列由字符串表示的路徑,用來(lái)搜尋所用的 profiler,logfile,profiler 所產(chǎn)生的日志文件前綴。

有關(guān) mpi4py 中的 profiling 的使用將在下一篇中介紹。

例程

下面給出使用例程:

# ini.py

"""
Demonstrates the useage of initialization and runtime configuration options.

Run this with 2 processes like:
$ mpiexec -n 2 python ini.py
"""

# mpi4py.rc(initialize=False)
# or use the following way

# we must set the initialization and runtime configuration options
# before the import of MPI module
from mpi4py import rc
# the default of rc.initialize is True and rc.finalize is None
# change rc.initialize to False
# rc.finalize will also be False when it value is None
rc.initialize = False

from mpi4py import MPI
print 'Before call Init(), MPI.Is_initialized: %s' % MPI.Is_initialized()
print 'Before call Init(), MPI.Is_finalized: %s' % MPI.Is_finalized()

# now we have to call Init explicitly
MPI.Init()
print 'After call Init(), MPI.Is_initialized: %s' % MPI.Is_initialized()
print 'After call Init(), MPI.Is_finalized: %s' % MPI.Is_finalized()

comm = MPI.COMM_WORLD
rank = comm.rank

print 'I am Process %d...' % rank

# have to call Finalize explicitly to terminate MPI
MPI.Finalize()
print 'After call Finalize(), MPI.Is_initialized: %s' % MPI.Is_initialized()
print 'After call Finalize(), MPI.Is_finalized: %s' % MPI.Is_finalized()

運(yùn)行結(jié)果如下:

$ mpiexec -n 2 python ini.py
Before call Init(), MPI.Is_initialized: False
Before call Init(), MPI.Is_finalized: False
Before call Init(), MPI.Is_initialized: False
Before call Init(), MPI.Is_finalized: False
After call Init(), MPI.Is_initialized: True
After call Init(), MPI.Is_finalized: False
I am Process 0...
After call Init(), MPI.Is_initialized: True
After call Init(), MPI.Is_finalized: False
I am Process 1...
After call Finalize(), MPI.Is_initialized: True
After call Finalize(), MPI.Is_finalized: True
After call Finalize(), MPI.Is_initialized: True
After call Finalize(), MPI.Is_finalized: True

以上介紹了 mpi4py 中初始化和運(yùn)行時(shí)設(shè)置,在下一篇中我們將介紹 mpi4py 中的 profiling。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 計(jì)算機(jī)編程語(yǔ)言很多,但是適合高性能數(shù)值計(jì)算的語(yǔ)言卻并不多,在高性能計(jì)算的項(xiàng)目中通常會(huì)使用到的語(yǔ)言有 Fort...
    自可樂(lè)閱讀 20,296評(píng)論 3 21
  • 官方文檔 初始化 Initialization是為準(zhǔn)備使用類(lèi),結(jié)構(gòu)體或者枚舉實(shí)例的一個(gè)過(guò)程。這個(gè)過(guò)程涉及了在實(shí)例里...
    hrscy閱讀 1,199評(píng)論 0 1
  • 在上一篇中我們介紹了 MPI-3 中共享內(nèi)存操作,下面我們將介紹 MPI 中多線程的使用,以助于我們理解 MPI-...
    自可樂(lè)閱讀 12,539評(píng)論 1 2
  • 開(kāi)篇名義,我,慕想云??,入駐簡(jiǎn)書(shū),不問(wèn)晴雨,不問(wèn)因果,與自己交談,識(shí)通感者于檻內(nèi),這就是好的。我信仰極簡(jiǎn),最?lèi)?ài)辛...
    慕想云閱讀 320評(píng)論 0 0
  • 《明知故犯》 早知道你會(huì)來(lái) 我就不用趕走時(shí)光 遲到的那些年都過(guò)得剛剛好 《北極星》 走過(guò)的八千里 沒(méi)有你,都是窮途...
    Ervin流顏花落閱讀 986評(píng)論 37 25

友情鏈接更多精彩內(nèi)容