在上一篇中我们简要介绍了进程拓扑的基本概念,下面我们将介绍与进程拓扑相关的一些方法。
创建方法
注意:只能在组内通信子(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)
创建并返回一个新的通信子,在这个新通信子上附加与图结构的拓扑管理有关的数据结构及相应的操作信息。通过 index
和 edges
两个整数序列参数来描述整个图的结构,假设生成的图拓扑的节点个数为 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 |