在上一篇中我们介绍了 mpi4py 中 I/O 操作的一致性语义,下面我们将介绍 mpi4py 中的文件互操作性。
文件是一种持续性的存储,当程序运行完后依然会存在(只要程序不删除文件),可能会被其他程序或在其他环境中使用,因此文件的互操作性就是一个问题。所谓文件互操作就是指一个运行环境/进程写入文件的数据能够被另外的环境/进程所正确解析。MPI 程序操作的文件只是一般的普通文件,MPI 并不会自动在其操作的文件中添加应用和环境等相关的额外信息。为性能上的考虑,MPI 并没有指定应用该以何种物理方式创建文件,尽管 MPI 在逻辑上总是将一个文件视作一个线性的字节序列。如果某个 MPI 实现创建的文件不同于文件系统的普通文件,MPI 标准要求 MPI 实现提供将其创建的文件转换成一个线性字节序列的功能,而且还必须提供一些像复制、删除、移动文件等用户熟悉的功能。因此,非 MPI 的程序总是能够访问由 MPI 创建的文件,虽然可能需要做一些转换。在大多数情况下,MPI 创建的文件是和非 MPI 程序创建的文件完全一致,因此根本用不着转换步骤。
处于单一运行环境下,MPI 可以实现百分之百的互操作。为实现不同运行时环境之间的文件互操作,MPI 定义了统一的外部文件表示规范——external32。
只要满足文件一致性约束,即可保证单一运行环境下的文件互操作性,不论参与的进程数量是多少,都可一致地解析数据文件。文件互操作性可概括为如下 3 种:
- 从二进制表示解析文件的内容。
- 不同文件结构之间的互相转换。
- 不同主机环境之间信息解释机制的互相转换。
这里主要讨论文件在 MPI 环境内外传输时的互操作性,具体而言就是要指定 MPI 环境如何提供能够与 POSIX 兼容的语义(如 cp,rm,mv 等),此外还要保持文件在环境内外相应字节偏移位置上的一一对应。
对不同主机环境之间的文件互操作,通过类型信息(etype 和 filetype)加以规范和转换,并据此提供跨环境(MPI 与非 MPI)、跨平台(不同结构主机)的文件互操作性。
文件数据表示
因为不同的主机环境可能会有不同的二进制数据表示,如字节顺序,数据类型包含的字节数目等,一个主机环境创建的文件可能无法被另一个主机正确地解析。MPI 提供了相应的机制来创建可移植性的文件,我们将在下面进行逐步的介绍。
在前面的所有例子中,我们都没有显式地设置 MPI.File.Se