【问题标题】:File IO for MPI-FORTRANMPI-FORTRAN 的文件 IO
【发布时间】:2012-04-14 04:20:17
【问题描述】:

我有一个用于求解流场的 FORTRAN MPI 代码。

一开始我想从文件中读取数据并将其分发给参与的进程。

数据由几个 3-D 数组(空间 x,y,z 中的速度)组成。

每个进程只存储数组的一部分。

因此,如果每个进程都将读取文件(我认为最简单的方法),它不会工作,因为它只会存储与进程可以容纳的数组数量相对应的文件的第一部分。

MPI Bcast 可以用于 3d 数组吗?但后来事情变得复杂了。

或者有没有更简单的方法?

【问题讨论】:

    标签: file-io fortran mpi


    【解决方案1】:

    一般来说,您有 2 或 3 个选择,具体取决于您的平台。

    1. 一个进程读取输入数据并将其(部分)发送到其他进程。我通常不会为此使用广播,因为它是一项集体操作,所有进程都必须参与。我通常只会向每个流程发送必要的信息。如果方便(而不是内存问题),您当然可以将所有输入数据广播到所有进程,这不是我经常使用或看到的操作模式。
    2. 所有进程都读取它们需要的数据。这可能涉及读取整个输入文件并仅存储它需要的那些部分的过程。但是,如果您有非常大的输入文件,您可以编写例程以仅将必要的部分读取到每个进程的内存空间中。这种方法可能涉及竞争磁盘访问的进程,这只是相对意义上的缓慢:如果您正在运行大规模和长时间运行的并行计算,等待几秒钟而所有进程都获取它们的数据并没有太大的开销。
    3. 如果您有一个并行文件系统,那么您可以使用 MPI 的并行 I/O 例程,以便每个进程只读取它需要的输入数据的那些部分。

    【讨论】:

    • 我可以看看第二个选项的示例吗?
    【解决方案2】:

    MPI 中这种 I/O 模式的规范方式是

    • 读取 rank 0 上的数据,然后使用 MPI_Scatter 分发它。或者,如果内存紧张,请按块执行此操作,或者然后使用 1 对 1 通信而不是 MPI_Scatter。

    • 使用 MPI-I/O,并让每个 rank 读取其自己的数据文件子集(为了有用,这当然需要一种文件格式,您无需先阅读整个文件就可以找出边界文件)。

    为了获得极高的可扩展性,可以将这两种方法结合起来,即一个进程子集(例如,sqrt(N) 作为粗略的经验法则)使用 MPI I/O,每个 MPI 进程将数据发送到自己的 IO过程。

    【讨论】:

      【解决方案3】:

      如果您在少于 1000 个内核且具有良好文件系统(例如 Lustre)的内核上运行代码,则只需使用 Fortran I/O,每个 rank 打开文件并读取所需的数据(跳过其余部分)。是的,这需要几分钟,但您只在启动期间读取文件一次。

      MPI I/O(仅限二进制)并不重要,通常最好使用更高级别的库,例如 HDF5 或 Parallel NetCDF。性能将取决于数据的读取方式(连续与非连续等)。以下链接可能会有所帮助...

      【讨论】:

      • 感谢您推荐 HDF5 或 Parallel-NetCDF:今天很少有理由让新代码直接使用 MPI-IO。
      猜你喜欢
      • 2015-03-13
      • 2015-07-09
      • 2020-12-23
      • 2011-09-15
      • 2021-08-10
      • 2017-05-25
      • 1970-01-01
      • 2020-04-17
      • 1970-01-01
      相关资源
      最近更新 更多