【问题标题】:Read a 2-D array in a parallel way using C使用 C 以并行方式读取二维数组
【发布时间】: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 可能有自己的怪癖)。

标签: c io openmp fread fseek


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2013-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多