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

标签 .net vectorization simd auto-vectorization ryujit

新的 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/

相关文章:

python - 如何向量化以下python代码?

matlab - 如何找到向量中出现过两次的第一个元素

.net - Prism:EventAggregator 和 MEF - EventAggregator 的 2 个不同实例

c# - 给定一个包含星期几的字符串,返回整数

c++ - 为什么 WPF 不像 WinForms 那样支持 C++.NET?

c - 汇编中 float 的求和数组

java - 是否可以在Java8中执行SIMD比较指令?

.net - 继承,仅使用基类的属性,而不使用派生类的属性

Matlab 矢量化 for 循环(网格取决于循环索引)

c - Websocket 数据揭露/多字节异或