Скомпилированная mpif90 программа на Fortran вызывает скомпилированную подпрограмму h5fc, некоторые переданные параметры получают неверные адреса
Я работаю с программой на Фортране в течение некоторого времени, и недавно мне было поручено заставить ее выводить некоторый выход HDF5. Я создал подпрограмму для записи файла h5, и она требует передачи некоторых параметров из исходной программы на Фортране. Программа 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).
Чем проще объяснение, тем лучше для меня!
Спасибо всем заранее.
ОБНОВЛЕНИЕ 1 : @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, но параметры по-прежнему передаются как неправильные адреса. (Что тут скажешь, готов попробовать практически все на данный момент).
ОБНОВЛЕНИЕ 2: Я только что нашел этот вопрос (не уверен, как я пропустил его раньше), который, я думаю, отвечает на мой вопрос об использовании двух разных компиляторов. Вопросу пару лет, так что если кто-то думает, что сейчас есть решение, не стесняйтесь его опубликовать. Что бы это ни стоило, мне просто нужно, чтобы моя основная программа записала некоторые параметры в файл, и подпрограмма hdf5 станет отдельной программой, которая будет считывать файл и генерировать файл h5 из этих данных.
Еще раз спасибо всем, что нашли время помочь.