В стандарте MPI действительно есть условия для взаимодействия языков — весь §16.3 документа MPI 2.2 посвящен языковому взаимодействию между Fortran и C.
§16.3.10 Межъязыковая коммуникация
Правила сопоставления типов для связи в MPI не изменились: спецификация типа данных для каждого отправляемого элемента должна совпадать в сигнатуре типа со спецификацией типа данных, используемой для получения этого элемента (если только один из типов не является MPI_PACKED
). Кроме того, тип элемента сообщения должен совпадать с объявлением типа для соответствующего местоположения буфера связи, если тип не MPI_BYTE
или MPI_PACKED
. Межъязыковое общение допускается, если оно соответствует этим правилам.
Затем он показывает пример, в котором один и тот же сконструированный тип данных используется для отправки сообщения из кода на Фортране и для его получения в фрагменте кода на C. Тип построен таким образом, чтобы позволить коду C получать данные в буфер, принадлежащий коду Fortran, но что более важно для вашего вопроса, так это то, что код C использует тип данных, созданный из Fortran MPI_REAL
. Использование типов данных Fortran в функциях C и наоборот вполне законно, если это имеет смысл:
§16.3.6 Непрозрачные объекты MPI — типы данных
... Если тип данных, определенный на одном языке, используется для коммуникационного вызова на другом языке, то отправленное сообщение будет идентично сообщению, которое будет отправлено на первом языке: доступ к тому же буферу связи и тому же представлению преобразование выполняется, если это необходимо. Все предопределенные типы данных могут использоваться в конструкторах типов данных на любом языке. Если тип данных зафиксирован, его можно использовать для общения на любом языке.
(фиксируются предопределенные типы данных MPI, такие как MPI_REAL
и MPI_DOUBLE
)
Напротив, использование типов данных Fortran с одной стороны и типов данных C с другой разрешено, но считается не переносимым:
§16.3.10 Межъязыковая коммуникация
... Реализации MPI могут ослабить эти правила сопоставления типов и разрешить отправку сообщений с типами Fortran и получение с типами C, и наоборот, когда эти типы совпадают. То есть, если тип Fortran INTEGER
идентичен типу C int
, то реализация MPI может разрешить отправку данных с типом данных MPI_INTEGER
и получение с типом данных MPI_INT
. Однако такой код нельзя переносить.
(выделено мной)
Замена REAL(8)
на DOUBLE PRECISION
никак не повысит переносимость вашего кода, поскольку стандарт Fortran ничего не гарантирует в отношении представления типа DOUBLE PRECISION
— он только говорит, что DOUBLE PRECISION
является альтернативным спецификатором для одного типа типа REAL
, а именно типа с двойной точностью, который должен иметь большую десятичную точность, чем действительное значение по умолчанию. Отправка REAL(8)
с типом данных MPI_DOUBLE_PRECISION
не переносима. Вместо этого переносимая программа будет использовать встроенный в Фортран SELECTED_REAL_KIND
вместе с MPI_Type_create_f90_real
для регистрации соответствующего типа данных MPI.
ИМХО, лучший вариант - полагаться на языковую совместимость между C и Fortran и придерживаться одних и тех же типов данных с обеих сторон. Поскольку ваш набор компиляторов достаточно новый, вы можете использовать механизм ISO_C_BINDING
Фортрана для получения типов REAL
и INTEGER
, совместимых с C, и использовать типы данных C в вызовах Fortran. Например:
USE, INTRINSIC :: ISO_C_BINDING
REAL(C_DOUBLE), DIMENSION(10) :: darray
INTEGER(C_INT) :: ival
...
CALL MPI_SEND(darray, 10, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, ierr)
CALL MPI_BCAST(ival, 1, MPI_INT, 0, MPI_COMM_WORLD, ierr)
...
person
Hristo Iliev
schedule
14.08.2012
USE mpi
вместоinclude "mpif.h"
. - person Hristo Iliev   schedule 14.08.2012