新的 RyuJIT 编译器是否生成矢量 (SIMD) CPU 指令?何时生成?
旁注:System.Numerics 命名空间包含允许显式使用 Vector 操作的类型,这些操作可能会也可能不会生成 SIMD 指令,具体取决于 CPU、CLR 版本、JITer 版本,无论是否直接编译为 native 代码。这个问题具体涉及非向量代码(例如 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 语言扩展进行互操作。
关于.net - .NET JIT编译器在什么条件下执行自动矢量化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35525556/