mpi_file_write 与 mpi_file_write_all 有何不同?
How does mpi_file_write differ from mpi_file_write_all?
差不多就是这个问题了。我的意思是,我知道 mpi_file_write_all 是 "collective" 版本,但我认为 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 库具有全局视图并且知道每个进程在做什么。首先,这使它能够重组数据,因此每个进程都有一大块数据要写入文件。其次,由于它控制了所有进程,因此可以避免锁定文件的需要,因为它可以确保写入不会冲突。
对于简单的规则模式,例如一个分布在 3D 进程网格中的大型 3D 阵列,我已经看到在带有 Lustre 文件系统的 Cray 上的集体和非集体方法之间的巨大差异。差异可以是 gigabytes/second 与数十 megabytes/second.
PS 我在这里假设模式是许多进程将数据写入单个共享文件。对于读取也应该有改进(少量的大量连续读取)但可能不会那么显着,因为读取不需要文件锁定。
差不多就是这个问题了。我的意思是,我知道 mpi_file_write_all 是 "collective" 版本,但我认为 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 库具有全局视图并且知道每个进程在做什么。首先,这使它能够重组数据,因此每个进程都有一大块数据要写入文件。其次,由于它控制了所有进程,因此可以避免锁定文件的需要,因为它可以确保写入不会冲突。
对于简单的规则模式,例如一个分布在 3D 进程网格中的大型 3D 阵列,我已经看到在带有 Lustre 文件系统的 Cray 上的集体和非集体方法之间的巨大差异。差异可以是 gigabytes/second 与数十 megabytes/second.
PS 我在这里假设模式是许多进程将数据写入单个共享文件。对于读取也应该有改进(少量的大量连续读取)但可能不会那么显着,因为读取不需要文件锁定。