2016-02-20 67 views
6

新的RyuJIT編譯器是否曾生成向量(SIMD)CPU指令,以及何時?備註:System.Numerics命名空間包含的類型允許顯式使用Vector操作,這些操作可能會或可能不會生成SIMD指令,具體取決於CPU,CLR版本,JITer版本,無論是否直接編譯爲本機代碼。這個問題是關於什麼時候非向量代碼(例如在C#或F#中)將產生SIMD指令的具體問題。.NET JIT編譯器在什麼條件下執行自動向量化?

回答

8

RuyJIT中的SIMD代碼生成嚴格限於System.Numerics.Vectors命名空間中的類型。通用SIMD支持將要求對CLR進行非常重要的修訂,只有在SIMD變量正確對齊的情況下,此類代碼纔有效。對於SSE2,至少要有16個,要能夠使用AVX2的要有32個,即將推出的AVX-512要有64個。

現在已經很遙遠了,32位CLR只能對齊到4位,64位版本爲8.「32位」和「64位」代碼的「自然」對齊。所需的更改將影響CLR的每個部分,即垃圾收集器和類加載器。關於正在考慮的這樣一個重大變革沒有嗡嗡聲。並沒有跡象表明它在CoreCLR項目中被認爲是最明顯的目標版本。

如果您想在System.Numerics.Vectors的當前支持之外利用SIMD,那麼可以使用C++編譯器,使用C++/CLI或C++/CX語言擴展來互操作。

+0

關於內存對齊,我發現來自Intel的這條評論......「大多數VEX編碼的SIMD數字和數據處理指令的語義與內存操作數具有 寬鬆的內存對齊要求比使用SIMD前綴編碼的指令」[英特爾®64和IA -32體系結構 軟件開發人員手冊](http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-1 -manual.pdf) – redcalx

+2

「只能*高效*」是關鍵短語。未對齊的加載和存儲非常昂貴。 –