【发布时间】:2016-04-02 10:56:51
【问题描述】:
我有一个工作代码,一年多前我一直在旧集群上使用它。今年我想再次使用这段代码,但是集群不同,结果变得毫无意义。我知道这个集群的具体情况,但是很难从那个旧集群中找到那些。
我已经能够将问题缩小到MPI_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 中的值进行更新(非零值) .
Module list给我
1) 英特尔/13.0.1 2) openmpi/1.8.1
用于在这个新集群上使用的编译器。
我无法访问旧集群,因此无法检查加载了哪些编译器。然而,它可能是这样的:
which mpif90
/opt/mpi/bullxmpi/1.1.16.5/bin/mpif90,
因为我在我的一封旧电子邮件中发现了这个 sn-p。
那么,这些年来 MPI_BCAST 的使用是否发生了变化?
我还做了一个测试,我添加了一个MPI_BARRIER,只是为了确定,但无济于事。
对重现错误的最小示例进行编辑(在这个新集群上)。
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
我已经在我的本地 macbook 上检查了这段代码,它工作得很好。
【问题讨论】:
-
你说你把范围缩小到那个电话,但你能为我们打一个minimal reproducible example吗?否则,我们必须对声明等做出大量假设。
-
为了快速回答您的最后一个问题,MPI_BCAST 没有改变。要像 Francescalus 所说的那样说更多,请向我们展示一个完整的程序来演示该问题。
-
您的代码很可能一直存在错误,但只是现在它会引起一些差异。没什么不寻常的,但我们必须看到代码。
-
晚上会尝试编译这样的例子。对此感到抱歉。
-
这个最小的例子似乎重现了错误。在 BCAST 之后打印出的值全为零,而不是来自排名 1 的预期非零值。