mpi4py 中的进程拓扑方法

上一篇中我们简要介绍了进程拓扑的基本概念,下面我们将介绍与进程拓扑相关的一些方法。

创建方法

注意:只能在组内通信子(Intracomm)或 Intracomm 类子类通信子上创建拓扑通信子。创建拓扑通信子的相关方法(MPI.Intracomm 类的方法)接口如下:

Create_cart(self, dims, periods=None, bool reorder=False)

创建并返回一个新的通信子,在这个新通信子上附加与笛卡尔拓扑管理有关的数据结构及相应的操作信息。dims 是长度为维数 ndims 的整型数组,指出各维的进程数,periods 可取值 None,True,False 或长度为 ndims 的布尔数组,指出各维是否周期性循环,默认值 None 表示各维都不循环,True/False 表示各维都循环/都不循环。布尔型的 reorder 指出进程在新创建的通信子组内是否进行重排序,默认值为 False,此时进程在新创建的通信子组内的顺序与在原通信子组内的顺序相同。在创建过程中,允许新通信子中包含的进程数少于原通信子中的进程数,此时多余的进程将返回 MPI.COMM_NULL,但不允许多于原通信子中的进程数。

Create_graph(self, index, edges, bool reorder=False)

创建并返回一个新的通信子,在这个新通信子上附加与图结构的拓扑管理有关的数据结构及相应的操作信息。通过 indexedges 两个整数序列参数来描述整个图的结构,假设生成的图拓扑的节点个数为 nnodes,各节点按照从 0 到 nnodes - 1 编号,其邻居节点都顺序、连续地放在 edges 序列中,通过 index 序列分别指定各编号节点的邻居节点列表在 edges 序列中的起始位置,index 的第 i 个元素保存图中前 i 个节点的邻居总数,而各节点的邻居顺序地排成一个一维序列存放在 edges 中。因此,index[0] 为节点 0 的邻居个数,index[i] - index[i - 1] 为节点 i > 0 的邻居个数,而节点 0 的邻居保存在 edges[0:(index[0] - 1)] 范围内,节点 i > 0 的邻居保存在 edges[index[i-1]:(index[i] - 1)] 范围内。布尔型的 reorder 指出进程在新创建的通信子组内是否进行重排序,默认值为 False,此时进程在新创建的通信子组内的顺序与在原通信子组内的顺序相同。在创建过程中,允许新通信子中包含的进程数少于原通信子中的进程数,此时多余的进程将返回 MPI.COMM_NULL,但不允许多于原通信子中的进程数。

下面举个简单的例子来说明如何设置以上参数,比如创建一个含有 4 个节点的图拓扑,各个节点的邻居节点如下表所示:

Node Neighbors
0 1, 3
1 0
2 3
3 0, 2

则相应的参数可以如下设置:

Argument Input
nnodes 4
index 2, 3, 4, 6
edges 1, 3, 0, 3, 0, 2
Create_dist_graph_adjacent(self, sources, destinations, sourceweights=None, destweights=None, Info info=INFO_NULL, bool reorder=False)

创建一个分布式的图拓扑通信子。MPI-3 中引进的新方法,暂不作介绍。

Create_dist_graph(self, sources, degrees, destinations, weights=None, Info info=INFO_NULL, bool reorder=False)

创建一个分布式的图拓扑通信子。MPI-3 中引进的新方法,暂不作介绍。

笛卡尔拓扑通信子(Cartcomm)

方法

继承自拓扑通信子(Topocomm),其特有的一些方法有:

Get_topo(self)

获取当前拓扑通信子的详细信息。也可以通过属性 topo 获取。

Get_cart_rank(self, coords)

返回根据笛卡尔拓扑的坐标 coords 得到的进程编号。

Get_coords(self, int rank)

返回根据进程编号 rank 得到的笛卡尔拓扑坐标。

Get_dim(self)

返回笛卡尔拓扑的维数。也可以通过属性 dimndim 获取。

Shift(self, int direction, int disp)

给定一个笛卡尔坐标平移的维度 direction 和步长 disp(大于 0 表示正方向,小于 0 表示负方向),返回平移的源进程号和目的进程号。对无周期的维,平移到末端后再平移将得到 MPI.PROC_NULL。

Sub(self, remain_dims)

将当前的笛卡尔拓扑通信子组划分成若干子组,每个子组对应原笛卡尔拓扑网格的子网格,返回由这些子组创建成的子笛卡尔拓扑通信子。由参数 remain_dims 决定如何进行划分:如果 remain_dims[i] 为 True 表示在新坐标中保留第 i 维,否则去掉第 i 维。该方法与 MPI.Comm.Split 方法的功能类似。

例如,如果当前笛卡尔拓扑定义了一个 2 × 3 × 4 的网格,当 remain_dims = [True, False, True] 时会创建 3 个子笛卡尔拓扑通信子,每一个包含 8 个进程构成一个 2 × 4 网格。当 remain_dims = [False, False, True] 时会创建 6 个子笛卡尔拓扑通信子,每一个包含 4 个进程构成一个一维网格。

属性

coords

笛卡尔拓扑坐标。

dim

笛卡尔拓扑维数。

dims

笛卡尔拓扑各维的进程数。

ndim

笛卡尔拓扑维数。

periods

笛卡尔拓扑各维的周期性。

topo

拓扑信息。

图拓扑通信子(Graphcomm)

方法

继承自拓扑通信子(Topocomm),其特有的一些方法有:

Get_topo(self)

获取当前拓扑通信子的详细信息。也可以通过属性 topo 获取。

Get_dims(self)

返回当前图拓扑的节点数和边数。也可以通过属性 dims 获取。

Get_neighbors(self, int rank)

返回进程 rank 的所有邻居节点。

Get_neighbors_count(self, int rank)

返回进程 rank 的邻居节点的个数。

属性

dims

图的节点数和边数。

edges

图的边。

index

图的 index。

nedges

图的边数。

neighbors

所有邻居节点。

nneighbors

邻居节点的数目。

nnodes

节点数。

topo

拓扑信息。

分布式图拓扑(Distgraphcomm)

继承自拓扑通信子(Topocomm),其特有的一些方法有:

方法

Get_dist_neighbors(self)

获取分布式图拓扑的邻居节点。

Get_dist_neighbors_count(self)

获取分布式图拓扑的邻居节点数目。

例程

下面给出部分进程拓扑操作相关方法的使用例程。

# topo.py

"""
Demonstrates the usage of Create_cart, Get_coords, Get_cart_rank, Shift, Sub.

Run this with 6 processes like:
$ mpiexec -n 6 python topo.py
"""

import numpy as np
from mpi4py import MPI


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

# create a 3 x 2 Cartesian topocomm
#      period = True  period = True
#       |   (4)     |   (5)     |
# ------+-----------+-----------+--------
# (-2)  |  0,0 (0)  |  0,1 (1)  |  (-2)     period = False
# ------+-----------+-----------+--------
# (-2)  |  1,0 (2)  |  1,1 (3)  |  (-2)     period = False
# ------+-----------+-----------+--------
# (-2)  |  2,0 (4)  |  2,1 (5)  |  (-2)     period = False
# ------+-----------+-----------+--------
#       |   (0)     |   (1)     |
dims = [3, 2]
periods = [True, False]
cart_comm = comm.Create_cart(dims, periods)
print 'rank %d has topo:' % rank, cart_comm.topo
print 'rank %d has coords:' % rank, cart_comm.coords
print 'rank %d has dims:' % rank, cart_comm.dims
print 'rank %d has periods:' % rank, cart_comm.periods

print 'rank 3 has coords:', cart_comm.Get_coords(3)
print 'coords [1, 1] is rank:', cart_comm.Get_cart_rank([1, 1])

# shift
sd = cart_comm.Shift(0, 1)
print 'shift 1 for row: rank %d has (source, dest) = (%d, %d)' % (rank, sd[0], sd[1])
sd = cart_comm.Shift(1, 1)
print 'shift 1 for column: rank %d has (source, dest) = (%d, %d)' % (rank, sd[0], sd[1])
print 'MPI.PROC_NULL =', MPI.PROC_NULL

# sub
remain_dims = [True, False]
sub_comm = cart_comm.Sub(remain_dims)
# sub_comm1  sub_comm2
# 0 <-> 0  |  1 <-> 0
# 2 <-> 1  |  3 <-> 1
# 4 <-> 2  |  5 <-> 2
print 'rank %d has topo (sub_comm):' % rank, sub_comm.topo

运行结果如下:

$ mpiexec -n 6 python topo.py
rank 0 has topo: ([3, 2], [1, 0], [0, 0])
rank 0 has coords: [0, 0]
rank 0 has dims: [3, 2]
rank 0 has periods: [1, 0]
rank 3 has coords: array('i', [1, 1])
coords [1, 1] is rank: 3
shift 1 for row: rank 0 has (source, dest) = (4, 2)
shift 1 for column: rank 0 has (source, dest) = (-2, 1)
MPI.PROC_NULL = -2
rank 0 has topo (sub_comm): ([3], [1], [0])
rank 1 has topo: ([3, 2], [1, 0], [0, 1])
rank 1 has coords: [0, 1]
rank 1 has dims: [3, 2]
rank 1 has periods: [1, 0]
rank 3 has coords: array('i', [1, 1])
coords [1, 1] is rank: 3
shift 1 for row: rank 1 has (source, dest) = (5, 3)
shift 1 for column: rank 1 has (source, dest) = (0, -2)
MPI.PROC_NULL = -2
rank 1 has topo (sub_comm): ([3], [1], [0])
rank 2 has topo: ([3, 2], [1, 0], [1, 0])
rank 2 has coords: [1, 0]
rank 2 has dims: [3, 2]
rank 2 has periods: [1, 0]
rank 3 has coords: array('i', [1, 1])
coords [1, 1] is rank: 3
shift 1 for row: rank 2 has (source, dest) = (0, 4)
shift 1 for column: rank 2 has (source, dest) = (-2, 3)
MPI.PROC_NULL = -2
rank 2 has topo (sub_comm): ([3], [1], [1])
rank 3 has topo: ([3, 2], [1, 0], [1, 1])
rank 3 has coords: [1, 1]
rank 3 has dims: [3, 2]
rank 3 has periods: [1, 0]
rank 3 has coords: array('i', [1, 1])
coords [1, 1] is rank: 3
shift 1 for row: rank 3 has (source, dest) = (1, 5)
shift 1 for column: rank 3 has (source, dest) = (2, -2)
MPI.PROC_NULL = -2
rank 3 has topo (sub_comm): ([3], [1], [1])
rank 4 has topo: ([3, 2], [1, 0], [2, 0])
rank 4 has coords: [2, 0]
rank 4 has dims: [3, 2]
rank 4 has periods: [1, 0]
rank 3 has coords: array('i', [1, 1])
coords [1, 1] is rank: 3
shift 1 for row: rank 4 has (source, dest) = (2, 0)
shift 1 for column: rank 4 has (source, dest) = (-2, 5)
MPI.PROC_NULL = -2
rank 4 has topo (sub_comm): ([3], [1], [2])
rank 5 has topo: ([3, 2], [1, 0], [2, 1])
rank 5 has coords: [2, 1]
rank 5 has dims: [3, 2]
rank 5 has periods: [1, 0]
rank 3 has coords: array('i', [1, 1])
coords [1, 1] is rank: 3
shift 1 for row: rank 5 has (source, dest) = (3, 1)
shift 1 for column: rank 5 has (source, dest) = (4, -2)
MPI.PROC_NULL = -2
rank 5 has topo (sub_comm): ([3], [1], [2])

以上我们介绍了 mpi4py 中的进程拓扑操作,在下一篇中我们将介绍动态进程管理。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容