使用Mvapich 3.0 Fortran90接口编译代码遇类型不匹配问题求助
问题:Mvapich-3.0 + GFortran ≥10 下Fortran并行代码类型不匹配错误
问题场景
使用Mvapich-3.0构建F90并行代码,当GFortran版本≥10时,编译始终报类型不匹配错误。
编译命令
mpif90 -I/opt/mvapich/include -c reduce.f90
错误信息
reduce.f90:27:27: 12 | call MPI_Allreduce(dv_src, dv, vlen, MPI_DOUBLE_PRECISION, & | 2 ...... 27 | call MPI_Allreduce(zv_src, zv, vlen, MPI_DOUBLE_COMPLEX, & | 1 Error: Type mismatch between actual argument at (1) and actual argument at (2) (COMPLEX(8)/REAL(8)). reduce.f90:27:35: 12 | call MPI_Allreduce(dv_src, dv, vlen, MPI_DOUBLE_PRECISION, & | 2 ...... 27 | call MPI_Allreduce(zv_src, zv, vlen, MPI_DOUBLE_COMPLEX, & | 1 Error: Type mismatch between actual argument at (1) and actual argument at (2) (COMPLEX(8)/REAL(8)).
源码示例(reduce.f90)
subroutine reduceData_Dbl(dv, dv_src, vlen) include 'mpif.h' ! ---------------------------------------------------------------- double precision :: dv(*), dv_src(*) integer :: vlen integer :: i, ierr ! ---------------------------------------------------------------- call MPI_Allreduce(dv_src, dv, vlen, MPI_DOUBLE_PRECISION, & MPI_SUM, MPI_COMM_WORLD, ierr) end subroutine reduceData_Cpx(zv, zv_src, vlen) include 'mpif.h' ! ---------------------------------------------------------------- double complex :: zv(*), zv_src(*) integer :: vlen integer :: i, ierr ! ---------------------------------------------------------------- call MPI_Allreduce(zv_src, zv, vlen, MPI_DOUBLE_COMPLEX, & MPI_SUM, MPI_COMM_WORLD, ierr) end
已尝试的方法与困境
- 添加
-fallow-argument-mismatch选项可绕过错误,但GFortran文档强烈不建议使用该选项,且BerkeleyGW这类大型软件即使加此选项也无法绕过错误。 - 按常规方法用
use mpi替换include 'mpif.h'以获取F90接口,但在Mvapich-3.0下无效,错误依然存在。 - 仅
use mpi_f08能解决错误,但需要将大量MPI句柄从integer类型改为新的派生类型(如TYPE(MPI_Comm)、TYPE(MPI_Group)等),对大型软件来说修改量极大。
疑问
- 是否有更简便的方法解决该类型不匹配错误?
- 理论上
use mpi应提供完整的F90接口且无需修改MPI句柄类型,但测试无效,是否操作有误?
内容的提问来源于stack exchange,提问作者Tung-Han Hsieh
相关产品推荐
相关产品推荐

