美文网首页Python 并行计算
mpi4py初始化和运行时设置

mpi4py初始化和运行时设置

作者: 自可乐 | 来源:发表于2018-10-01 21:24 被阅读154次

    上一篇中我们介绍了 mpi4py 并行读/写 numpy npy 文件的方法,下面我们将介绍 mpi4py 软件包初始化相关的一些设置。

    初始化及运行时设置

    有在 C/C++/Fortran 等其它计算机语言下编写 MPI 并行计算程序经验的读者都知道,在使用 MPI 时除了要导入 MPI 的相应头文件之外,还要首先调用 MPI_Init/MPI_Init_thread 来初始化 MPI 环境,然后才能使用 MPI 库提供的各项功能,在结束 MPI 程序时一般还需要调用 MPI_Finalize 以结束 MPI 环境。但是在使用 mpi4py 时,我们一般并没有调用 mpi4py 中对应的函数 mpi4py.MPI.Init/mpi4py.MPI.Init_thread 和 mpi4py.MPI.Finalize,这是为什么呢?原来在导入和使用 mpi4py 时,mpi4py 软件包会做大量的初始化工作。在导入 mpi4py 时如果不做一些特定的设置,就会采用 mpi4py 的默认初始化设置,其中就包括对 mpi4py.MPI.Init/mpi4py.MPI.Init_thread 和 mpi4py.MPI.Finalize 的默认调用。这些默认的初始化设置在大多数情况下都是合适的,并不需要我们显式地进行设置,因此能够节省我们一部分工作,使我们可以简洁而方便地编写 Python 环境下的 MPI 并行计算程序。但是在某些情况下,我们需要进行一些特定的初始化设置,mpi4py 允许定制一些特定的初始化选项,我们只需在导入 mpi4py 的 MPI 模块之前进行相应的设置或调用相应的函数即可。下面是 mpi4py 提供的初始化及运行时设置函数:

    mpi4py.rc(**kargs)
    

    mpi4py 运行时设置(Runtime configuration)函数。可以设置的参数包括:initialize 是否在 import MPI 时自动调用 MPI.Init 函数以初始化 MPI 环境,默认为 True;threads 是否要求多线程支持,默认为 True;thread_level,要求的线程级别,默认为 'multiple',可供选择的级别有 'multiple', 'serialized', 'funneled' 和 'single';finalize,是否在程序退出时自动调用 MPI.Finalize,默认为 None,表示和 initialize 的值相同,也可以设置为 True 或 False;fast_reduce,是否使用树算法进行快速的规约操作,默认为 True;recv_mprobe,是否采用匹配的 probe 方法来接收消息,默认为 True;errors,错误处理策略,默认为 'exception',表示发生错误时会抛出异常,还可以设置为 'default',表示使用 MPI 的默认错误处理机制,或为 'fatal',表示将所有的错误都设置成严重级别,此时程序遇到错误时一般会中止。

    我们可以调用以上函数进行初始化及运行时设置,也可以直接设置 rc 的相应参数完成同样的设置工作。rc 的对应属性默认设置为:

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

    想要改变某项设置,只需设置 rc 的对应属性为一个不同的值即可,如 rc.initialize = False。

    其它相关函数

    另外,下面是一些初始化及运行时相关的其它函数方法:

    mpi4py.get_include()
    

    返回 mpi4py 软件包的头文件目录。一些使用 mpi4py 的扩展模块的编译需要指定 mpi4py 的相关头文件路径,可以使用该函数返回头文件路径。例如,可以使用 Python distutils (或者 numpy 的 distutils)如下编译一个扩展模块:

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

    返回一个包含 MPI 相关信息的字典。

    mpi4py.profile(name, **kargs)
    

    MPI profiling 支持。name 是要导入的 profiler 库。其它可设置参数有:path,一系列由字符串表示的路径,用来搜寻所用的 profiler,logfile,profiler 所产生的日志文件前缀。

    有关 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()
    

    运行结果如下:

    $ 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 中初始化和运行时设置,在下一篇中我们将介绍 mpi4py 中的 profiling。

    相关文章

      网友评论

        本文标题:mpi4py初始化和运行时设置

        本文链接:https://www.haomeiwen.com/subject/ysanoftx.html