MPI 笛卡尔拓扑中沿方向的集体通信
Collective communications along directions in MPI cartesian topology
我有 3D 笛卡尔拓扑 nx
ny
nz
个进程。
有一些数学计算同时只涉及 "pencils" 个处理器。在 3
by 3
by 3
过程矩阵的情况下,从 0
到 26
,过程 4
涉及三个操作:
- 沿第一个方向
13
和 22
- 沿第二个方向
1
和7
- 沿第三方向
3
和5
数学运算需要属于同一个铅笔的进程之间的点对点通信和集体通信。
为了点对点通信,我使用MPI_CART_SHIFT
让每个进程知道相邻进程的行列。 (那我就用MPI_SENDRECV
。)
为了什么集体沟通,如何进行这样的沟通?
我认为一个解决方案可能是定义 "pencil" 个通信器,其数量为 nx*ny + nx*nz + ny*nz
(所需的通信器数量相对于进程数量渐近较小,因为每个方向的进程数量成长)。
这是唯一的方法吗?难道没有依赖笛卡尔通信子的标准子程序来进行这种集体通信吗?
邻域集体实际上是唯一可以直接利用笛卡尔拓扑连通性信息的例程。但是,他们会以相同的方式处理所有方向 (x, y, z),因此对您的铅笔方案没有帮助。
我认为唯一的方法就是按照你的建议,即构建一套完整的铅笔通信器。请注意,MPI 确实通过在笛卡尔通信器上调用 MPI_Cart_sub 为您提供了一种简单的方法来执行此操作。一旦你构建了铅笔通信器,那么你也可以选择使用铅笔上的邻域集体而不是点对点,但是对于一维通信器,尚不清楚这比手动计算邻居有很多优势,因为你目前做。
我有 3D 笛卡尔拓扑 nx
ny
nz
个进程。
有一些数学计算同时只涉及 "pencils" 个处理器。在 3
by 3
by 3
过程矩阵的情况下,从 0
到 26
,过程 4
涉及三个操作:
- 沿第一个方向
13
和22
- 沿第二个方向
1
和7
- 沿第三方向
3
和5
数学运算需要属于同一个铅笔的进程之间的点对点通信和集体通信。
为了点对点通信,我使用MPI_CART_SHIFT
让每个进程知道相邻进程的行列。 (那我就用MPI_SENDRECV
。)
为了什么集体沟通,如何进行这样的沟通?
我认为一个解决方案可能是定义 "pencil" 个通信器,其数量为 nx*ny + nx*nz + ny*nz
(所需的通信器数量相对于进程数量渐近较小,因为每个方向的进程数量成长)。
这是唯一的方法吗?难道没有依赖笛卡尔通信子的标准子程序来进行这种集体通信吗?
邻域集体实际上是唯一可以直接利用笛卡尔拓扑连通性信息的例程。但是,他们会以相同的方式处理所有方向 (x, y, z),因此对您的铅笔方案没有帮助。
我认为唯一的方法就是按照你的建议,即构建一套完整的铅笔通信器。请注意,MPI 确实通过在笛卡尔通信器上调用 MPI_Cart_sub 为您提供了一种简单的方法来执行此操作。一旦你构建了铅笔通信器,那么你也可以选择使用铅笔上的邻域集体而不是点对点,但是对于一维通信器,尚不清楚这比手动计算邻居有很多优势,因为你目前做。