当前位置:   article > 正文

mpi4py 中的组管理 API_python mpi4py api

python mpi4py api

本文从本人简书博客同步过来

上一篇中我们介绍了 mpi4py 中组与通信子的基本概念,下面我们将介绍 mpi4py 中的组管理 API

组的构建和取消 API

MPI.Comm.Get_group(self)
  • 1

返回与通信子 comm 相关的组。

MPI.Group.Dup(self)
  • 1

复制当前组而产生一个新的组。

MPI.Group.Free(self)
  • 1

释放组对象。

MPI.Group.Union(type cls, Group group1, Group group2)
  • 1

返回 group1group2 的并集,得到一个新的组 newgroup,进程的 rank 序号为 group1 先,group2 后。

MPI.Group.Intersect(type cls, Group group1, Group group2)
MPI.Group.Intersection(type cls, Group group1, Group group2)
  • 1
  • 2

返回 group1group2 的交集所形成的新的组 newgroup,进程的 rank 顺序同 group1

MPI.Group.Difference(type cls, Group group1, Group group2)
  • 1

返回一个新的组 newgroup, 包含在 group1 中出现但不在 group2 中出现的进程。进程的 rank 顺序同 group1

MPI.Group.Incl(self, ranks)
  • 1

由当前组中所列出的一组进程 ranks 而产生一个新的组 newgroup,这些进程在 newgroup 中将重新编号。如果 ranks 是一个空的列表,则返回的 newgroup 是 MPI.GROUP_EMPTY。

MPI.Group.Excl(self, ranks)
  • 1

由当前组中不包含在 ranks 中的一组进程产生一个新的组 newgroup, 这些进程在 newgroup 中将重新编号。ranks中的每一个元素都必须是当前组中的有效的 rank 号。 如果 ranks 是一个空的列表,则返回的 newgroup 与原组相同。

MPI.Group.Range_incl(self, ranks)
  • 1

将当前组中的 n 个 range 三元组所组成的列表 ranks 所包含的进程形成一个 newgroup,并返回这个 newgroup。 其中每一个 range三元组为下列形式 (first, last, stride)。例如,如果 ranks = [(1, 9, 2), (15, 20, 3), (21, 30, 2)],则结果将包含如下进程 [1, 3, 5, 7, 9, 15, 18, 21, 23, 25, 27, 29]。

MPI.Group.Range_excl(self, ranks)
  • 1

从当前组中除去n 个 range 三元组所组成的列表 ranks 所包含的进程后形成一个 newgroup,并返回这个 newgroup

访问组的相关信息和属性

MPI.Group.Get_rank(self)
  • 1

返回调用进程在给定组内的 rank,进程如果不在该组内则返回 MPI.UNDEFINED。注意:此信息也可以通过属性 rank 获取。

MPI.Group.Get_size(self)
  • 1

返回指定组所包含的进程数。注意:此信息也可以通过属性 size 获取。

MPI.Group.Translate_ranks(type cls, Group group1, ranks1, Group group2=None)
  • 1

返回进程组 group1 中的 n 个进程(由 ranks1 指定)在进程组 group2 中的编号。如果 group2 中不包含 group1 所指定的进程,则对应的返回值为 MPI.UNDEFINED。

MPI.Group.Compare(type cls, Group group1, Group group2)
  • 1

如果 group1group2 中所含进程以及相同进程的编号相同则返回 MPI.IDENT,如果二者所含进程完全相同但相同进程在二者中的编号不同则返回 MPI.SIMILAR,否则返回 MPI.UNEQUAL。

下面给出这些与组相关的 API 的使用例程。

# comm_group.py

import numpy as np
from mpi4py import MPI


comm = MPI.COMM_WORLD
rank = comm.Get_rank()
size = comm.Get_size()

# get the group associated with comm
grp = comm.Get_group()
print 'Group rank %d, group size: %d' % (grp.rank, grp.size)

# create a new group by duplicate `grp`
grp_new = grp.Dup()
print 'The duplicated new group:', grp_new
grp_new.Free()

print 'MPI.UNDEFINED:', MPI.UNDEFINED

# produce a group by include ranks 0, 1, 3 in `grp`
grp_incl = grp.Incl([0, 1, 3])
print 'rank %d in grp -> rank %d in grp_incl' % (rank, grp_incl.rank)
# produce a group by exclude ranks 1, 2 in `grp`
grp_excl = grp.Excl([1, 2])
print 'rank %d in grp -> rank %d in grp_excl' % (rank, grp_excl.rank)

grp_range_incl = grp.Range_incl([(0, 3, 2), (1, 2, 2)])
print 'rank %d in grp -> rank %d in grp_range_incl' % (rank, grp_range_incl.rank)
grp_range_excl = grp.Range_excl([(0, 3, 2), (1, 2, 2)])
print 'rank %d in grp -> rank %d in grp_range_excl' % (rank, grp_range_excl.rank)

# produce a group by combining `grp_incl` and `grp_excl`
grp_union = MPI.Group.Union(grp_incl, grp_excl)
print 'Size of grp_union: %d' % grp_union.size
# produce a group as the intersection of `grp_incl` and `grp_excl`
grp_intersect = MPI.Group.Intersect(grp_incl, grp_excl)
print 'Size of grp_intersect: %d' % grp_intersect.size
# grp_intersection = MPI.Group.Intersection(grp_incl, grp_excl)
# print 'Size of grp_intersection: %d' % grp_intersection.size
# produce a group from the difference of `grp_incl` and `grp_excl`
grp_diff = MPI.Group.Difference(grp_incl, grp_excl)
print 'Size of grp_diff: %d' % grp_diff.size

# translate the ranks of processes in `grp_incl` to those in `grp_excl`
print 'translate:', MPI.Group.Translate_ranks(grp_incl, [0, 1, 3], grp_excl)

print 'MPI.IDENT:', MPI.IDENT
print 'MPI.SIMILAR:', MPI.SIMILAR
print 'MPI.UNEQUAL:', MPI.UNEQUAL

# compare `grp_incl` and `grp_incl`
print MPI.Group.Compare(grp_incl, grp_incl)
# compare `grp_incl` and `grp_excl`
print MPI.Group.Compare(grp_incl, grp_excl)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56

运行结果如下:

$ mpiexec -n 4 python comm_group.py
Group rank 2, group size: 4
The duplicated new group: <mpi4py.MPI.Group object at 0x19af310>
MPI.UNDEFINED: -32766
rank 2 in grp -> rank -32766 in grp_incl
rank 2 in grp -> rank -32766 in grp_excl
rank 2 in grp -> rank 1 in grp_range_incl
rank 2 in grp -> rank -32766 in grp_range_excl
Size of grp_union: 3
Size of grp_intersect: 2
Size of grp_diff: 1
translate: array('i', [0, -32766, -32766])
MPI.IDENT: 0
MPI.SIMILAR: 2
MPI.UNEQUAL: 3
0
3
Group rank 3, group size: 4
The duplicated new group: <mpi4py.MPI.Group object at 0x27ab310>
MPI.UNDEFINED: -32766
rank 3 in grp -> rank 2 in grp_incl
rank 3 in grp -> rank 1 in grp_excl
rank 3 in grp -> rank -32766 in grp_range_incl
rank 3 in grp -> rank 0 in grp_range_excl
Size of grp_union: 3
Size of grp_intersect: 2
Size of grp_diff: 1
translate: array('i', [0, -32766, -32766])
MPI.IDENT: 0
MPI.SIMILAR: 2
MPI.UNEQUAL: 3
0
3
Group rank 0, group size: 4
The duplicated new group: <mpi4py.MPI.Group object at 0x2739310>
MPI.UNDEFINED: -32766
rank 0 in grp -> rank 0 in grp_incl
rank 0 in grp -> rank 0 in grp_excl
rank 0 in grp -> rank 0 in grp_range_incl
rank 0 in grp -> rank -32766 in grp_range_excl
Size of grp_union: 3
Size of grp_intersect: 2
Size of grp_diff: 1
translate: array('i', [0, -32766, -32766])
MPI.IDENT: 0
MPI.SIMILAR: 2
MPI.UNEQUAL: 3
0
3
Group rank 1, group size: 4
The duplicated new group: <mpi4py.MPI.Group object at 0x29fd310>
MPI.UNDEFINED: -32766
rank 1 in grp -> rank 1 in grp_incl
rank 1 in grp -> rank -32766 in grp_excl
rank 1 in grp -> rank 2 in grp_range_incl
rank 1 in grp -> rank -32766 in grp_range_excl
Size of grp_union: 3
Size of grp_intersect: 2
Size of grp_diff: 1
translate: array('i', [0, -32766, -32766])
MPI.IDENT: 0
MPI.SIMILAR: 2
MPI.UNEQUAL: 3
0
3
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65

上面我们介绍了 mpi4py 中的组管理 API, 在下一篇中我们将介绍通信子管理 API。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/260189
推荐阅读
相关标签
  

闽ICP备14008679号