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

Fortran中使用MPI_AllReduce搭配MPI_IN_PLACE出现段错误求助

问题根因

  • 核心错误:MPI_AllReduce调用缺少最后一个必填的错误码输出参数mpierr。Fortran的MPI绑定中,所有MPI操作子程序的最后一个参数都是用于返回错误码的整数变量,缺少该参数会导致栈访问越界,直接触发段错误。
  • 次要风险:使用老旧的include "mpif.h"接口而非标准推荐的use mpi模块,部分MPI实现下MPI_IN_PLACE的类型定义不兼容,容易引发地址传递错误。
  • 可移植性问题:real(KIND=8)搭配MPI_DOUBLE的写法不是跨平台通用的,部分编译器下KIND=8的实数与MPI_DOUBLE的类型长度不匹配,会导致数据读写错误。

修正后代码

program mpitest 
use mpi
implicit none
 integer :: i, mprank, mpsize, mpierr
 real(KIND=8), dimension(5) :: Qin 
 
 call MPI_INIT(mpierr)
 call MPI_COMM_SIZE(MPI_COMM_WORLD,mpsize,mpierr)
 call MPI_COMM_RANK(MPI_COMM_WORLD,mprank,mpierr) 
 write(*,*) mprank,'/',mpsize
 do i = 1, 5
    Qin(i) = (mprank+1)*i
    write(*,*) Qin(i), mprank
 enddo
 ! 补充缺失的错误码参数
 call MPI_AllReduce(MPI_IN_PLACE,Qin,5,MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD, mpierr)
 if (mprank == 0) then 
   do i = 1, 5
    write(*,*) Qin(i)
   enddo
 endif
 
 call MPI_FINALIZE(mpierr)

end program mpitest

如果需要进一步提升可移植性,可以将MPI数据类型替换为MPI_REAL8,和real(KIND=8)的类型严格对应。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 23:24:03