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

har*_*dkl 5 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)
Run Code Online (Sandbox Code Playgroud)

但是,描述全局量的array_of_sizes和array_of_starts只是MPI接口中的"正常"整数.因此,采用这种方法,约有20亿个元素存在限制.是否有另一个接口,它使用MPI_OFFSET_KIND来表示这些全局值?到目前为止,解决此问题的唯一方法是使用MPI_File_set_view中的置换选项,而不是在子阵列MPI类型的帮助下定义视图.然而,这"感觉"错了.您是否期望对集体IO的任何一种方法都会产生性能影响?有人知道,如果这个界面在MPI-3中有变化吗?也许我应该使用其他一些MPI类型?

这里有什么建议的解决方案可以有效地将具有集合IO的大型数据文件并行写入磁盘?

Jon*_*rsi 3

帮助即将到来。

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

但就目前而言......特别是对于子数组,目前这通常不被认为是一个大问题 - 即使对于 2d 数组,20 亿的索引给你一个 4x10 18的数组大小,这无疑是相当大的(但正是针对百亿亿次计算的数字类型)。在更高的维度中,它甚至更大。

不过,在 1d 中,20 亿长的数字列表只有 ~8GB,这不是任何可拉伸的大数据,我认为这就是你发现自己所处的情况。我的建议是保留它的形式现在只要你能。当地的元素有没有共同点?如果可行的话,您可以通过以(例如)10 vectypes 为单位捆绑类型来解决此问题 - 对于您的代码来说这不重要,但它会以相同的因子减少 locElements 和 globElements 中的数字。否则,是的,您始终可以在文件集视图中使用位移字段。