我有2
个处理器(这是一个例子),我希望这些2
处理器写入文件。我希望它们在文件末尾写入,但不是以混合模式写入,如:
[file content]
proc0
proc1
proc0
proc1
proc0
proc1
(and so on..)
我想让他们按照这种模式写作:
[file content]
proc0
proc0
proc0
proc1
proc1
proc1
(and so on..)
有可能吗?如果是这样,使用的设置是什么?
答案 0 :(得分:4)
您的流程准备报告的输出顺序基本上是不可预知的。即使重复运行完全相同的MPI程序,也会显示输出顺序的差异。所以,在某个地方,某些东西必须对文件的写入强加一个排序。
Wesley已经提到的一个非常常见的模式是让所有进程将其输出发送到一个进程,通常为0,然后让它处理写入文件。这个主编写器可以在写入之前对输出进行排序,但这会产生一些问题:在写入之前分配空间来存储输出,并且更难以处理,确定何时可以对输出记录集合进行排序和写入文件以及输出缓冲区可以重复使用。主编写器等待多长时间以及如何知道进程是否仍在工作?
因此,在并行程序完成后,让主写入器写入输出以及另一个程序根据需要对输出文件进行排序是很常见的。您可以将此作为mpi_finalize
之后的步骤添加到并行程序中,或者您可以使用完全独立的程序(例如Linux机器上的sort
)。当然,为了使其工作,每个输出记录必须包含一些要排序的排序信息。
另一个常见的模式是只有一个进程可以进行任何写入,也就是说,其他任何进程都根本不进行任何输出。这完全避免了写作顺序的不确定性。
另一种模式,不太常见,部分原因是它更难实现,部分原因是它依赖于并非始终可用的基础机制,因此使用mpi io
。使用mpi io
,多个进程可以同时写入文件的不同部分。要实际同时写入,程序需要在支持并行i / o的硬件,网络和操作系统上执行。即使使用正确的平台,实现这一点也很棘手,尤其是当流程的输出量不确定时。
根据我在这里的经验,即使他们可以访问必要的硬件,人们问你的问题可能还处于他们的MPI体验阶段还处于并行i / o的阶段。
答案 1 :(得分:2)
我不同意高性能标志。 MPI-IO在2014年并不那么棘手(只要您可以访问除NFS之外的任何文件系统 - 如果您需要廉价的简单并行文件系统,请安装PVFS)。
如果你知道每个进程有多少数据,你可以使用MPI_SCAN有效地计算早些时候"进程,然后使用MPI_FILE_WRITE_AT_ALL有效地执行I / O.这是您实现此目的的一种方式:
incr = (count*datatype_size);
MPI_Scan(&incr, &new_offset, 1, MPI_LONG_LONG_INT,
MPI_SUM, MPI_COMM_WORLD);
MPI_File_write_at_all(mpi_fh, new_offset, buf, count,
datatype, status)
答案 2 :(得分:1)
你的问题的答案是否定的。如果你以这种方式做事,你最终会得到来自各地的混乱输出。
但是,您可以通过将输出发送到单个处理器来完成所有写入操作,从而获得相同的功能。例如,在应用程序结束时,只需将所有内容发送到等级0并将等级0全部写入文件。