我正在使用 MPI 库为大规模 CFD 代码设置 IO,并且随着问题规模的扩大,文件 IO 开始占用计算时间。
据我所知,现代背景下的“完成”的事情是大量利用集体 IO 操作,(ARCHER 上的并行 IO 性能- 2015 年白皮书)。
我的问题是,似乎有三种调用集体写入的方法:
MPI_File_write_all
,阻塞MPI_File_iwrite_all
,非阻塞
并且有些推测:
MPI_File_iwrite
然后调用MPI_File_sync
,先非阻塞然后阻塞?我之所以说是推测,是因为前一个调用显然是非集体的,而后者(据我所知,后者实际上是将数据推送到存储)是集体的。
我的问题是,多个MPI_File_iwrite
s 后跟 a是否MPI_File_sync
等同于一个MPI_File_write_all
,因为文件同步使得非集体写入有效地变成了集体写入?编辑 - 为了清楚起见,我知道 sync 是一个集体例程,我问的是调用 sync 时发生的 IO 是否类似于 write_all 的集体 IO。
后续问题:MPI_File_iwrite_all
调用是否需要MPI_File_sync
调用,如果确实需要,那么集体非阻塞写入的目的是什么,如果它只是变成了阻塞?
我在这里非常关注阻塞与非阻塞,因为我试图从我的代码中完全删除所有同步以提高 CPU 利用率(即,只有当进程缺少来自邻居的所需信息时才会等待,而不是等待所有进程同步)但显然这在输出时会出现一些问题。
来自 MPI 标准
4.1
(章节14.6
页704
)您的问题涉及三个正交的 MPI 概念:操作的本地完成、进程同步和数据一致性。
阻塞和非阻塞的主要区别在于操作的进程本地状态。阻塞操作在阻塞调用返回之前完成;非阻塞操作在完成调用成功后完成。在操作本地完成之前,MPI 库“拥有”您传递给函数的缓冲区。
只有一小部分 MPI 函数需要同步。尤其是集体通信,并不一定需要同步。
完成文件 IO 功能并不能建立数据一致性(或操作影响的全局可见性)。
MPI_File_sync
为文件访问建立数据一致性。仅当写入文件的数据需要对来自不同进程的后续读取可见时,才需要执行此操作。MPI-4.1 中的示例 14.6 指出,实际上需要一个相当于MPI_File_sync
+MPI_Barrier
+ 的序列MPI_File_sync
来在文件写入和读取之间建立数据一致性。原因是它MPI_File_sync
是集体的,但不是同步的。是否需要
MPI_File_sync
取决于应用程序访问文件的方式。如果需要MPI_File_sync
,则无论 write 调用的类型如何,都需要它。集体写入和非集体写入函数都需要它。使用非阻塞写入时,您需要在本地完成(测试/等待)文件句柄的所有活动 File-IO 操作,然后才能调用MPI_File_sync
。