在大多数实际情况下,就功能而言,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:我在这里假设的模式是许多进程将数据写入单个共享文件。对于阅读,也应该会有改善(少量大的连续读取),但可能没有读取时这么明显,因为不需要进行文件锁定。