用C语言并行读取一个二维数组。

问题描述 投票:0回答:1

我正在做一个物理模拟代码(C程序),有密集的IO。在每个时间步骤中,我需要从磁盘上的二进制文件中加载一个二维数组,然后对其进行处理。为了加载数组,我使用fseek来移动指针,使用fread来实际读取数据。然而,这个IO过程大大降低了程序的速度,特别是在处理大型模型时。

所以我在考虑使用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行的情况下工作得很好,但是当我包含这行时,它给我一个分段的错误。那么有什么办法可以解决这个问题吗?或者更一般地说,从二进制文件(可能是并行的)读取二维(甚至多维)数组的最快方法是什么?任何建议都会很有帮助。先谢谢你。

c io openmp fread fseek
1个回答
2
投票

考虑使用mmap()或mmap64()使整个文件在内存中成为一个数组。 没有缓冲的FILE*,没有fseek(),只有一个指针和仔细的指针运算。 你也可以覆盖数据,如果你配置了这个,如果有帮助的话。 这使用所有的RAM作为文件的缓存,和VM来读写它,即使你的代码中止。 其他进程也可以看文件,没有任何开销,使用mmap()或任何一种文件IO! 这是最强大的库例程之一! 当然,如果数据是以字符串形式或错误的endian顺序写的,会有额外的开销。 还有mmap()的选项可以在写的时候复制!

© www.soinside.com 2019 - 2024. All rights reserved.