在fortran中通过hdf5写出一块MPI分布式数据

问题描述 投票:0回答:1

我将3d数组分配到不同的MPI流程中:

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

其中每个MPI进程的i1, i2, ...不同,但是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社区可以在此方面为我提供帮助,将非常感激:

multidimensional-array fortran mpi hdf5
1个回答
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" in parallel
    state = hdfql_execute("CREATE PARALLEL FILE example.h5")

    ! use (i.e. open) HDF5 file "example.h5" in parallel
    state = hdfql_execute("USE PARALLEL FILE example.h5")

    ! 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() * 10000 + (x * 40 + y * 40 + z)
            END DO
        END DO
    END DO

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

    ! 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)
    IF (hdfql_mpi_get_rank() < 3) THEN
        WRITE(start, “(I0)”) hdfql_mpi_get_rank() * 40
        state = hdfql_execute("INSERT INTO PARALLEL dset(" // start // ":1:1:40) VALUES FROM MEMORY 0")
    ELSE
        ! if MPI rank is equal or greater than 3 nothing is written as hyperslab block parameter is set to 0
        state = hdfql_execute("INSERT INTO PARALLEL dset(:::0) VALUES FROM MEMORY 0")
    END IF

END PROGRAM

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

© www.soinside.com 2019 - 2024. All rights reserved.