在上一篇中我们介绍了 mpi4py 中的简单并行 I/O 操作,下面我们将介绍 mpi4py 中的不连续读/写和集合 I/O 操作。
在前面的介绍中,我们没有设定文件视图,或者说使用了默认的文件视图。MPI 中的文件视图定义文件中对一个进程可见的部分,一个 MPI 读/写操作方法只能操作文件中其可见的部分,而会跳过其不可见的部分。当一个文件刚被打开时,默认情况下,整个文件的内容对打开该文件的进程组中的所有进程都是可见的,MPI 把这个文件当成由连续的二进制字节构成(而不是任何有类型的数据)。文件刚打开时,每个进程的独立文件指针和共享文件指针都被设置成了文件起始位置(即偏移为 0 的位置)。
采用默认文件视图,并且使用上一篇中介绍的 Read/Write 或 Read_at/Write_at 文件读/写方法,每个进程每次只能读/写文件中的一段连续数据。其实这种文件操作功能用普通的 Unix/Linux I/O 读/写函数也能实现,因此并不能体现出 MPI 并行 I/O 操作的优势。在实际的并行科学计算应用中,每个进程通常需要读/写很多处于文件中不同位置的很多小的连续数据块。当然可以使用前面介绍的读/写方法每次读/写一个这种小的数据块,但是由于 I/O 操作本身高的时延,这种操作是非常低效和费时的。MPI 提供了更高效的操作方法,允许使用一次函数调用读/写不连续的数据块。如果将这种操作方式和集合 I/O 结合起来,则能进一步提高 I/O 操作性能。因为这种组合可以给 MPI 实现提供足够的信息使其知道有哪些进程在同时读/写文件及文件中所有会被同时读/写到的数据。MPI 实现可以利用这些信息对该 I/O 操作实施一些优化,比如说将各个进程的小的数据块合并成若干大的连续数据块一次性进行操作等,以显著地提高程序的 I/O 性能。
MPI 的不连续读/写功能是使用文件视图结合相应的读/写函数实现的,下面我们首先介绍文件视图相关方法。
文件视图和不连续读/写
MPI.File.Set_view(self, Offset disp=0, Datatype etype=None, Datatype filetype=None, datarep=None, Info info=INFO_NULL)
MPI.File.Get_view(self)
上面两个方法在前面已经作过介绍,这里不再赘述。这里只强调几点:设置文件视图的操作是一个集合操作&