fortran中的MPI_BCAST没有在新集群上工作

时间:2016-03-24 00:32:42

标签: fortran mpi

我有一个工作代码,我一年多前在旧集群上使用过。今年,我想再次使用这个代码,但是,集群是不同的,结果变得毫无意义。我知道这个集群的具体细节,但很难从那个旧集群中找到它们。

我能够将问题缩小到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上检查了这段代码,它运行得很好。

1 个答案:

答案 0 :(得分:0)

罪魁祸首是默认加载的模块(openmpi / 1.8.1)。

首先,我尝试了其他一些,但忘记更改我的提交脚本,其中再次加载模块。所以,我只在编译时更改了模块,但在运行时没有。

底线,默认加载损坏的模块,愚蠢我没有正确切换到其他模块来解决我自己的问题。

现在可以使用openmpi / 1.8.4。