Дескриптор MPI_COMM_WORLD теряет значение в подпрограмме - PullRequest
0 голосов
/ 19 октября 2010

моя программа выглядит следующим образом:
модуль х
использовать mpi! x включает модуль mpi
неявный нет
...
содержит

subroutine do_something_with_mpicommworld  

    !use mpi !uncommenting this makes a difference (****)  
    call MPI_...(MPI_COMM_WORLD,...,ierr)  

end subroutine  

...
конечный модуль х

основная программа
использовать MPI использовать х
MPI_INIT (...)
вызов do_something_with_mpicommworld конец программы основной

Эта программа завершается с ошибкой: MPI_Cart_create (199): неверный коммуникатор, если строка, отмеченная (**), не закомментирована.

Теперь, может быть, мои знания о Fortran 90 неполны, но я подумал, что если в определении модуля есть предложение use (см. Мой модуль x), то какая бы глобальная переменная существовала во включенном модуле (в случай x: MPI_COMM_WORLD из включаемого модуля mpi) будет иметь одинаковое значение в любой из подпрограмм (do_something_with_mpicommworld), даже если эти подпрограммы явно не включают модуль (например, когда (**) закомментирован ). Или, проще говоря, если вы включаете модуль в другой модуль, подпрограммы, содержащиеся во втором модуле, будут иметь доступ к глобальным переменным во включенном модуле без специального оператора use .

Когда я запустил свою программу, я увидел другое поведение. Подпрограмма, содержащаяся в x, создавала ошибки, если в ней не было оператора use mpi.

Так в чем же проблема, у меня неправильное представление о Fortran 90 или есть что-то особенное в модуле MPI, которое вызывает такое поведение?

Ответы [ 2 ]

1 голос
/ 19 октября 2010

Трудно найти точную информацию о том, что должно и не должно происходить в этих случаях, и мои ожидания были такими же, как и у вас - `use mpi 'должен работать, как указано выше.Поэтому я попробовал следующее:

module hellompi
use mpi
implicit none
contains

subroutine hello
    integer :: ierr, nprocs, rank
    call MPI_INIT(ierr)
    call MPI_COMM_SIZE(MPI_COMM_WORLD, nprocs, ierr)
    call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr)
    print *, 'Hello world, from ', rank, ' of ', nprocs
    print *, MPI_COMM_WORLD
    call MPI_FINALIZE(ierr)
    return
end subroutine hello

end module hellompi

, и он прекрасно работает как в gfortran, так и в ifort с OpenMPI.Добавление cart_create ничего не меняет.

Что вас удивляет в вашем случае, так это то, что он не жалуется на то, что MPI_COMM_WORLD не определен - поэтому, очевидно, некоторые соответствующихинформация распространяется на подпрограмму.Можете ли вы опубликовать более простой пример, который все еще не работает?

0 голосов
/ 19 октября 2010

Спасибо, Джонатан, за ваш ответ. Проблема была действительно очень простой. Я добавил подпрограмму, о которой идет речь, после «конечного модуля»
:-D, 'implicit none' не было применимо к внешнему сабвуферу, и компилятор с радостью инициализировал совершенно новую переменную MPI_COMM_WORLD для того, что он считал подходящим, следуя стандартным неявным правилам.

Для меня это всего лишь урок по применению «неявного никого» не только по ключевым словам, но и через флаг компилятора. Зло скрывается за каждым заключительным утверждением.

Извините, что вы пошли на пробный пример, я купил бы вам пиво, если бы смог: -)

...