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

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 规范,对标量传递的处理更宽松,因此可以正常运行。

修复方案

有两种可靠的修复方式:

  1. 用数组构造器包装标量传递
    修改 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 的数组构造器特性,此方法无需修改变量声明。

  2. 将变量声明为长度1的数组
    直接把标量变量改为秩1数组:

    real    :: phi_old(1)
    real    :: phi_new(1)
    

    调用时直接传递数组名即可,完全符合 mpi_f08 的接口规范,兼容性最好。

修复后代码可以正常使用 mpi_f08,同时兼容 PETSc 库的要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 11:01:02