【发布时间】:2021-12-09 18:14:01
【问题描述】:
我正在尝试使用带有 -DMPI 标志的 gfortran MPI 包装器 mpifort 编译 Fortran 程序。我收到以下错误:
mpifort -O3 -fopenmp -DMPI -fc=gfortran-11 -fallow-argument-mismatch -c wavefunction.F90
wavefunction.F90:486:53:
486 | call mpi_file_read_all(fh, neig, 1, mpi_integer, mpi_status, ierr)
| 1
Error: Derived type 'mpi_status' is used as an actual argument at (1)
您可以找到整个 Makefile(和程序代码)here,请参阅 mpifort 选项。我尝试使用 gfortran 版本 9、10 和 11,都产生相同的错误。我已经使用 Intel Fortran 编译器 (mpiifort) 成功地用 -DMPI 编译了这个完全相同的 Fortran 代码,但是这次我不能使用 Intel 编译器,因为我试图在 Raspberry Pi 4 上编译并且我不认为 Intel编译器与 ARM 一起工作。我做了很多 Ducking 试图找到解决方案,但我还没有成功。非常感谢任何帮助!
【问题讨论】:
-
你需要提供一个状态对象,而不是
mpi_status这个词。这个程序是错误的。也许它可以编译,因为 Fortran 没有保留字。 -
感谢您的评论,维克多。但是这怎么能与英特尔 Fortran 编译器一起工作呢?该程序不仅可以使用 mpiifort 编译,而且可以在超级计算机上的数百个节点上正常运行!
-
@VictorEijkhout
mpi_status是一个整数数组,如第 471 行 here 所示,这似乎与 documentation 一致 -
变量名称永远不能与文档一致。此外,您的文档使用名称
status。我认为问题在于新版本的 MPI-Fortran 接口MPI_Status是一个 fortran“类型”。只需使用不同的名称。 (我不能 100% 确定这个解释,因为通常你需要use mpi_f08来获得这个接口,而你只是在做use mpi。当然,你转向 2008 标准可能是个好主意,所以开始使用mpi_f08模块吧。它好多了。) -
你真的必须展示代码的违规部分。错误消息中的一行和所有相关声明是绝对最小值,sometimes 就足够了,但通常完整的minimal reproducible example 是有序的。不,指向外部存储库的链接是不够的。
标签: compiler-errors raspberry-pi fortran mpi gfortran