【问题标题】:Parallel reading in hdf5hdf5中的并行读取
【发布时间】:2014-05-23 13:08:19
【问题描述】:

我的 C++/C 程序从 hdf5 文件中顺序读取数百个压缩复合数组,并将它们存储在一些向量中。我想提高它的时间性能。我希望我可以并行读取 3 或 4 个,然后再读取 3 或 4 个,等等。我对多线程或 OpenMP 或任何并行编程完全陌生。我的问题是: - 是否可以在 hdf5/C/C++/Linux 上实现我想要的? - 如果是这样,你能指导我一些初学者的信息或教程吗? 谢谢 尊敬的尼玛

【问题讨论】:

    标签: c++ multithreading hdf5


    【解决方案1】:

    HDF5 在技术上具有thread-safe mode,但它会序列化所有库调用,因此没有性能优势(请参阅链接)。根据您的应用程序,您可以使用fork 创建并行进程而不是并行线程。如果您采用这种方法,您可能需要使用进程间通信(IPC)将数据传输回主进程。

    请注意,这些并行读取方法中是否有任何好处在很大程度上取决于 HDF5 文件在磁​​盘上的存储方式。如果它们位于标准的 7200 RPM 磁盘上,您可能会通过尝试进行并行读取来使事情变得,因为您将开始寻找整个文件,而不是很好地流出连续的块(假设您的磁盘还不是很碎片化)。另一方面,如果数据位于更高级的文件服务器、具有良好控制器的 SSD 或 RAID 阵列上,则更有可能获得好处。我建议首先做一些分析,看看时间是否花在了真正的文件系统 I/O 上(在这种情况下,你需要更好的磁盘或将数据分布在多个磁盘上)、解压缩(多线程或多处理更有可能是一个大如果这是瓶颈,请提供帮助)或其他操作。

    【讨论】:

    • 好的。该程序正在花时间阅读 hdf5 数据集。例如:对于17gsA读取的数据集,我的程序用未压缩的hdf5数据库时间=48秒,大小为17gsA=50MB;我的压缩hdf5数据库时间=29秒,大小17gsA=13MB的程序,压缩文本数据库时间=25秒,大小=10MB的原始程序。 hdf5 在压缩可变复合数组时没有提供良好的性能,因此我将数据集固定为复合,结果您会看到它们的大小有所不同。时间显然与它们的大小成正比。所以我认为大部分时间都花在将数据从硬盘加载到 RAM 上。
    • 50 MiB / 48 秒是相当低的原始数据速率。您使用的是网络文件系统还是本地磁盘?一个经过碎片整理的 7200 RPM 本地磁盘应该能够以大约 100 MiB/s 的速度顺序读取。 “time cat $your_file”在命令行上需要多长时间(来自您通常运行 HDF5 作业的同一台机器)?
    猜你喜欢
    • 2017-11-26
    • 2022-07-07
    • 1970-01-01
    • 2014-06-01
    • 2020-03-21
    • 2017-03-11
    • 2014-01-04
    • 2015-03-19
    • 2015-04-09
    相关资源
    最近更新 更多