2013-03-10 41 views
7

AMD64架構程序員手冊第1卷:應用程序編程第226個說關於SSE指令:64 SSE數據類型

處理器不前執行指令檢查指令操作數的數據類型。它只在執行時檢查它們。例如,如果處理器執行的算術指令採用雙精度操作數,但通過 MOVx指令提供單精度操作數,則在執行算術運算之前,處理器將首先將操作數從單精度轉換爲精度的兩倍 ,結果是正確的。但是,所需的轉換可能會導致性能下降。

我不明白這一點;我以爲ymm寄存器只包含256位,每個指令根據其預期的操作數來解釋,這取決於你是否存在正確的類型,並且在所描述的場景中,CPU將全速運行並默默給出錯誤的答案。

我錯過了什麼?

+1

也許他們指的是,如果你使用'movaps'加載雙打,它無論如何都可以實現嗎?按照他們的方式說出來有點奇怪,特別是因爲沒有轉換,但我不明白他們還有什麼意思。 – harold 2013-03-10 16:21:28

回答

1

Intel® 64 and IA-32 Architectures Optimization Reference Manual § 5.1說,關於混合整數/ FP「數據類型」類似(但奇怪的不是單打和雙打)的東西:

當編寫SIMD代碼,整數和浮點數據的工作,使用 SIMD轉換指令或加載/存儲指令的子集來確保XMM寄存器中的輸入操作數包含正確定義的數據類型 以匹配指令。

包含交叉類型用法的代碼序列在不同的實現中產生相同的結果,但會產生顯着的性能損失。使用 SSE/SSE2/SSE3/SSSE3/SSE44.1指令來操作類型不匹配的 XMM寄存器中的SIMD數據是不鼓勵的。

Intel® 64 and IA-32 Architectures Software Developer’s Manual是simularly混亂:

SSE和SSE2擴展限定上鍵入打包和標量浮點數據類型和在128位 SIMD整數數據類型的操作,但IA-32處理器不要在架構級別強制執行此類輸入。他們只有 在微架構級別執行它。

...

Pentium 4和Intel Xeon處理器執行這些指令而不會產生一個無效操作數異常 (#UD),並會產生在寄存器XMM0預期的結果(即,高和低64每個寄存器的位數 將被視爲雙精度浮點值,處理器將相應地對它們進行操作)。

...

在這個例子中:XORPS或PXOR可代替XORPD的使用,併產生相同的正確的結果。但是,由於操作數數據類型和指令數據類型之間的類型不匹配,由於微體系結構級別的指令的實現,會導致延遲懲罰 。

使用錯誤類型的移動指令也可能導致延遲處罰。例如,MOVAPS和MOVAPD都可用於將打包的單精度操作數從存儲器移動到XMM寄存器。但是,如果使用MOVAPD,則使用 時,如果正確類型的指令嘗試使用寄存器中的數據,則會導致延遲懲罰。

請注意,將數據從XMM寄存器移動到內存時不會發生這些延遲懲罰。

我真的不知道這意味着什麼是「他們只在微架構層面強制執行」不同的是它表明了不同的「數據類型」是由μ拱區別對待。我有幾個猜測:

  • 由於缺乏寄存器,AIUI,x86核通常使用register renaming。也許它們在內部使用不同的寄存器來存放整數/單/雙操作數,以便它們可以更靠近相應的矢量單元。
  • 似乎有可能FP編號在內部使用不同的格式表示(例如,使用更大的指數來消除編碼)並且僅在必要時才轉換爲規範位。
  • CPU使用「forwarding」或「繞過」,以便執行單元在被後續指令使用之前不必等待數據寫入寄存器,通常可以節省一個或兩個週期。這可能不會發生在整數和FP單位之間。
+0

根據http://stackoverflow.com/questions/6678073/的答案movdqa-and-movaps-x86-instructions之間的差異,它看起來像這是正確的。 – rwallace 2013-03-14 09:22:50