Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用集体MPI-IO读取和写入大型文件的最佳方法_Io_Fortran_Mpi - Fatal编程技术网

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

使用集体MPI-IO读取和写入大型文件的最佳方法,io,fortran,mpi,Io,Fortran,Mpi,我想使用MPI-IO在Fortran中读写大型数据集。我的首选方法是使用MPI_type_create_子数组定义的MPI类型(具有单个维度)来描述文件中每个进程的视图。因此,我的Fortran代码如下所示: ! A contiguous type to describe the vector per element. ! MPI_TYPE_CONTIGUOUS(COUNT, OLDTYPE, NEWTYPE, IERROR) call MPI_Type_contiguous(nCo

我想使用MPI-IO在Fortran中读写大型数据集。我的首选方法是使用MPI_type_create_子数组定义的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)
然而,在MPI接口中,描述全局数量的大小数组和大小数组只是“普通”整数。因此,这种方法的限制约为20亿元素。 是否还有另一个接口,它使用MPI_OFFSET_KIND作为这些全局值? 到目前为止,解决这个问题的唯一方法是在MPI_File_set_视图中使用置换选项,而不是在子阵列MPI类型的帮助下定义视图。然而,这种“感觉”是错误的。对于集体IO,您是否希望这两种方法都会对性能产生影响?有人知道这个接口在MPI-3中是否会改变吗? 也许我应该使用其他MPI类型

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

帮助即将到来

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

但是现在。。 然而,对于子阵列来说,目前这通常不被认为是一个大问题——即使对于2d阵列,20亿的索引也会给你一个4x1018的阵列大小,这是公认的相当大的(但正是exascale类型计算的目标数字)。在更高的维度,它甚至更大


然而,在1d中,一个20亿长的数字列表只有~8GB,这在任何大数据中都算不上,我认为这就是你所处的情况。我的建议是尽可能长时间地保持现在的形式。局部元素中是否存在共同因素?如果可行的话,可以通过将类型以(比如)10个向量类型为单位进行捆绑来解决这个问题——对于代码来说,这并不重要,但它会以相同的因数减少locElements和globElements中的数字。否则,可以始终在“文件集”视图中使用“置换”字段

非常感谢您的详细回复。不幸的是,据我所知,MPI_Count的东西不会有帮助,因为它不会改变子数组接口,也不会提供一个新的接口来定义这样一种数据类型,其中全局范围不能被4字节整数覆盖。不幸的是,在我的所有分区中,我也不能很容易地找到一个比一个更大的通用鉴别器,因为一个通用的分布是,例如,对于所有分区,n=globElem/p,但是对于第一个mod(globElem/p)分区,n+1.Oof。是的,我希望MPI_计数最终会进入其他例程,但不是3.0。那么,您可能运气不好,必须使用手动置换方法。或者,根据您对数据所做的操作,您可以有一个较小的重复模式——或者显式地重复,或者假装它是(比如)2d数组——并且仍然可以获得相当好的负载平衡;但这将取决于加载1d子数组后您对它们所做的操作。您不能编译mpi以使用8字节整数吗?(英特尔
-i8
,gcc
-fdefault-integer-8
)我宁愿继续使用HPC主机提供的安装。