2011-07-29 28 views
1

我想在緩存中創建一個帶有適當變量對齊的多線程C程序,以避免「緩存晃盪」。我從/sys/devices/system/cpu/cpu0/cache/index0/coherency_line_size獲得緩存行長度,所以我知道如何填充我的陣列以佔用全部緩存行。緩存行開頭的變量

但是,我怎麼能確定一個數組在緩存行的開始處分配的正好是?或者它是自動的? (如果它是自動的,我不會在乎填充...)

+0

通常的警告:你確定這真的很重要嗎?你不是在做過早的優化嗎? –

+0

更多關於好奇的信息比優化 –

回答

3

要分配具有特定比對的內存,請使用posix_memalign

(我不知道內存分配器是否有足夠的智能高速緩存行邊界自動分配,雖然)。

+0

+1,但也許應該說,這個名字表明它是依賴系統的。 OP沒有明確表示他在POSIX系統上。 –

+0

這也只適用於在堆上分配。 –

0

我不認爲有一種便攜式標準C函數直接確保本。一個可移植的方式是分配比您需要的稍多的內存,然後將您真正使用的部分偏移到滿足您的對齊要求的第一個地址。這同樣適用於堆棧和堆棧內存。

這樣做的缺點是,對於malloc ed內存,您總是必須在某處保留一個指向原始內存的指針,以便以後可以使用free

+0

那麼,一些像「p2 = p + line_length-p%line_length」這樣的指針值的「技巧」會等同於正確的對齊? –

+0

在一個非分段內存的架構上,我認爲這個方向上的某些東西會這樣做。但是你肯定必須從char *開始轉換以獲得期望的結果。在分段內存中,如果存在緩衝區起始處的分段邊界,則可能必須更加小心...... –