Код компилируется при включении mpif.h, но не удается при переключении на использование mpi - PullRequest
0 голосов
/ 14 апреля 2019

Я пытаюсь переключиться на использование mpi для некоторых старых кодов фортрана, которые у меня есть. Я получил некоторые странные ошибки при компиляции кода.

Error: There is no specific subroutine for the generic 'mpi_type_indexed' at (1)

когда я пытаюсь переключиться на 'использовать mpi' в коде. Если я использую 'include' mpif.h '', то программа скомпилирована и может работать правильно.

Я написал компактный пример для проверки программы. И код, и мой пример скомпилированы в gcc / 8.1.0 и openmpi / 3.1.2.

program bt

use mpi

implicit none

!include 'mpif.h'

contains

subroutine read_me()
implicit none
integer :: my_n, my_disp, my_type
integer :: ierr

my_n = 2
my_disp = 4
call MPI_Type_indexed(1, my_n, my_disp, MPI_INTEGER, my_type, ierr)

end subroutine

end program

скомпилируйте его без флага: mpif90 bt.F90

При использовании mpi commit и включении mpif.h незафиксировано, все работает отлично. При использовании mpi uncommitted и включенном 'mpif.h', я получил сообщение об ошибке

bt.F90:23:67:

call MPI_Type_indexed(1, my_n, my_disp, MPI_INTEGER, my_type, ierr)
                                                               1
Error: There is no specific subroutine for the generic 'mpi_type_indexed' at (1)

1 Ответ

0 голосов
/ 14 апреля 2019

Как указано в комментариях, возникла «проблема» в том, что поскольку вы использовали модуль, а не файл включения, интерфейс теперь находится в области видимости, и теперь компилятор может обнаружить, что вы пытаетесь вызвать MPI_Type_indexed с неверным аргументы, так как 2-й и 3-й аргументы должны быть массивами - взгляните на https://www.mpi -forum.org / docs / mpi-3.1 / mpi31-report / node79.htm # Node79 , чтобы увидеть, что такое интерфейс должно быть.

Глядя на ваш пример, кажется, что первоначальный автор предполагал, что скаляр и массив из 1 элемента - это одно и то же - это не тот случай, так как первый - ранг 0, а последний - 1. Я говорю это как Первый аргумент указывает, насколько большими должны быть массивы, и в вашем случае он имеет значение 1. Таким образом, 2-й и 3-й аргументы должны быть массивами из одного элемента, а не имеющимися у вас скалярами. Самое простое решение, так как эти аргументы - Intent (In), - заключить их в квадратные скобки, действуя как конструктор массива

call MPI_Type_indexed(1, [ my_n ], [ my_disp ], MPI_INTEGER, my_type, ierr)
...