2014-09-04 66 views
3

我不明白的是,爲什麼我們必須在大於4個字節的邊界上對齊內存中的數據,因爲所有其他邊界都是4的倍數。假設一個CPU可以在一個週期內讀取4個字節,它基本上不會如果數據大小爲8個字節並且在4字節/ 8字節/ 16字節上對齊,則性能差異等。爲什麼對齊邊界大於4?

+0

你指的是什麼CPU /架構? – 2014-09-04 08:03:55

+1

爲什麼你認爲CPU在一個週期中讀取4個字節? – jalf 2014-09-04 08:04:02

+3

爲什麼對齊邊界大於1? ;-)如果你能回答這個問題,那麼你可以回答你自己的問題。 – 2014-09-04 08:04:42

回答

2

第一:x86 CPU不會只讀4字節的內容,它們可以在一個週期內讀取8個字節,甚至可以使用SIMD擴展。

但是,爲了回答你的問題「爲什麼有邊界對齊多比4?」,假設一個通用的架構(你沒有指定一個you wrote that x86 was just an example)我將介紹一個具體案例:圖形處理器。

如果地址在多個訪問大小(PTX ISA ld/st)上對齊,NVIDIA GPU內存只能被訪問(存儲/加載)。有不同種類的負載,並且當地址對齊到訪問大小的倍數時發生最高性能負載,所以如果您嘗試從內存(8字節)加載雙倍的內存(僞代碼):

ld.double [48dec] // Works, 8 bytes aligned 
ld.double [17dec] // Fails, not 8 bytes aligned 

在上述情況下,當試圖訪問(r/w)內存不正確對齊的過程實際上會導致錯誤。如果你想要速度,你必須提供一些安全保證。

這可能會回答你爲什麼首先存在大於4的對齊邊界的問題。在這樣的體系結構中,訪問大小爲1總是安全的(每個地址都與1對齊)。對於每個n> 1都不是這樣。

+0

可以肯定地說,對齊給cpu提示多少數據從內存中讀取?我的意思是,將INT對齊到8個字節是否可以安全地假設cpu預計INT在它之後有另外4個字節對於那些數據有某種意義? – user3503828 2014-09-04 08:28:03

+0

這又取決於架構,但通常不是爲了「暗示」的原因,但在上面發佈的情況下,如果您不遵守規則,則會出現「地址未對齊」的錯誤。爲了達到一定程度的性能並確保緩存功能與其他體系結構差異之間的一致性,必須滿足這些限制條件。這可能是強制性的。 – 2014-09-04 08:31:47

+0

我想我明白了。感謝您的幫助,非常感謝。 – user3503828 2014-09-04 08:36:05

5

當x86 CPU讀取一個double時,它會在一個週期中讀取8個字節。當它讀取一個SSE向量時,它讀取16個字節。當讀取一個AVX矢量,它讀取32.

當CPU從存儲器的高速緩存行,它也讀出至少 32字節。

你假設CPU每個週期讀取4個字節是錯誤的。

+0

恐怕我沒有說清楚。從內存中讀取的內容只是一個例子。但讓我們來談談你的例子。要麼讀取8個字節,要麼讀取16個或32個,所有這些數據應該在個別邊界上對齊8,16,32。但是由於8,16,32都是4的倍數,所以我對當前CPU的低級理解應該是相同的,例如,如果double爲4,則會在4字節的邊界上對齊。 – user3503828 2014-09-04 08:13:28

+0

@ user3503828:它們也是2的倍數。Y是X倍數的事實並不重要。 – MSalters 2014-09-04 08:18:46