【发布时间】:2020-06-03 20:07:12
【问题描述】:
我正在编写具有密集 I/O 的物理模拟代码(C 程序)。在每个时间步,我需要从磁盘上的二进制文件加载一个二维数组,然后对其进行处理。为了加载数组,我使用 fseek 移动指针并使用 fread 来实际读取数据。但是,此 I/O 过程会显着减慢程序的速度,尤其是在处理大型模型时。
所以我正在考虑使用 OpenMP 来加速。基本上,我使用 fseek 逐行读取二进制文件。
#pragma omp parallel for private(ix, Fp)
for (ix = 0; ix < nx; ix++) {
fseek(Fp, sizeof(float) * (nx * nz * (it - 2) + ix * nz), SEEK_SET); // Move the pointer
fread(array[ix], sizeof(float), nz, Fp); // Read array
}
代码在没有#pragma 行的情况下可以正常工作,但是当我包含此行时它会给我一个分段错误。那么知道如何解决它吗?或者更一般地说,从二进制文件(可能是并行的)读取二维(甚至多维)数组的最快方法是什么?任何的意见都将会有帮助。提前谢谢你。
【问题讨论】:
-
并行 IO 不太可能提高性能。你在那里有一个硬件。我认为你会让情况变得更糟,因为你让头部来回跳跃而不是顺序读取(在经典磁性 HDD 的情况下。SSD 可能有自己的怪癖)。