我nx
ny
nz
个进程的{strong> 3D笛卡尔拓扑。
有数学计算只涉及处理器的“铅笔”。如果3
按3
按3
个流程矩阵排列,从0
到26
,则流程4
涉及三个流程操作:
13
和22
1
和7
3
和5
数学运算需要属于同一支铅笔的进程之间的点对点和集体通信。
对于点对点通信的问题,我使用MPI_CART_SHIFT
让每个进程知道相邻进程的排名。 (然后我将使用MPI_SENDRECV
。)
关于集体通信的问题,如何进行此类通信?
我认为解决方案可能是定义“铅笔”通信器,其数量为nx*ny + nx*nz + ny*nz
(所需的通信器数量相对于进程数量渐近地小,因为每个方向的进程数量增加)
这是唯一的方法吗?是否没有依靠笛卡尔传播者进行这种集体交流的标准子程序?
答案 0 :(得分:5)
邻居集体实际上是唯一可以直接利用笛卡尔拓扑连接信息的例程。但是,他们会以同样的方式对待所有方向(x,y,z),因此对你的铅笔方案没有帮助。
我认为唯一的方法是按照你的建议,即构建一套完整的铅笔传播者。请注意,通过在笛卡尔通信器上调用MPI_Cart_sub,MPI确实为您提供了一种简单的方法。一旦你构建了铅笔通信器,那么你也可以选择在铅笔上使用邻居集体,而不是点对点,但对于一维通信器,不清楚这对于手工计算邻居有很多好处。目前做的。