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
相关产品推荐
相关产品推荐

