Скомпилированная 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 из этих данных.

Еще раз спасибо всем, что нашли время помочь.

0 ответов

Другие вопросы по тегам