2011-04-17 34 views
0

我想爲大型數組分配空間,只有在程序結束時纔會寫入數據。出於這個原因,我不在乎它是否被緩存。如何在Linux中分配滿足分頁和緩存要求的內存?

我也想非常頻繁地訪問它,所以我不想多做一次頁面散步。出於這個原因,我希望它被分配在一個大的頁面(例如4M)。

所以,我怎麼能......

  • ...要求內存是要麼不可緩存或直寫?
  • ...請求將內存置於大頁面中?

我正在Linux上工作。

+0

您確定要讓它無法緩存嗎?也許一個非臨時存儲是你想要的:http://stackoverflow.com/questions/37070/what-is-the-meaning-of-non-temporal-memory-accesses-in-x86 – 2011-04-18 08:18:37

+0

@Adrian:時間也不錯。我如何告訴編譯器生成非臨時存儲? – 2011-04-18 10:24:11

+0

我還沒有做過一段時間,但這裏有一些起始鏈接 - http://stackoverflow.com/questions/661338/sse-sse2-and-sse3-for-gnu-c – 2011-04-18 11:00:36

回答

1

禁用緩存聽起來像它會使您的寫入速度變慢,如果它迫使寫入一直到RAM。我不確定我會嘗試。

要實際使用大頁面,我建議使用HugeTLB - Large Page Support in the Linux Kernel。它包含了一個如何通過共享內存段使用大頁面的例子。

0

對於透明的巨大頁面,只需分配一個4M對齊的緩衝區即可。使用aligned_allocposix_memalign可以得到一個指針,您可以free。 (請注意,如果緩衝區大小不是alignment/.facepalm的倍數,則需要aligned_alloc才能失敗)。

根據您對/sys/kernel/mm/transparent_hugepage/defrag的設置,您可能需要在緩衝區上使用madvise(MADV_HUGEPAGE)以強烈鼓勵內核使用巨頁。

另請注意,x86-64使用2M的巨大頁面。 x86-32使用4M的巨大頁面。如果你想要兩個簡單的解決方案,對齊到4M是好的。


請求所述存儲器是要麼不可緩存或直寫?

AFAIK,你不能輕易通過普通的Linux API來完成這項工作。 NT stores工作到正常的回寫內存,所以使用它。 (它們覆蓋了內存類型,並且是繞過緩存的弱排序)。

但是,如果你一次不寫完整的緩存行,你一定要緩存寫入。特別是如果存在任何空間或時間局部性,但即使不是那麼讓存儲緩衝區執行其作業(隱藏緩存缺失存儲的延遲)也是一件好事。