Специальной подпрограммы для общего mpi_scatterv в (1) нет.

Моя система представляет собой оболочку Ubuntu Bash в Windows.

Я использую gfortran GNU Fortran (Ubuntu 5.4.0-6ubuntu1~16.04.5) 5.4.0 20160609 и gcc версии 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.5< /эм>). и OpenMPI для компиляции файла.

Флаг:

mpifort -ffree-form -g -fbacktrace -UREPSOILM -UNLDAS2 -c test-mpi.f90

PROGRAM test

USE MPI

IMPLICIT NONE
REAL, DIMENSION(2)  :: xcug2m
INTEGER             :: NODID,  NUMPROCS, IERROR, COMM, DISPLS
REAL, DIMENSION(1)  :: cug2m
INTEGER             :: NPROCS=2, root
INTEGER             :: SENDCOUNTS=1
INTEGER             :: i

CALL MPI_INIT(IERROR)
CALL MPI_COMM_RANK(COMM, NODID,    IERROR)
CALL MPI_COMM_SIZE(COMM, NUMPROCS, IERROR)

xcug2m = (/1,2/)

do i = 1,2
CALL MPI_SCATTERV(xcug2m(i), SENDCOUNTS, DISPLS, MPI_REAL,  &
                  cug2m,    SENDCOUNTS, MPI_REAL, root, COMM, IERROR)
end do



END PROGRAM test

Ошибка:

CALL MPI_SCATTERV(xc(:,i,j  ), SCOUNT, DISPLS, MPI_REAL, c(:,i  ),

       SCOUNT, MPI_REAL, 0, MPI_COMM_WORLD, IER)
                                               1                                                                                   

Error: There is no specific subroutine for the generic ‘mpi_scatterv’ at (1).

Я прочитал руководство MPI_scatterv, но ничего не нашел. Синтаксис в порядке. Раньше я компилировал на сервере с помощью ifort и OpenMPI. Ошибки нет и работает нормально.

Не могли бы вы помочь мне решить эту проблему? Я искал несколько дней.


person Qing Sun    schedule 07.11.2017    source источник
comment
Добро пожаловать. Используйте тег fortran для вопросов Fortran и тег mpi для вопросов MPI. Теги очень важны, чтобы эксперты rigjt увидели ваш вопрос!. Мы должны увидеть ваш код. Пожалуйста, прочитайте минимальный воспроизводимый пример, Как спросить и пройдите приветственный тур.   -  person Vladimir F    schedule 08.11.2017
comment
См. также заголовок stackoverflow.com/questions/8044568/ нет специальной подпрограммы, мы должны увидеть ваш код. Не только call scatterv(), но и полный компилируемый пример, где мы видим все типы всех переменных и который мы можем скомпилировать и проверить на ошибку. Типы данных всех переменных действительно необходимы.   -  person Vladimir F    schedule 08.11.2017
comment
Почти наверняка синтаксис не в порядке. Ошибка означает, что один или несколько аргументов не соответствуют ни одному допустимому вызову MPI_SCATTERV.   -  person Ross    schedule 08.11.2017
comment
это предполагает опечатку. второй аргумент должен быть SCOUNTS вместо SCOUNT. Фортран, вероятно, жалуется, потому что скаляр используется, когда ожидается массив.   -  person Gilles Gouaillardet    schedule 08.11.2017
comment
А также предполагает, что Implicit None не входит в область действия, что, если так, означает, что я мало сочувствую   -  person Ian Bush    schedule 08.11.2017
comment
Хоть что-то, но теперь сообщение об ошибке не соответствует коду.   -  person Vladimir F    schedule 09.11.2017
comment
Большое спасибо за все ваши ответы. Хорошего дня!   -  person Qing Sun    schedule 09.11.2017


Ответы (1)


Как уже указал Gilles Gouaillardet в комментариях, есть несколько аргументов, которые должны быть массивами, но вы передаете туда скаляры.

Вы утверждали, что проверили руководство по OpenMPI. Когда я открываю его, я вижу

MPI_SCATTERV(SENDBUF, SENDCOUNTS, DISPLS, SENDTYPE, RECVBUF,
                 RECVCOUNT, RECVTYPE, ROOT, COMM, IERROR)
            <type>    SENDBUF(*), RECVBUF(*)
            INTEGER   SENDCOUNTS(*), DISPLS(*), SENDTYPE
            INTEGER   RECVCOUNT, RECVTYPE, ROOT, COMM, IERROR

Как видите, SENDCOUNTS и DISPLS — это массивы. Они указывают

sendcounts
                 Integer array (of length group size) specifying the number of elements to send to each processor.

       displs    Integer array (of length group size). Entry i specifies the displacement (relative to sendbuf) from which to take the outgoing data to process i.

Они должны быть массивами, иначе программа неверна.

Программа вылетает на моем компьютере. Не буду искать почему, оно того не стоит. Возможно, это связано с тем, что значение root не определено. Вышеупомянутые ошибки должны быть исправлены.

person Vladimir F    schedule 09.11.2017
comment
Большое спасибо! Сейчас использую mpich, потом компилируется успешно. Возможно, какой-то компилятор использует другой тип аргумента. - person Qing Sun; 09.11.2017
comment
Повторяю еще раз: ваш код неверный. Даже если он компилируется, это неправильно. Компилируется много неправильного кода. - person Vladimir F; 10.11.2017
comment
Кроме того, вы не можете MPI_Scatterv() в таком цикле do. буфер отправки должен иметь 2 элемента, и когда буфер отправки равен xcug2m(i), произойдет переполнение буфера. Как указал @Vladimir F, ваш код по-прежнему неверен (как минимум 4 ошибки), и удивительно, что mpich использует свободный компилятор (опция?), Который вас обманывает. - person Gilles Gouaillardet; 10.11.2017