Python 并行计算

MPI 3.1 新增的若干功能

2018-07-14  本文已影响63人  自可乐

上一篇中我们介绍了 MPI-3 中大的计数及相关函数,下面我们将介绍 MPI 3.1 新增的若干功能。

MPI 3.1 标准于 2015 年 6 月发布,主要是针对 MPI 3.0 的改正,但也增加了少量的新功能。

新增功能

这两个新函数用来替代对地址的直接 + 和 - 算术操作。提供这两个新函数的原因是,地址类型的整数 MPI_Aint 或者 INTEGER(KIND=MPI_ADDRESS_KIND) 是有符号的整型数,绝对地址是无符号的整型数,对地址整数进行直接的 + 和 - 操作可能会溢出或产生其它未定义的结果。新增加的函数可以对内存地址进行更安全和更具移植性的算术加减操作,因此在支持此新函数的环境下,不应该对内存地址再执行内置的 + 和 - 运算。

这两个函数在 mpi4py 中的接口为:

MPI.Aint_add(Aint base, Aint disp)

计算内存中的一个绝对地址 base 和一个相对偏移 disp 的和(为内存中的一个绝对地址)并返回。

MPI.Aint_diff(Aint addr1, Aint addr2)

计算内存中的两个绝对地址 addr1addr2 之间的相对偏移。

这几个函数在 mpi4py 中的接口为:

MPI.Is_initialized()

MPI.Is_finalized()

MPI.Query_thread()

MPI.Is_thread_main()

MPI.Get_version()

MPI.Get_library_version()

这几个函数在 mpi4py 中的接口为:

MPI.File.Iread_all(self, buf)

MPI.File.Iwrite_all(self, buf)

MPI.File.Iread_at_all(self, Offset offset, buf)

MPI.File.Iwrite_at_all(self, Offset offset, buf)

mpi4py 目前还不支持工具接口,故不作进一步介绍。

例程

下面给出使用例程。

# Aint_add_diff.py


"""
Demonstrates the usage of MPI.Aint_add and MPI.Aint_diff.

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

import numpy as np
from mpi4py import MPI


comm = MPI.COMM_WORLD
rank = comm.rank

ary = np.arange(10, dtype='i')
base = MPI.Get_address(ary)
print 'rank %d has base address: %d' % (rank, base)
disp = 4
addr = MPI.Aint_add(base, disp)
print 'rank %d has base + %d = %d' % (rank, disp, addr)
diff = MPI.Aint_diff(addr, base)
print 'rank %d has %d - base = %d' % (rank, addr, diff)

运行结果如下:

$ mpiexec -n 2 python Aint_add_diff.py
rank 0 has base address: 25087056
rank 0 has base + 4 = 25087060
rank 0 has 25087060 - base = 4
rank 1 has base address: 46071520
rank 1 has base + 4 = 46071524
rank 1 has 46071524 - base = 4

以上介绍了 MPI 3.1 新增的若干功能,在下一篇中我们将介绍 mpi4py 中的属性和命名操作。

上一篇 下一篇

猜你喜欢

热点阅读