Dot-Net
.NET JIT 編譯器在什麼條件下執行自動矢量化?
新的 RyuJIT 編譯器是否生成矢量 (SIMD) CPU 指令,何時生成?
旁注:System.Numerics 命名空間包含允許顯式使用 Vector 操作的類型,這些操作可能會或可能不會生成 SIMD 指令,具體取決於 CPU、CLR 版本、JITer 版本,是否直接編譯為本機程式碼。這個問題特別是關於非向量程式碼(例如在 C# 或 F# 中)何時會產生 SIMD 指令。
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 語言擴展進行互操作。