【问题标题】:Best approach to read and write large files with collective MPI-IO使用集体 MPI-IO 读写大文件的最佳方法
【发布时间】:2012-03-09 19:39:25
【问题描述】:

我想使用 MPI-IO 在 Fortran 中读取和写入大型数据集。我的首选方法是使用使用 MPI_type_create_subarray 定义的具有单一维度的 MPI 类型来描述每个进程对文件的视图。因此,我的 Fortran 代码如下所示:

  ! A contiguous type to describe the vector per element.
  ! MPI_TYPE_CONTIGUOUS(COUNT, OLDTYPE, NEWTYPE, IERROR)
  call MPI_Type_contiguous(nComponents, rk_mpi, &
    &                      me%vectype, iError)
  call MPI_Type_commit( me%vectype, iError )

  ! A subarray to describe the view of this process on the file.
  ! MPI_TYPE_CREATE_SUBARRAY(ndims, array_of_sizes, array_of_subsizes,
  !                          array_of_starts, order, oldtype, newtype, ierror)
  call MPI_Type_create_subarray( 1, [ globElems ], [ locElems ], &
    &                           [ elemOff ], MPI_ORDER_FORTRAN, &
    &                           me%vectype, me%ftype, iError)

然而,描述全局量的array_of_sizes 和array_of_starts 只是MPI 接口中的“普通”整数。因此,这种方法的元素数量限制在 20 亿左右。 是否有另一个接口,将 MPI_OFFSET_KIND 用于这些全局值? 到目前为止,解决此问题的唯一方法是使用 MPI_File_set_view 中的置换选项,而不是在子数组 MPI 类型的帮助下定义视图。然而,这种“感觉”是错误的。您是否期望在这两种方法中对集体 IO 产生性能影响?有谁知道,如果这个接口会在 MPI-3 中改变? 也许我应该使用其他 MPI 类型?

这里推荐的解决方案是使用集体 IO 高效地将大型数据文件并行写入磁盘?

【问题讨论】:

  • 你不能编译 mpi 以使用 8 字节整数吗? (intel -i8, gcc -fdefault-integer-8)
  • 我宁愿继续使用 HPC 主机提供的安装。

标签: io fortran mpi


【解决方案1】:

帮助来了。

在 MPI-3 中,将有使用 MPI_Count 而不是 int 的数据类型操作例程。为了向后兼容(呻吟),现有的例程不会改变,但你应该能够制作你的类型。

但是现在.. 但是,特别是对于子数组,目前这通常不被认为是一个大问题——即使对于二维数组,20 亿的索引也会给你一个 4x1018 的数组大小,这是公认的相当大(但正是针对 exascale 类型计算的那种数字)。在更高的维度上,它甚至更大。

不过,在 1d 中,一个 20 亿长的数字列表只有 ~8GB,这不是任何大数据的延伸,我认为这就是你发现自己所处的情况。我的建议是将它保留在表格中只要你能,你现在就拥有它。局部元素是否存在共同因素?如果可行,您可以通过以(例如)10 个 vectype 为单位捆绑类型来解决此问题 - 对于您的代码来说,这无关紧要,但它会减少 locElements 和 globElements 中的数字。否则,是的,您始终可以在文件集视图中使用置换字段。

【讨论】:

  • 非常感谢您的详细回复。不幸的是,据我所知, MPI_Count 的东西无济于事,因为它不会更改子数组接口,也不会提供新接口来定义全局范围不能被 4 字节整数覆盖的数据类型。不幸的是,我也无法在我的所有分区中轻松找到大于一个的公共鉴别器,因为一个常见的分布是例如所有分区的 n = globElem/p,但对于第一个 mod(globElem/p) 分区 n+1。
  • 哎呀。是的,我希望 MPI_Count 最终会进入其他例程,但不是 3.0。那么,您可能不走运,不得不采用手动置换方法。或者,根据您对数据的处理方式,您可以有一个较小的重复模式 - 明确地或假装它是(比如说)二维数组 - 并且仍然可以获得很好的负载平衡;但这取决于您在加载 1d 子数组后如何处理它们。
猜你喜欢
  • 2017-05-25
  • 1970-01-01
  • 2017-01-14
  • 1970-01-01
  • 1970-01-01
  • 2015-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多