使用集体MPI-IO读取和写入大文件的最佳方法

时间:2012-02-18 22:11:56

标签: io fortran mpi

我想使用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的大型数据文件并行写入磁盘?

1 个答案:

答案 0 :(得分:3)

帮助即将到来。

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

但是现在...... 然而,对于特别是子阵列,目前通常不会认为这是一个巨大的问题 - 即使对于二维数组,20亿的索引也会给你一个4x10 18 的数组大小。相当大(但恰好是针对亿亿级计算的数字)。在更高的尺寸,它甚至更大。

然而,在1d中,20亿长的数字列表只有~8GB,这不是任何大数据,我认为这是你自己所处的情况。我的建议是将其保留在形式中你尽可能长久地拥有它。在本地元素中是否存在共同因素?您可以通过以(例如)10种类型为单位捆绑类型来解决这个问题(如果可行) - 对于您的代码来说它应该无关紧要,但它会减少locElements和globElements中相同因子的相同因素。否则,是的,您始终可以在文件集视图中使用位移字段。