私はしばらくの間 Fortran プログラムを使用しており、最近、いくつかのHDF5出力を生成するように依頼されました。h5 ファイルを書き込むサブルーチンを作成しましたが、元の Fortran プログラムからいくつかのパラメーターを渡す必要があります。Fortran プログラムは mpif.h をインクルードし、mpif90 でコンパイルされますが、サブルーチンはh5fcを使用してコンパイルされます(重要な場合は、メイン プログラムの並列化されたループで呼び出されます)。
hdf5 サブルーチンから誤ったログ出力を取得していたので、totalview にアクセスして問題を見つけようとしたところ、サブルーチンで一度にパラメーターの一部 (すべてではない) が不正なアドレスであることに気付きました (メイン プログラムではすべて問題ありませんでした)。すべての hdf5 関数をコメントアウトし、サブルーチンを mpif90 でコンパイルすると、すべて正常に見えます。もちろん、これにより、出力用の h5 ファイルを作成するために必要な HDF5 ルーチンを使用できなくなります。
関連するコードは次のとおりです。
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 を返します。
- 頂点
- num_vert
- num_theta (ただし、num_phi は除く)
- データは最初のエントリのみですが、正しいです
言及する価値があるかもしれないもう 1 つのこと: Totalview では、メイン プログラム (mpif90) の変数の Type は次のように記述されます。
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
したがって、プログラムとそのサブルーチンの 1 つが異なるコンパイラ (この場合は mpif90 と h5fc) でコンパイルされている間に問題があると考えています。その場合、回避策はありますか?別の言い方をすれば、メイン プログラムとそのサブルーチンを異なるコンパイラでコンパイルし、渡されるパラメータのデータ型に問題がないことを期待できますか? どのような予防措置を講じる必要がありますか?
もちろん、私がまったく間違ったことをしている可能性は非常に高いです (私は HDF5 の初心者です)。
説明が簡単であるほど、私にとっては良いことです。
よろしくお願いします。
UPDATE1: @Vladimir F, h5fc -v は大量の出力を提供しますが、それは gfortran であると推測しています (最初の行にDriving: gfortran -O2 ... と表示されます)。mpif90 -v は、ifort 14.0.1 を示します。このコードを含むシステムはインターネットに接続されていないため、ここにコピーして貼り付けることはできません (申し訳ありません!)。integer*4 のコメントについては、実際にはデータ型用のモジュールがあります。質問用に単純化しただけです。メインプログラムで使用されるモジュールには、次のものがあります。
integer(4), PARAMETER :: ksp = 4
integer(4), PARAMETER :: ksp = 8
このモジュールも mpif90 でコンパイルされており、hdf5 サブルーチンで使用しようとするとコンパイルされません。また、h5fc でそのモジュールをコンパイルしたことを除いて、メイン プログラムで使用されるものと同じ hdf5 データ型モジュールを作成しようとしましたが、パラメーターは依然として不正なアドレスとして取得されます。(この時点で、ほとんど何でも試してみたいと思います)。
更新 2: 2 つの異なるコンパイラの使用に関する私の質問に答えていると思われるこの質問 を見つけました (以前にどのように見逃したのかわかりません)。質問は数年前のものなので、誰かが今解決策があると思うなら、気軽に投稿してください. 価値があるのは、メイン プログラムでいくつかのパラメーターをファイルに書き出すだけで、hdf5 サブルーチンが、ファイルを読み取り、そのデータから h5 ファイルを生成するスタンドアロン プログラムになります。
お時間を割いていただき、ありがとうございました。