我有一个工作代码,我一年多前在旧集群上使用过。今年,我想再次使用这个代码,但是,集群是不同的,结果变得毫无意义。我知道这个集群的具体细节,但很难从那个旧集群中找到它们。
我能够将问题缩小到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)intel / 13.0.1 2)openmpi / 1.8.1
用于在此新群集上使用的编译器。
我无法访问旧群集,因此无法检查哪些编译器已加载。然而,可能是这样的:
which mpif90
/opt/mpi/bullxmpi/1.1.16.5/bin/mpif90
,
因为我在一封旧电子邮件中找到了此片段。
那么,多年来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上检查了这段代码,它运行得很好。
答案 0 :(得分:0)
罪魁祸首是默认加载的模块(openmpi / 1.8.1)。
首先,我尝试了其他一些,但忘记更改我的提交脚本,其中再次加载模块。所以,我只在编译时更改了模块,但在运行时没有。
底线,默认加载损坏的模块,愚蠢我没有正确切换到其他模块来解决我自己的问题。
现在可以使用openmpi / 1.8.4。