You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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实现对这类参数的容错处理不完善,也可能触发异常。
修复方案
  1. 拿到新通信子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)
  1. 运行时指定正确的进程数:
mpirun -n 9 ./你的可执行文件名
  1. 可选优化:给不同的消息设置不同的tag,避免消息匹配错误,同时增加MPI调用的错误校验逻辑。

内容的提问来源于stack exchange,提问作者Reboost

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 12:06:01