调用MPI_SEND与MPI_RECV时出现segmentation fault段错误求助
问题原因排查
核心触发原因
- 你调用
MPI_CART_CREATE时设置了reorder=.true.,允许MPI为新生成的笛卡尔通信子comm2重新分配进程编号,而你后续调用MPI_CART_COORDS时传入的myid是从MPI_COMM_WORLD获取的旧进程编号,和comm2的实际进程编号不匹配。 - 编号不匹配会导致
MPI_CART_SHIFT返回的邻居进程ID完全错误,甚至是内存非法值,将非法值传入MPI_SEND/MPI_RECV的目标/源参数时,就会触发段错误。
其他可能的触发原因
- 运行程序时没有指定刚好9个进程:你的笛卡尔网格设置为3行3列,总进程数必须是9,否则
MPI_CART_CREATE会执行失败,返回无效的通信子comm2,后续调用MPI接口时就会崩溃。你全程没有检查MPI调用的ierr返回值,无法提前感知这类参数错误。 - 边界进程的2步长邻居ID未校验:你调用
MPI_CART_SHIFT设置步长为2时,边界进程拿到的neigid2可能为MPI_PROC_NULL,虽然MPI规范允许给MPI_PROC_NULL收发消息会自动空转,但部分旧版本MPI实现对这类参数的容错处理不完善,也可能触发异常。
修复方案
- 拿到新通信子
comm2后,重新获取当前进程在comm2内的编号,再用来查询坐标和邻居:
call MPI_CART_CREATE(MPI_COMM_WORLD,ndim,dims,period,.true.,comm2,ierr) ! 新增这行,获取comm2内的当前进程rank call MPI_COMM_RANK(comm2, myid, ierr) call MPI_CART_COORDS(comm2,myid,ndim,thisid,ierr)
- 运行时指定正确的进程数:
mpirun -n 9 ./你的可执行文件名
- 可选优化:给不同的消息设置不同的tag,避免消息匹配错误,同时增加MPI调用的错误校验逻辑。
内容的提问来源于stack exchange,提问作者Reboost
相关产品推荐
相关产品推荐

