JitIntrinsicAttribute 如何影响代码生成

本文关键字:影响 代码生成 何影响 JitIntrinsicAttribute | 更新日期: 2023-09-27 18:30:23

我正在浏览.NET源代码并看到了此属性。它说,

可以附加到 JIT 内部方法/属性的属性

根据MSDN:

指示修改后的方法是一个内部值,其 实时 (JIT) 编译器可以执行特殊代码生成。这 类不能继承。

但我很难找到方法。它在什么样的代码上执行特殊的代码生成?

我的主要猜测是它主要使用像SIMD这样的处理器指令,就像Java JIT一样。下面是一个示例。我对它的加速感到好奇,我想知道 Mono 是否也这样做。

JitIntrinsicAttribute 如何影响代码生成

这是 RyuJIT 特有的,RyuJIT 是 Microsoft 目前正在研究的下一代 64 位抖动。 仍处于alpha版本(又名CTP),下一个版本的.NET和Visual Studio将包含它。 目前在 .NET 4.6 预览版中可用。

RyuJIT 的一项新功能是能够利用英特尔/AMD 处理器中的矢量化指令生成 SIMD 机器代码。 对数组的浮点运算速度提高了 x8 倍。 [JitIntrisic] 属性是 RyuJIT 具有特殊内置知识的 C# 代码的标记,它将生成机器代码的 SIMD 版本,而不是普通的非矢量化版本。

请记住,这与当前 C 和 C++ 编译器可以生成的代码类型相差一百万英里。 RyuJIT只能对它所知道的受膏类型执行此操作。 比如System.Numerics.Vector2。 SIMD 代码对高效有很强的对齐要求,SSE2 指令的对齐要求为 16,AVX 指令的对齐要求为 32。 在 .NET 程序中实现这种对齐将需要对 CLR 进行彻底检修,它目前在 32 位模式下只能对齐到 4,在 64 位模式下只能对齐到 8。

长话短说:你问的方式是抖动。 Mono 一直在修补自己的 SIMD 支持,它似乎在 5 年前就陷入了困境。 .NET Core最近刚刚宣布使用非常自由的MIT许可证开源,我认为(但还不知道事实)这将包括RyuJIT的源代码。 github项目目前正在进行中,非常不完整。


更新:这使其成为.NET 4.6 RTM。 Vector.IsHardwareAccelerated 现在是内部的。 只有 System.Numerics.Vector2、Vector3 和 Vector4 类型才能获得 SIMD 的喜爱。 可以从 Nuget 获取 System.Numerics.Vectors 版本 4.1.0.0。它暴露了更多,包括Vector<T> .

> 2018 年更新:显然,[JitIntrinsic] 没有用于其预期目的,而是被替换为 System.Runtime.CompilerServices.IntrinsicAttribute .

关于将Vector类移动到 CoreLib 的讨论中提到了该属性:

@jkotas:我们不需要 JitIntrinsicAttribute。据我所知,这个属性是面向未来的,从未用于任何真实的东西。我们应该删除它,并使用 CoreLib 中的 IntrinsicAttribute。

后来替换为Intrinsic:将 JitIntrinsicAttribute 替换为 IntrinsicAttribute。

请参阅,C# 中的 [Intrinsic] 属性有什么作用?,以获取有关 [Intrinsic] atrribute 的类似讨论,它实际上用于实现低级优化。