fortran中的MPI_BCAST在新群集上不工作
我有一个工作代码,一年多前我一直在一个旧集群上使用。今年,我想再次使用这段代码,但是,集群是不同的,结果变得毫无意义。我知道这个集群的具体情况,但是很难从那个旧集群中找到那些 我已经能够将问题缩小到fortran中的MPI_BCAST在新群集上不工作,fortran,mpi,Fortran,Mpi,我有一个工作代码,一年多前我一直在一个旧集群上使用。今年,我想再次使用这段代码,但是,集群是不同的,结果变得毫无意义。我知道这个集群的具体情况,但是很难从那个旧集群中找到那些 我已经能够将问题缩小到MPI\u BCAST调用: if (rang.eq.0) print*, "psi for rang0 = ", psi CALL MPI_BCAST (psi, NSITES, MPI_DOUBLE_COMPLEX,0,MPI_COMM_WORLD,code) if (ra
MPI\u BCAST
调用:
if (rang.eq.0) print*, "psi for rang0 = ", psi
CALL MPI_BCAST (psi, NSITES, MPI_DOUBLE_COMPLEX,0,MPI_COMM_WORLD,code)
if (rang.eq.1) print*, "psi for rang1 = ", psi
在此之前,这种方法运行良好,psi
正确地分布在所有级别上
现在,在秩1
上,在这个新集群上,我得到了psi
的初始值(复杂的零数组),而没有使用秩0
中的值(非零值)进行更新
模块列表
给了我
1) 英特尔/13.0.1 2)openmpi/1.8.1
用于此新群集上正在使用的编译器
PROGRAM minimal
use mpi
IMPLICIT NONE
INTEGER :: NSITES, rang, i, code
DOUBLE COMPLEX , DIMENSION (:), allocatable :: psi
DOUBLE PRECISION ralpha, PI, val
INTEGER :: NB_PROCS
CALL MPI_INIT(code)
call MPI_COMM_SIZE (MPI_COMM_WORLD,nb_procs,code)
call MPI_COMM_RANK (MPI_COMM_WORLD,rang,code)
PI = 4.d0*atan(1.d0)
NSITES = 10
allocate (psi (NSITES) )
DO i = 1, NSITES
psi(i) = (0.0d0, 0.0d0)
END DO
val = 1.0 / dsqrt(1.0d0 * NSITES)
DO i = 1, NSITES
IF (rang.eq.0) THEN
CALL RANDOM_NUMBER (ralpha)
psi (i) = exp (2.0d0 * PI * (0.0d0, 1.0d0) * ralpha) &
* val
ENDIF
ENDDO
CALL MPI_BCAST (psi, NSITES, MPI_DOUBLE_COMPLEX,0,MPI_COMM_WORLD,code)
if (rang.eq.1) print*, "psi for rang1 = ", psi
CALL MPI_FINALIZE(code)
END program minimal
我无法访问旧群集,因此无法检查加载了哪些编译器。然而,可能是这样的:
哪个mpif90
/opt/mpi/bullxmpi/1.1.16.5/bin/mpif90
当我在我的一封旧邮件中发现这个片段时
那么,MPI_BCAST的使用多年来是否发生了变化?
我还做了一个测试,添加了一个MPI\u屏障
,只是为了确定,但没有效果
(在这个新的集群上)复制错误的最小示例的编辑
我已经在本地macbook上检查了这段代码,在那里它工作得很好。罪魁祸首是默认加载的模块(openmpi/1.8.1) 首先,我尝试了其他一些方法,但忘记了在再次加载模块的地方更改提交脚本。因此,我只在编译时更改了模块,而不是在运行时 底线是,默认加载的模块已损坏,愚蠢的我没有正确地切换到其他模块来解决问题
它现在可以与openmpi/1.8.4一起使用。您说您可以将其缩小到该调用范围,但是您能为我们做一个简单的介绍吗?如果没有这一点,我们必须对声明等做出大量的假设。要快速回答您的最后一个问题,MPI_BCAST没有改变。正如Francescalus所说的,请向我们展示一个完整的程序来演示这个问题。很可能您的代码一直有缺陷,但只是现在它导致了一些不同。没有什么不正常的,但是我们必须看到代码。我们将在晚上尝试编译这样的示例。对此很抱歉。这个最小的示例似乎重现了错误。BCAST之后打印出来的值都是零,而不是来自秩1的预期非零值。