新的 RyuJIT 编译器是否生成矢量 (SIMD) CPU 指令,何时生成?
旁注:System.Numerics 命名空间包含允许显式使用 Vector 操作的类型,这些操作可能会或可能不会生成 SIMD 指令,具体取决于 CPU、CLR 版本、JITer 版本,是否直接编译为本机代码。这个问题特别是关于非向量代码(例如在 C# 或 F# 中)何时会产生 SIMD 指令。
新的 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 语言扩展进行互操作。