Ubuntu 22.04中use mpi_f08语句导致Fortran MPI程序崩溃求助
问题分析与解决方案
OpenMPI 找不到 mpi_f08 头文件的解决方法
Ubuntu 22.04 默认软件源中,OpenMPI 的 Fortran 2008 支持需要完整安装对应开发包,执行以下命令补全依赖:
sudo apt install openmpi-bin libopenmpi-dev libopenmpi3
编译时必须使用 OpenMPI 提供的 mpifort 编译器 wrapper,它会自动配置正确的头文件路径和链接参数,不要直接调用 gfortran。
MPICH 运行 MPI_Allreduce 崩溃的原因与修复
问题根源
use mpi_f08 引入的是严格遵循 Fortran 2008 标准的 MPI 接口,其中 MPI_Allreduce 的缓冲区参数要求为数组类型(包括秩0数组,但 MPICH 4.0 对秩0数组的标量传递存在兼容性问题)。你的代码中直接传递标量变量,导致 MPI 库无法正确解析数据描述符,从而触发 "Internal Error: Invalid type in descriptor" 错误。
而旧的 use mpi 接口基于 Fortran 77/90 规范,对标量传递的处理更宽松,因此可以正常运行。
修复方案
有两种可靠的修复方式:
用数组构造器包装标量传递
修改MPI_Allreduce的调用参数,将标量包装为长度1的秩1数组:call mpi_allreduce([phi_old], & ! send buffer [phi_new], & ! recv buffer 1, & ! length mpi_real, & ! datatype mpi_sum, & ! operation mpi_comm_world, & ! communicator error)GCC 11.3.0 完全支持 Fortran 2008 的数组构造器特性,此方法无需修改变量声明。
将变量声明为长度1的数组
直接把标量变量改为秩1数组:real :: phi_old(1) real :: phi_new(1)调用时直接传递数组名即可,完全符合
mpi_f08的接口规范,兼容性最好。
修复后代码可以正常使用 mpi_f08,同时兼容 PETSc 库的要求。
内容的提问来源于stack exchange,提问作者Bojan Niceno
相关产品推荐
相关产品推荐

