【发布时间】:2011-04-27 12:53:06
【问题描述】:
我的程序如下:
模块 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
程序主
使用 mpi
使用 x
MPI_INIT(...)
调用 do_something_with_mpicommworld
结束程序主
此程序失败并出现以下错误:MPI_Cart_create(199): Invalid communicator,除非 标有 (**) 的行未注释。
现在,也许我对 Fortran 90 的了解不完整,但我想如果您在模块定义中有 use 子句(请参阅我的模块 x),则无论包含的模块中存在哪个全局变量(在 x 的情况下:包含模块 mpi 的 MPI_COMM_WORLD 将在任何包含的子例程( do_something_with_mpicommworld )中具有相同的值,即使这些子例程没有明确包含模块(例如,当 (**) 是注释掉)。或者,简单地说,如果您在另一个模块中包含一个模块,则第二个模块中包含的子例程将可以访问包含模块中的全局变量,而无需特殊的 use 语句。
当我运行我的程序时,我看到了不同的行为。 x 中包含的子程序会产生错误,除非它有“use mpi”语句。
那么问题是什么,我对 Fortran 90 有什么错误的想法,还是 MPI 模块有什么特别之处会导致这种行为?
【问题讨论】:
-
你能发布代码,而不是你的代码摘要。魔鬼经常在细节中。