我不明白的是,爲什麼我們必須在大於4個字節的邊界上對齊內存中的數據,因爲所有其他邊界都是4的倍數。假設一個CPU可以在一個週期內讀取4個字節,它基本上不會如果數據大小爲8個字節並且在4字節/ 8字節/ 16字節上對齊,則性能差異等。爲什麼對齊邊界大於4?
回答
第一: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都不是這樣。
可以肯定地說,對齊給cpu提示多少數據從內存中讀取?我的意思是,將INT對齊到8個字節是否可以安全地假設cpu預計INT在它之後有另外4個字節對於那些數據有某種意義? – user3503828 2014-09-04 08:28:03
這又取決於架構,但通常不是爲了「暗示」的原因,但在上面發佈的情況下,如果您不遵守規則,則會出現「地址未對齊」的錯誤。爲了達到一定程度的性能並確保緩存功能與其他體系結構差異之間的一致性,必須滿足這些限制條件。這可能是強制性的。 – 2014-09-04 08:31:47
我想我明白了。感謝您的幫助,非常感謝。 – user3503828 2014-09-04 08:36:05
當x86 CPU讀取一個double
時,它會在一個週期中讀取8個字節。當它讀取一個SSE向量時,它讀取16個字節。當讀取一個AVX矢量,它讀取32.
當CPU從存儲器的高速緩存行,它也讀出至少 32字節。
你假設CPU每個週期讀取4個字節是錯誤的。
恐怕我沒有說清楚。從內存中讀取的內容只是一個例子。但讓我們來談談你的例子。要麼讀取8個字節,要麼讀取16個或32個,所有這些數據應該在個別邊界上對齊8,16,32。但是由於8,16,32都是4的倍數,所以我對當前CPU的低級理解應該是相同的,例如,如果double爲4,則會在4字節的邊界上對齊。 – user3503828 2014-09-04 08:13:28
@ user3503828:它們也是2的倍數。Y是X倍數的事實並不重要。 – MSalters 2014-09-04 08:18:46
- 1. 爲什麼雙對齊到8字節邊界,而不是4個字節
- 2. 爲什麼div邊距不對齊?
- 3. 如何將C結構與4字節邊界對齊?
- 4. bootstrap 4對齊div的行和頂部邊界
- 5. 如何在4字節邊界對齊掃描線
- 6. 爲什麼我的網格頁腳未與我的底部邊界對齊
- 7. 什麼規則適用於MIME邊界?
- 8. 軸對齊邊界框vs邊界橢圓
- 9. 如何完美對齊沿着左右邊界線邊界
- 10. *邊界框內的文本對齊*
- 11. 8字節邊界對齊雙打?
- 12. NASM彙編字節邊界對齊
- 13. 爲什麼不設置UIView的邊界限制其大小
- 14. iPad uiviewcontroller - 爲什麼是邊界和框架不同的大小?
- 15. 這個邊界爲什麼會出現?
- 16. 邊界半徑 - 不光滑......爲什麼?
- 17. 爲什麼沒有這個邊界?
- 18. 爲什麼邊界值不叫厚度?
- 19. 爲什麼mandelbrot的邊界是2?
- 20. 爲什麼Firemonkey TMemo無邊界
- 21. CSS - 爲什麼邊界不工作?
- 22. 爲什麼搜索結果不僅限於邊界框?
- 23. 爲什麼QFontMetrics :: lineSpacing()小於字符邊界框的高度?
- 24. AppleScript - 什麼是邊界?
- 25. 什麼是消息邊界?
- 26. 什麼意思錯誤:...在Xcode/Clang中的「字節到對齊邊界」?
- 27. 窗體不在圖像旁邊對齊,爲什麼不呢?
- 28. 爲什麼下拉菜單對齊左邊?
- 29. 爲什麼高效訪問需要內存對齊4?
- 30. 爲什麼這個邊界對象不能被擴展?
你指的是什麼CPU /架構? – 2014-09-04 08:03:55
爲什麼你認爲CPU在一個週期中讀取4個字節? – jalf 2014-09-04 08:04:02
爲什麼對齊邊界大於1? ;-)如果你能回答這個問題,那麼你可以回答你自己的問題。 – 2014-09-04 08:04:42