MPI_Cart_create与MPI_Cart_shift调用异常:邻居进程ID不符求助
MPI_Cart_shift邻居不符合预期的原因及解决方法
核心问题:维度顺序与方向的映射错位
你在MPI_Cart_create中定义的维度顺序是z、y、x(对应nprocxyz[3]={2,3,2},即维度0=z,维度1=y,维度2=x),但调用MPI_Cart_shift时错误地将维度0对应x方向、维度2对应z方向,导致邻居方向完全错位。
同时你的预期邻居存在错误:总进程数为12(rank范围0-11),不存在rank=12的进程;z=1是z维度的最后一个索引(z维度大小为2,索引0/1),z+1超出范围,无有效邻居。
错误分析(以进程10为例)
进程10的坐标为(z=1,y=2,x=0),根据MPI笛卡尔拓扑的rank计算规则(C语言行优先,维度从左到右为慢变化到快变化):rank = z*(y_dim*x_dim) + y*x_dim + x = 1*(3*2)+2*2+0=10,与你的结果一致。
当前错误调用的MPI_Cart_shift实际获取的是:
MPI_Cart_shift(comm3d, 0, 1, ...):获取z方向邻居(z-1=0对应rank=4,z+1=2超出返回-2)MPI_Cart_shift(comm3d, 1, 1, ...):获取y方向邻居(y-1=1对应rank=8,y+1=3超出返回-2)MPI_Cart_shift(comm3d, 2, 1, ...):获取x方向邻居(x-1=-1返回-2,x+1=1对应rank=11)
这正是你得到的邻居数组[4,-2,8,-2,-2,11],只是方向对应完全颠倒。
解决方案:修正维度与方向的对应
调整MPI_Cart_shift的维度参数,匹配你定义的z、y、x维度顺序:
// x-direction 对应维度2 MPI_Cart_shift(comm3d, 2, 1, &neighbors[0], &neighbors[1]); // y-direction 对应维度1 MPI_Cart_shift(comm3d, 1, 1, &neighbors[2], &neighbors[3]); // z-direction 对应维度0 MPI_Cart_shift(comm3d, 0, 1, &neighbors[4], &neighbors[5]);
修正后进程10的正确邻居数组为[-2,11,8,-2,4,-2],完全符合拓扑逻辑:
- x方向:x-1=-1(无邻居,返回-2),x+1=1(对应rank=11)
- y方向:y-1=1(对应rank=8),y+1=3(无邻居,返回-2)
- z方向:z-1=0(对应rank=4),z+1=2(无邻居,返回-2)
额外说明
如果希望维度顺序与x、y、z方向对应(即维度0=x,维度1=y,维度2=z),可以调整nprocxyz的定义为{2,3,2}对应x、y、z,同时修正MPI_Cart_coords的坐标解析顺序,确保方向与维度的映射一致。
内容的提问来源于stack exchange,提问作者CityOfHope
相关产品推荐
相关产品推荐

