我有2处理器(这是一个例子),我希望这些2处理器写入文件。我希望他们写在文件的末尾,但不是混合模式,就像这样:
[file content]
proc0
proc1
proc0
proc1
proc0
proc1
(and so on..)
Run Code Online (Sandbox Code Playgroud)
我想让他们按照这种模式写:
[file content]
proc0
proc0
proc0
proc1
proc1
proc1
(and so on..)
Run Code Online (Sandbox Code Playgroud)
是否可以?如果是这样,要使用的设置是什么?
本质上,您的流程准备报告的输出的顺序是提前无法得知的。即使重复运行完全相同的 MPI 程序也会显示输出顺序的差异。因此,某个地方的某些东西必须对文件的写入施加一定的顺序。
Wesley 已经提到过,一种非常常见的模式是让所有进程将其输出发送到一个进程(通常是进程 0),并让它处理写入文件的操作。这个主作者可以在写入之前对输出进行排序,但这会产生一些问题:在写入输出之前分配空间来存储输出,并且更难以处理,确定何时可以对输出记录集合进行排序并写入文件以及输出缓冲区被重用。主写器等待多长时间以及它如何知道进程是否仍在工作?
因此,通常让主写入器在获取输出时写入输出,并让另一个程序在并行程序完成后根据需要对输出文件进行排序。您可以将其作为后续步骤添加到并行程序中mpi_finalize,也可以使用完全独立的程序(例如sort在 Linux 机器上)。当然,为此,每个输出记录必须包含一些用于排序的排序信息。
另一种常见模式是只有一个进程根本不执行任何写入操作,也就是说,其他进程根本不执行任何输出。这完全避免了书写顺序的非确定性。
另一种模式不太常见,部分原因是它更难以实现,部分原因是它依赖于并不总是可用的底层机制,即使用mpi io. 多个进程mpi io可以同时写入文件的不同部分。要真正同时写入,程序需要在支持并行 I/O 的硬件、网络和操作系统上执行。即使使用正确的平台,实现这一点也可能很棘手,特别是当流程的输出量不确定时。
根据我在 SO 方面的经验,提出像您这样的问题的人可能还处于处理并行 I/O 的 MPI 经验的早期阶段,即使他们可以访问必要的硬件。