【问题标题】:Writing a chunk of MPI distributed data via hdf5 in fortran在fortran中通过hdf5写入一大块MPI分布式数据
【发布时间】:2020-09-29 03:44:03
【问题描述】:

我有一个分布在不同 MPI 进程中的 3d 数组:

real :: DATA(i1:i2, j1:j2, k1:k2)

其中i1, i2, ... 对于每个 MPI 进程都不同,但 MPI 网格是笛卡尔坐标。

为简单起见,假设我有一个120 x 120 x 120 数组,以及分布为3 x 3 x 3 的27 个MPI 进程(因此每个处理器都有一个大小为40 x 40 x 40 的数组)。

使用hdf5 库,我只需要编写该数据的一部分,例如,一个穿过中间垂直于第二轴的切片。结果(全局)数组的大小为120 x 1 x 120

我有点困惑如何在这里正确使用hdf5,以及如何概括完整的DATA 写作(我可以做到)。问题是,并不是每个 MPI 线程都会写入。例如,在上面的例子中,只有 9 个进程必须写一些东西,其他的(在立方体的 +/-x 和 +/-z 边缘上)不必写,因为它们不包含任何块我需要的平板。

我尝试了chunking 技术described here,但看起来这只是针对单个线程。

如果 hdf5 社区能在这方面帮助我将不胜感激 :)

【问题讨论】:

  • 正如 SOG 所写,您需要在每个进程上选择 hyperslab。有些人的大小可以为零,但无论如何必须进行集体调用。替代方案:从单个进程写入。数据集创建等仍必须集体完成。这一切都可以通过标准的 HDF5 库来完成。

标签: multidimensional-array fortran mpi hdf5


【解决方案1】:

在并行写入 HDF5 数据集时,所有 MPI 进程都必须参与操作(即使某个 MPI 进程没有要写入的值)。

如果您未绑定到特定库,请查看HDFql。根据我从您发布的用例中了解到的情况,这里有一个关于如何使用 HDFql 在 Fortran 中并行写入数据的示例。

PROGRAM Example

    ! use HDFql module (make sure it can be found by the Fortran compiler)
    USE HDFql

    ! declare variables
    REAL(KIND=8), DIMENSION(40, 40, 40) :: values
    CHARACTER(2) :: start
    INTEGER :: state
    INTEGER :: x
    INTEGER :: y
    INTEGER :: z

    ! create an HDF5 file named "example.h5" and use (i.e. open) it in parallel
    state = hdfql_execute("CREATE AND USE FILE example.h5 IN PARALLEL")

    ! create a dataset named "dset" of data type double of three dimensions (size 120x120x120)
    state = hdfql_execute("CREATE DATASET dset AS DOUBLE(120, 120, 120)");

    ! populate variable "values" with certain values
    DO x = 1, 40
        DO y = 1, 40
            DO z = 1, 40
                values(z, y, x) = hdfql_mpi_get_rank() * 100000 + (x * 1600 + y * 40 + z)
            END DO
        END DO
    END DO

    ! register variable "values" for subsequent use (by HDFql)
    state = hdfql_variable_register(values)

    IF (hdfql_mpi_get_rank() < 3) THEN
        ! insert (i.e. write) values from variable "values" into dataset "dset" using an hyperslab in function of the MPI rank (each rank writes 40x40x40 values)
        WRITE(start, "(I0)") hdfql_mpi_get_rank() * 40
        state = hdfql_execute("INSERT INTO dset(" // start // ":1:1:40) IN PARALLEL VALUES FROM MEMORY 0")
    ELSE
        ! if MPI rank is equal or greater than 3 nothing is written
        state = hdfql_execute("INSERT INTO dset IN PARALLEL NO VALUES")
    END IF

END PROGRAM

请查看 HDFql reference manual 以获取有关如何使用此库并行处理 HDF5 文件(即使用 MPI)的更多信息。

【讨论】:

  • 我很想使用另一个库,但我在一个由外部管理的巨大集群上运行这个东西。常规hdf5 中是否有类似的解决方案?如果您对此不太熟悉,那没关系,我可以尝试将您写的内容翻译成普通的hdf5
  • @HaykHakobyan:不幸的是,不确定如何使用其他库解决您的用例。希望上面的例子能给你一些关于如何继续翻译的提示!
猜你喜欢
  • 2017-03-13
  • 1970-01-01
  • 2021-04-21
  • 2013-01-25
  • 2021-10-26
  • 1970-01-01
  • 2019-03-06
  • 2017-06-10
相关资源
最近更新 更多