在上一篇中我们介绍了 MPI-3 中大的计数及相关函数,下面我们将介绍 MPI 3.1 新增的若干功能。
MPI 3.1 标准于 2015 年 6 月发布,主要是针对 MPI 3.0 的改正,但也增加了少量的新功能。
新增功能
- 新增 MPI_Aint_add 和 MPI_Aint_diff 以对内存地址进行更安全和更具移植性的算术加减操作。
这两个新函数用来替代对地址的直接 + 和 - 算术操作。提供这两个新函数的原因是,地址类型的整数 MPI_Aint 或者 INTEGER(KIND=MPI_ADDRESS_KIND) 是有符号的整型数,绝对地址是无符号的整型数,对地址整数进行直接的 + 和 - 操作可能会溢出或产生其它未定义的结果。新增加的函数可以对内存地址进行更安全和更具移植性的算术加减操作,因此在支持此新函数的环境下,不应该对内存地址再执行内置的 + 和 - 运算。
这两个函数在 mpi4py 中的接口为:
MPI.Aint_add(Aint base, Aint disp)
计算内存中的一个绝对地址 base
和一个相对偏移 disp
的和(为内存中的一个绝对地址)并返回。
MPI.Aint_diff(Aint addr1, Aint addr2)
计算内存中的两个绝对地址 addr1
和 addr2
之间的相对偏移。
- 函数 MPI_Initialized, MPI_Finalize, MPI_Query_thread, MPI_Is_thread_main, MPI_Get_version 和 MPI_Get_library_version 可以在线程中不受限制地调用(就像线程支持最普遍的线程等级 MPI_THREAD_MULTIPLE 一样),而不论真正支持的线程等级。
这几个函数在 mpi4py 中的接口为:
MPI.Is_initialized()
MPI.Is_finalized()
MPI.Query_thread()
MPI.Is_thread_main()
MPI.Get_version()
MPI.Get_library_version()
- 新增非阻塞集合并行 I/O 函数:MPI_File_iread_at_all + MPI_File_iwrite_at_all 和 MPI_File_iread_all + MPI_File_iwrite_all。引进这些新函数的目的是最终替换掉分步集合 I/O 操作函数,因为分步集合 I/O 操作存在一些限制:在一个时刻对一个文件句柄用户只能有一个活动的分步集合操作存在,即用户在没有结束(调用匹配的 xxx_end)一个 xxx_begin 操作之前,不能对这个文件句柄启动另外一个 xxx_begin 操作。
这几个函数在 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)
- 新的工具接口函数 MPI_T_cvar_get_index, MPI_T_pvar_get_index, MPI_T_category_get_index 和错误代码 MPI_T_ERR_INVALID 和 MPI_T_ERR_INVALID_NAME。
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 中的属性和命名操作。
网友评论