mpi_file_write与mpi_file_write_all有何不同?

时间:2016-07-27 14:28:23

标签: io mpi

这几乎是个问题。我的意思是,我知道mpi_file_write_all是"集体"版本,但我认为mpi_file_write将会被多个进程同时调用,那么它们的操作实际差异是什么?感谢。

1 个答案:

答案 0 :(得分:6)

从功能上讲,在大多数实际情况中几乎没有什么区别。如果您的IO与mpi_file_write_all()一起正常工作,那么它应该与mpi_file_write()一起正常工作,除非您正在做一些非常复杂的事情。相反的情况并非严格正确,但在我见过的大多数实际情况中,所有进程同时执行简单的常规IO模式,如果mpi_file_write()有效,则mpi_file_write_all()有效。

无论如何,重点是如果你调用mpi_file_write(),那么IO库必须在那里处理那个IO请求,因为它不能假设其他进程也在执行IO。除了最简单的并行分解之外,来自单个进程的数据将不包含文件的单个连续块。结果,每个进程将执行大量小型IO事务(写入,查找,写入,搜索......),这在并行文件系统上效率非常低。更糟糕的是,它可能在执行IO时锁定文件,以阻止其他进程干扰其执行的操作,从而使IO可以跨进程有效地序列化。

使用write_all(),IO库具有全局视图,并且知道每个进程在做什么。首先,这使它能够重新组织数据,因此每个进程都有一大块数据要写入文件。其次,由于它控制着所有进程,因此可以避免锁定文件,因为它可以确保写入不会发生冲突。

对于简单的常规模式,例如一个分布在3D网格流程中的大型3D阵列,我发现Cray上的集体和非集体方法与Lustre文件系统之间存在巨大差异。差异可以是千兆字节/秒,而不是几十兆字节/秒。

PS我在这里假设模式是许多进程将数据写入单个共享文件。对于阅读,也应该有一个改进(少量大的连续读取),但也许不那么戏剧性,因为阅读不需要文件锁定。