C++ hdf5中的并行读取

C++ hdf5中的并行读取,c++,multithreading,hdf5,C++,Multithreading,Hdf5,我的C++/C程序按顺序从hdf5文件中读取数百个压缩复合数组,并将它们存储在一些向量中。我想提高它的时间性能。我希望我能同时阅读其中的3或4篇,然后再阅读下3或4篇,以此类推。。我对多线程、OpenMP或任何并行编程都是全新的。我的问题是: -可以在hdf5/C/C++/Linux上实现我想要的吗? -如果是的话,你能告诉我一些初学者的信息或教程吗? 非常感谢。 就Nyama而言,HDF5在技术上有一个函数,但它序列化了所有库调用,因此没有性能优势(请参阅链接)。根据应用程序的不同,可以使用创

我的C++/C程序按顺序从hdf5文件中读取数百个压缩复合数组,并将它们存储在一些向量中。我想提高它的时间性能。我希望我能同时阅读其中的3或4篇,然后再阅读下3或4篇,以此类推。。我对多线程、OpenMP或任何并行编程都是全新的。我的问题是: -可以在hdf5/C/C++/Linux上实现我想要的吗? -如果是的话,你能告诉我一些初学者的信息或教程吗? 非常感谢。 就Nyama而言,HDF5在技术上有一个函数,但它序列化了所有库调用,因此没有性能优势(请参阅链接)。根据应用程序的不同,可以使用创建并行进程而不是并行线程。如果采用这种方法,可能需要使用进程间通信()将数据传输回主进程

请注意,这些并行读取方法中的任何一种是否有任何好处,在很大程度上取决于HDF5文件在磁盘上的存储方式。如果它们位于标准的7200 RPM磁盘上,您可能会通过尝试执行并行读取来降低速度,因为您将开始搜索整个文件,而不是很好地流式输出连续块(假设您的磁盘不是非常碎片化)。另一方面,如果数据位于更高级的文件服务器、具有良好控制器的SSD或RAID阵列上,则您将更有可能看到好处。我建议先做一些分析,看看是否花时间做真正的文件系统I/O(在这种情况下,您需要更好的磁盘或将数据分散到多个磁盘上)、解压缩(如果这是瓶颈,多线程或多处理更有可能是一个很大的帮助)或其他操作,但是它序列化了所有库调用,因此没有性能优势(请参阅链接)。根据应用程序的不同,可以使用创建并行进程而不是并行线程。如果采用这种方法,可能需要使用进程间通信()将数据传输回主进程


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

Ok。程序正在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作业的同一台机器上)?确定。程序正在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作业的同一台机器上)?