我想爲大型數組分配空間,只有在程序結束時纔會寫入數據。出於這個原因,我不在乎它是否被緩存。如何在Linux中分配滿足分頁和緩存要求的內存?
我也想非常頻繁地訪問它,所以我不想多做一次頁面散步。出於這個原因,我希望它被分配在一個大的頁面(例如4M)。
所以,我怎麼能......
- ...要求內存是要麼不可緩存或直寫?
- ...請求將內存置於大頁面中?
我正在Linux上工作。
我想爲大型數組分配空間,只有在程序結束時纔會寫入數據。出於這個原因,我不在乎它是否被緩存。如何在Linux中分配滿足分頁和緩存要求的內存?
我也想非常頻繁地訪問它,所以我不想多做一次頁面散步。出於這個原因,我希望它被分配在一個大的頁面(例如4M)。
所以,我怎麼能......
我正在Linux上工作。
禁用緩存聽起來像它會使您的寫入速度變慢,如果它迫使寫入一直到RAM。我不確定我會嘗試。
要實際使用大頁面,我建議使用HugeTLB - Large Page Support in the Linux Kernel。它包含了一個如何通過共享內存段使用大頁面的例子。
對於透明的巨大頁面,只需分配一個4M對齊的緩衝區即可。使用aligned_alloc
或posix_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工作到正常的回寫內存,所以使用它。 (它們覆蓋了內存類型,並且是繞過緩存的弱排序)。
但是,如果你一次不寫完整的緩存行,你一定要緩存寫入。特別是如果存在任何空間或時間局部性,但即使不是那麼讓存儲緩衝區執行其作業(隱藏緩存缺失存儲的延遲)也是一件好事。
您確定要讓它無法緩存嗎?也許一個非臨時存儲是你想要的:http://stackoverflow.com/questions/37070/what-is-the-meaning-of-non-temporal-memory-accesses-in-x86 – 2011-04-18 08:18:37
@Adrian:時間也不錯。我如何告訴編譯器生成非臨時存儲? – 2011-04-18 10:24:11
我還沒有做過一段時間,但這裏有一些起始鏈接 - http://stackoverflow.com/questions/661338/sse-sse2-and-sse3-for-gnu-c – 2011-04-18 11:00:36