我想使用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的大型数据文件并行写入磁盘?
帮助即将到来。
在 MPI-3 中,将有使用MPI_Count而不是 int 的数据类型操作例程。为了向后兼容(呻吟),现有的例程不会改变,但你应该能够创建你的类型。
但就目前而言......特别是对于子数组,目前这通常不被认为是一个大问题 - 即使对于 2d 数组,20 亿的索引给你一个 4x10 18的数组大小,这无疑是相当大的(但正是针对百亿亿次计算的数字类型)。在更高的维度中,它甚至更大。
不过,在 1d 中,20 亿长的数字列表只有 ~8GB,这不是任何可拉伸的大数据,我认为这就是你发现自己所处的情况。我的建议是保留它的形式现在只要你能。当地的元素有没有共同点?如果可行的话,您可以通过以(例如)10 vectypes 为单位捆绑类型来解决此问题 - 对于您的代码来说这不重要,但它会以相同的因子减少 locElements 和 globElements 中的数字。否则,是的,您始终可以在文件集视图中使用位移字段。