我一直在使用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总会带着以下不良地址的vaiables回来:
另外还有一件事值得一提:在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 。具有此代码的系统未连接到互联网,因此我无法在此处复制和粘贴(抱歉!)。至于整数* 4注释,我们实际上有一个数据类型的模块,我只是简化它的问题。主程序使用的模块具有以下内容:
integer(4), PARAMETER :: ksp = 4
integer(4), PARAMETER :: ksp = 8
这个模块也用mpif90编译,当我尝试在hdf5子程序中使用它时,它将无法编译。我还尝试创建一个hdf5数据类型模块,该模块与主程序使用的模块完全相同,除了用h5fc编译该模块,但参数仍然是坏地址。 (我能说什么,愿意在此时尝试几乎任何事情)。
UPDATE2:我刚刚发现this question(不知道我之前是如何错过的)我认为我回答了关于使用两个不同编译器的问题。问题是几年前,所以如果有人认为现在有一个解决方案随时发布它。为了它的价值,我必须让我的主程序将一些参数写入文件,而hdf5子程序将成为一个独立的程序,它将读取该文件并从该数据生成h5文件。
再次感谢大家抽出时间提供帮助。