0

我已经使用 Fortran 程序有一段时间了,最​​近的任务是让它产生一些HDF5输出。我创建了一个子程序来编写 h5 文件,它需要从原始 Fortran 程序传递一些参数。Fortran 程序包含 mpif.h 并使用mpif90编译,而子例程使用h5fc编译(如果重要,它将在主程序中的并行循环中调用)。

我从 hdf5 子例程中得到不正确的日志输出,然后进入 totalview 试图找出问题,并注意到一些(但不是全部)参数在子例程中曾经是错误的地址(主程序一切正常)。每当我注释掉所有 hdf5 函数并用 mpif90 编译子例程时,一切看起来都很好。这当然不允许我使用任何我需要的 HDF5 例程来创建用于输出的 h5 文件。

以下是相关代码:

PROGRAM main_prog_mpif90

include "mpif.h"

integer(KIND=4) :: num_vert, num_theta, num_phi, datanum, fileunit
real(KIND=8) :: dist, az, el
real(KIND=8), ALLOCATABLE :: vertices(:), Data(:,:)

.
! initializations and mpi loops and other things that work just fine...
.

CALL HDF5_sub(vertices, Data, dist, num_vert, num_theta, num_phi, &
              datanum, fileunit, az, el)

.
! MPI loop ends, things are closed and deallocated...
.

END PROGRAM main_prog_mpif90


SUBROUTINE HDF5_sub(vertices, Data, dist, num_vert, num_theta, num_phi, &
                    datanum, fileunit, az, el)

integer(KIND=4) :: fileunit, num_vert, num_theta, num_phi, datanum
real(KIND=8) :: dist, az, el
real(KIND=8) :: vertices(num_vert), Data(num_theta, num_phi)

.
! Code that doesn't matter yet since I can't even get this far
.

END SUBROUTINE HDF5_sub  

我确定我已经一致地声明了所有内容,但是 Totalview 总是会返回以下带有错误地址的变量:

  • 顶点
  • num_vert
  • num_theta(但不是 num_phi)
  • 数据只有第一个条目,但它是正确的

另一件事可能值得一提:在 Totalview 中,主程序 (mpif90) 中变量的类型如下所示:

INTEGER*4 

而在子例程(h5fc)中,类型显示在 Totalview 中,如:

integer(kind=4)

(我猜是编译器的区别?)

最后,这里是相关代码的编译行:

h5fc -g -L/usr/lib64/ -lhdf5_fortran -lhdf5 -c HDF5_sub.F90

mpif90 -g -c main_prog_mpif90.F90

所以我认为程序和它的一个子程序之间存在问题,这些子程序已经用不同的编译器(在本例中为 mpif90 和 h5fc)编译。如果是这种情况,是否有任何解决方法?换句话说,一个人可以用不同的编译器编译一个主程序及其子程序,并且期望传递的参数的数据类型没有问题吗? 必须采取哪些预防措施?

当然,我很有可能在做其他完全错误的事情(我是 HDF5 的新手)。

解释越简单对我越好!

提前谢谢大家。

UPDATE1: @Vladimir F, h5fc -v 提供了一大堆输出,但我猜它是 gfortran(它在第一行显示为Driving: gfortran -O2 ...)。mpif90 -v 说ifort 14.0.1。带有此代码的系统未连接到 Internet,因此我无法在此处复制和粘贴(对不起!)。至于整数*4 注释,我们实际上有一个数据类型模块,我只是为问题简化了它。主程序使用的模块如下:

integer(4), PARAMETER  :: ksp = 4
integer(4), PARAMETER  :: ksp = 8

这个模块也是用mpif90编译的,当我尝试在hdf5子程序中使用它时,它不会编译。我还尝试创建一个与主程序使用的相同的 hdf5 数据类型模块,除了使用 h5fc 编译该模块,但参数仍然作为错误地址出现。(我能说什么,愿意在这一点上尝试几乎任何事情)。

UPDATE2: 我刚刚发现了这个问题(不知道我之前是怎么错过的),我认为它回答了我关于使用两种不同编译器的问题。这个问题是几年前的问题,所以如果有人认为现在有解决方案,请随时发布。对于它的价值,我只需要让我的主程序将一些参数写入文件,hdf5 子例程将成为一个独立的程序,它将读取文件并从该数据生成 h5 文件。

再次感谢大家花时间提供帮助。

4

0 回答 0