mpifort -DMPI编译报错:mpi_status作实参 Intel Fortran可用GNU不行
问题根因
这个报错是不同MPI实现的语法兼容差异导致的:
- Intel MPI(mpiifort对应实现)对旧式MPI调用写法做了兼容,允许直接将类型名
mpi_status作为实参传入接口 - GCC配套的Open MPI/MPICH严格遵循MPI标准:
mpi_status是派生类型名,不能直接作为参数传递,要么传入type(mpi_status)类型的实例变量,要么传入预定义常量MPI_STATUS_IGNORE
解决方案
方案1:不需要读取IO操作状态(绝大多数场景适用)
直接修改wavefunction.F90第486行的调用语句,将mpi_status替换为标准常量MPI_STATUS_IGNORE即可:
call mpi_file_read_all(fh, neig, 1, mpi_integer, MPI_STATUS_IGNORE, ierr)
修改后重新编译即可正常通过。
方案2:需要获取IO操作的状态信息
首先在当前调用语句所在的子程序/函数的变量声明段新增状态变量声明:
type(mpi_status) :: stat
再将第486行的mpi_status替换为声明的变量名:
call mpi_file_read_all(fh, neig, 1, mpi_integer, stat, ierr)
后续可以通过stat变量的成员读取对应状态信息。
提示:如果代码其他位置也存在直接将
mpi_status类型名作为参数传递的调用,需要按照相同逻辑统一修改。
内容的提问来源于stack exchange,提问作者Bobson Dugnut
相关产品推荐
相关产品推荐

