【问题标题】:MPI_BCAST in fortran not working on new clusterfortran 中的 MPI_BCAST 不适用于新集群
【发布时间】: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 的预期非零值。

标签: fortran mpi


【解决方案1】:

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

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

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

它现在适用于 openmpi/1.8.4。

【讨论】:

    猜你喜欢
    • 2021-08-11
    • 2013-06-27
    • 2022-01-05
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    • 2019-12-01
    • 2015-10-16
    • 1970-01-01
    相关资源
    最近更新 更多