mpi_file_write和mpi_file_write_all有什么区别?

5

这基本上就是问题所在。我知道mpi_file_write_all是“集体”版本,但我认为mpi_file_write将会被多个进程同时调用,那么它们的实际操作有什么区别吗?谢谢。

1个回答

9
在大多数实际情况下,就功能而言,mpi_file_write_all() 和mpi_file_write()之间的差异很小。除非你在做一些非常复杂的事情,否则如果你的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库具有全局视图,并知道每个进程正在做什么。首先,这使得它能够重新组织数据,以便每个进程都有一个单独的大数据块要写入文件。其次,由于它控制所有进程,因此它可以避免锁定文件的需要,因为它可以确保写操作不冲突。
对于简单的规则模式,例如在Crays和Lustre文件系统上分布在3D进程网格中的大型3D数组,我看到了使用集体和非集体方法之间的巨大差异。这种差异可能是每秒数十兆字节与每秒几千兆字节之间的差异。
PS:我在这里假设的模式是许多进程将数据写入单个共享文件。对于阅读,也应该会有改善(少量大的连续读取),但可能没有读取时这么明显,因为不需要进行文件锁定。

是的,模式是许多进程写入共享文件。 谢谢解释。 我使用write_all确实看到了性能上的大幅提升。很高兴了解其中的原因。 这在公开文档中有记录吗? 我找不到太多信息。 - bob.sacamento
1
我的解释主要是基于进行一些简单的基准测试(参见 http://www.archer.ac.uk/documentation/white-papers/ 上的“在ARCHER上的并行IO性能”),然后与当地Cray员工交流,试图弄清楚发生了什么。在此页面底部有一些有用的链接:https://www.rc.colorado.edu/support/examples-and-tutorials/parallel-io-on-janus-lustre.html - David Henty
谢谢提供链接! - bob.sacamento

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接