.NET JIT 编译器在什么条件下执行自动矢量化?

Under what conditions does the .NET JIT compiler perform automatic vectorization?

新的 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。"natural" resp 32 位和 64 位代码对齐。所需的更改将影响 CLR 的每个部分,垃圾收集器和 class 预先加载程序。没有关于正在考虑这样一个重大变化的传言。并且没有迹象表明在 CoreCLR 项目中考虑了它,它应该是最明显的目标版本。

如果您想在 System.Numerics.Vectors 中的当前支持之外利用 SIMD,请使用 C++ 编译器,使用 C++/CLI 或 C++/CX 语言扩展进行互操作。