簡體   English   中英

使用 C 以並行方式讀取二維數組

[英]Read a 2-D array in a parallel way using C

我正在開發一個具有密集 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 行的情況下工作正常,但是當我包含此行時它給了我一個分段錯誤。 那么知道如何解決它嗎? 或者更一般地說,從二進制文件(可能是並行的)讀取二維(甚至多維)arrays 的最快方法是什么? 任何的意見都將會有幫助。 先感謝您。

考慮使用 mmap() 或 mmap64() 使整個文件成為 memory 中的數組。 沒有緩沖的 FILE*,沒有 fseek(),只有一個指針和仔細的指針運算。 如果您進行了配置並且有幫助,您也可以覆蓋數據。 這使用所有 RAM 作為文件的緩存,並使用 VM 讀取/寫入它,即使您的代碼中止。 其他進程也可以無開銷地查看文件,使用 mmap() 或任何類型的文件 I/O,這是最強大的庫例程之一,當然。 如果數據以字符串形式或錯誤的 endian 順序寫入,則會產生額外的開銷。 還有 mmap() 選項可以在寫入時復制!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM