Дескриптор MPI_COMM_WORLD теряет значение в подпрограмме

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

subroutine do_something_with_mpicommworld  

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

end subroutine  

...
конец модуля x

программа main
использовать mpi использовать x
MPI_INIT(...)
вызывать do_something_with_mpicommworld end программа main

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

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

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

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


person txr    schedule 19.10.2010    source источник
comment
Можете ли вы опубликовать код, а не дайджест вашего кода. Дьявол так часто кроется в деталях.   -  person High Performance Mark    schedule 19.10.2010


Ответы (2)


Раздражающе трудно найти точную информацию о том, что должно и не должно происходить в этих случаях, и мои ожидания были такими же, как и у вас - `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 не определен, поэтому очевидно, что некоторая важная информация передается подпрограмме. Можете ли вы опубликовать более простой полный пример, который все еще не работает?

person Jonathan Dursi    schedule 19.10.2010

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

Это просто урок для меня, чтобы обеспечить «неявное отсутствие» не только с помощью ключевых слов, но и с помощью флага компилятора. Зло скрывается после каждого конечного утверждения.

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

person txr    schedule 19.10.2010