2012-04-19 43 views
5

Intel's official optimization guide意味着對把從MMX命令SSE其中他們陳述休耕statment一章:其中使用存儲器操作數可能未對齊什麼對準到16字節邊界中的x86

計算指令到一個16字節的邊界必須用一個未對齊的128位加載(MOVDQU)替換,然後用相同的計算操作代替寄存器操作數。

(第5.8章從64位轉換爲128位SIMD整數,第5-43)

我不理解它們的意思是「可以不被對齊到16字節邊界「,請你澄清一下並舉一些例子?

+0

當他們說「可能不對齊」時,它們表示代碼在與未對齊的指針一起使用時是否需要正確工作。即您無法假定輸入始終對齊。 (Jakob的回答涵蓋了地址對齊意味着什麼)。 – 2016-04-07 14:08:36

回答

9

某些SIMD指令對多個數據執行相同的指令要求這些數據的內存地址與特定的字節邊界對齊。這實際上意味着您的數據所在的內存地址需要被指令所需的字節數整除。

所以在你的情況下,對齊是16字節(128位),這意味着你的數據的內存地址需要是16的倍數。 0x00010將是16字節對齊,而0x00011不會。

如何讓您的數據對齊取決於您使用的編程語言(有時是編譯器)。大多數具有內存地址概念的語言也將爲您提供指定對齊方式的方法。

0

在16位邊界上對齊的數據將具有一個偶數的內存地址 - 嚴格來說,是2的倍數。每個字節是8位,因此要在16位邊界上對齊,您需要對齊每個兩個字節的集合。

同樣,在32位邊界對齊的內存將有一個內存地址是4的倍數,因爲您將四個字節組合在一起形成一個32位字。

+2

16字節,而不是16位... – 2012-04-19 08:49:09

+0

當,我的壞。抱歉... – Andrew 2012-04-19 20:38:49

0

我在這裏猜測,但它可能是「可能不對齊到16字節的邊界」意味着此存儲器位置已被對齊到一個較小的值(4或8字節)之前爲了一些其他目的現在要在這個內存上執行SSE指令,你需要明確地將它加載到一個寄存器中?

相關問題