Обновлено: Должен ли я помещать MPI в модуль или в подпрограмму модуля?

Обновлено: у меня проблема, и я не знаю, что это такое. У меня есть тестовая программа с MPI_INIT и MPI_FINALIZE в теле. У меня есть модуль, который содержит 5 подпрограмм: 3 подпрограммы зависимы и независимы от 2 других подпрограмм. Я хочу поместить в этот модуль код MPI из тестовой программы. Я поместил MPI_INIT в модуль, где объявляются переменные, и перед подпрограммой. Я получаю серию ошибок с тем же сообщением об ошибке:

This statement must not appear in the specification part of a module

Как «MPI_INIT и MPI_FINALIZE должны вызываться только один раз» влияют на программу, модули и подпрограммы Fortran? Куда мне поместить функции и переменные MPI, если есть несколько независимых программ, каждая из которых вызывает подпрограммы этого модуля несколько раз?

~~~~~~~~~ У меня есть модуль, содержащий ряд подпрограмм, содержащих циклы do, которые я хочу распараллелить. Подпрограммы общедоступны, и их используют другие программы. Должен ли я определять MPI вне подпрограмм:

module ...
call MPI_INIT
subroutine 1
... (MPI code)
subroutine 2
subroutine 3
MPI_GATHERV
call MPI_FINALIZE
module

или внутри каждой подпрограммы?

module ...
subroutine 1
call MPI_INIT
... (MPI code)
MPI_GATHERV
call MPI_FINALIZE
subroutine 2
call MPI_INIT
... (MPI code)
MPI_GATHERV
call MPI_FINALIZE
subroutine 3
call MPI_INIT
... (MPI code)
MPI_GATHERV
call MPI_FINALIZE
module

Я вижу преимущество следования крупнозернистому принципу для решения 1. Если программа вызывает подпрограмму 1, будет ли она также выполнять коды MPI вне подпрограммы?


person Pippi    schedule 18.11.2012    source источник
comment
Да, инициализировать MPI в начале основной программы и финализировать в конце.   -  person milancurcic    schedule 18.11.2012
comment
Всем спасибо за отклик!   -  person Pippi    schedule 18.11.2012


Ответы (1)


Вы должны инициализировать и финализировать MPI ровно один раз в своей программе. После вызова MPI_Finalize вам не разрешается выполнять дальнейшие действия MPI. Стандарт говорит:

После возврата MPI_FINALIZE никакая подпрограмма MPI (даже MPI_INIT) не может быть вызвана, за исключением MPI_GET_VERSION, MPI_GET_LIBRARY_VERSION, MPI_INITIALIZED, MPI_FINALIZED и любой функции с префиксом MPI_T_ (в пределах ограничений для функций с этим префиксом, перечисленных в Разделе 14.3.4).

(MPI3, p361, l25) MPI3 PDF

Ответ на обновление: вам не разрешено помещать исполняемые операторы в часть объявления вашего кода. То, что в вашем исполнении должен быть только один вызов MPI_Init и MPI_Finalize, означает именно это. Ваше приложение может читать что-то вроде этого:

program mini
  use mpi
  implicit none
  integer :: iError
  call mpi_init(iError)
  call do_some_stuff()
  call mpi_finalize(iError)
end program mini

Если у вас есть различные элементы инициализации, которые вы хотите выполнить в начале программы, вы, конечно, можете объединить их в подпрограмме модуля и вызвать там mpi_init. Если вы используете тестовую программу для своего модуля, используйте там mpi_init и mpi_finalize. Пример вызова mpi_init и mpi_finalize в некоторых подпрограммах можно найти, например, в файле env_module библиотеки treelm, которую мы используем для настройки очень общих вещей.

Куда мне поместить функции и переменные MPI, если есть несколько независимых программ, каждая из которых вызывает подпрограммы этого модуля несколько раз?

Не могли бы вы перефразировать это? Я не понимаю. Предполагается, что функции и переменные MPI находятся в модуле mpi, если у вас есть несколько независимых программ, вызывающих их, все они должны «использовать» модуль mpi. Независимые программы также могут иметь MPI_Init и MPI_Finalize по отдельности. Может быть, вы могли бы опубликовать краткий пример кода, чего вы хотите достичь и в чем ваша проблема.

person haraldkl    schedule 18.11.2012
comment
MPI-3.0 существует всего два месяца, и в настоящее время ни одна реализация MPI не поддерживает его. Вместо этого вам следует ссылаться на MPI-2.2 на следующий год или около того :) - person Hristo Iliev; 18.11.2012
comment
Обновлен мой ответ в попытке охватить ваш обновленный вопрос. - person haraldkl; 26.11.2012