并行I / O选项,尤其是并行HDF5


20

我有一个可以并行化的应用程序,但其性能在很大程度上受到I / O的限制。该应用程序读取存储在文件中的单个输入数组,该文件的大小通常为2-5 GB(但我希望这个数字将来会增长)。典型的计算将相同的操作应用于该数组的每一行或每一列。对于CPU繁重的操作,我可以很好地扩展到大约100个处理器,但是对于较慢的操作,I / O和相关的通信(NFS访问)占主导地位,并且我不能有效地使用几个以上的处理器。

在这种情况下,什么是有效且可移植的(理想情况下是高效的)选项?并行HDF5似乎很有希望。有没有人有现实生活中的经验?

MPI-I / O是否值得研究?它可以在给定的文件布局下有效地工作,还是必须调整所有内容?


4
好问题。我们有同样的问题,我们的粗略解决方案是为N个处理器向/从N个文件写入/读取域分解后的数组。我不是很喜欢,但这很简单。我希望看到能解决各种库接口复杂性的答案
Yann

您如何在处理器之间分配阵列?您现在将什么用于并行性?您是否通过NFS写入文件作为一种通讯方式?

2
您可能不必非常重做代码;我曾经遇到过这样的问题,并且能够比优化它更好地避免IO。

1
您是否正在使用PBS或Torque等队列系统?如果是这样,有一些命令可以在作业开始时将文件“暂存”到某个目录中。我不知道它是否可以使速度显着提高,但是值得一试。

1
@Dan:是的,我使用PBS,可以将其放在我想要的任何位置。但是由于我的群集没有节点本地磁盘,因此没有什么比共享NFS卷更好。
khinsen 2011年

Answers:


6

在这种情况下,并行I / O可以为您提供帮助,但是如果您使用(本来就很不错的串行方式)NFS来提供文件,那么它将无法充分发挥您想要的效果-串行瓶颈将存在。文件服务器和具有数百个进程的单个服务器发出请求不会给您带来通过单个进程完成数百个加速的因素。尽管如此,这还是有一定帮助的,特别是因为听起来好像瓶颈是读取而不是写入,而且如果您的系统升级到完全并行的文件系统,那将是一个很大的改进。

MPI-IO非常低级;值得了解一些有关它的知识,以了解并行HDF5,NetCDF4ADIOS的幕后”情况,但您自己使用它实际上仅适用于在编译时众所周知的原始二进制数据。HDF5和NetCDF4更加灵活。

请注意,如果您的数据相对简单-例如,大数据结构主要是n维数组或向量-我建议使用NetCDF4(它也是并行的,并且基于HDF5)而不是HDF5。这是siginificantly易于使用。HDF5更加复杂,而作为这种复杂性的交换条件,则可以创建非常复杂的数据模型。但是,如果您不需要此功能,则使用NetCDF4入门会更快。

在我们中心,我们有一个并行I / O的下午课程和一天课程,我们讨论基本概念MPI-IO,HDF5和NetCDF4。幻灯片可以在这里找到。


5

使用MPI / IO输出矢量,我们可以很好地扩展到ORNL的整个XT6。这是代码。许多机器的I / O子系统不是为大规模并行性而设计的,因此我认为@Dan是正确的,我将尝试仅编写每几个步骤或其他一些聚集策略来尽量减少IO。

就以可伸缩方式灵活地输出输出方面,我对XDMF很有经验,这可以通过使用HDF5(例如PETSc VecView)进行的大型并行二进制写入以及少量以串行方式编写的XML代码来描述布局来实现。可以通过可视化包(如ParaviewMayaVi2)读取。另一种执行此方法的方法是将VTK格式与附加的二进制数据一起使用,但是这要求您先了解要编写的所有内容。


XDMF看起来很有趣,但是它是关于组织数据,而不是有效地访问XDMF所谓的“大量”数据。您在这方面使用什么?
khinsen 2011年

我们只是使用XDMF指向HDF5。这样,您可以编写所有二进制HDF5,但大多数可视化引擎都可以读取它。
Matt Knepley 2011年

1

我认为您的可伸缩性问题与输出有关,而不与输入有关。并行输入相当简单-我要做的是每个CPU打开输入NetCDF文件并读取属于其图块的数组部分(可能有多少读者可以限制打开同一NetCDF文件的数量,但我不确定)。并行输出更成问题。

我目前正在做的还不是很理想,但是现在可以使用。我将全部内容收集到一个CPU上并进行串行输出。同时,其他玩家等待作家完成。这对我来说效果很好,因为我设法使计算输出率的比率保持很高-因此,可伸缩性对于超过200个CPU而言将是不错的选择。但这不是您要寻找的解决方案。

Yann提出的另一种解决方案是-串行写入N个文件,并让无人驾驶飞机CPU将图块拼成一张-如果RAM允许的话。

除了先前答案中建议的并行I / O库之外,您还可能希望了解并行NetCDF http://trac.mcs.anl.gov/projects/parallel-netcdf,因为您已经熟悉NetCDF和MPI。我没有在实践中使用过它,但是当我通过收集+串行I / O碰壁时,确实打算朝这个方向发展。


这是我的可扩展性问题的输入。我想来自许多节点的所有传入请求都会使NFS服务器超载,但是我不知道如何验证这一假设。
khinsen 2011年

@khinsen要检验假设,您可以做的事情是使用少量CPU(例如1到8)读取文件,然后将数据分散到其余部分。执行性能分析,查看您在I / O上花费了多少时间以及在分散上花费了多少时间。改变CPU阅读器的数量,看看有什么能为您带来最佳性能。
milancurcic 2011年

好建议!这将是一些工作,因为这意味着重写代码,但这可能是值得的。
khinsen 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.