JitIntrinsicAttribute如何影响代码生成?

时间:2014-11-13 07:58:30

标签: c# .net mono clr intrinsics

我正在浏览.NET源代码并看到this attribute。它说,

  

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

的属性

并根据MSDN

  

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

但是我很难找到如何。在什么样的代码上执行特殊的代码生成?

我的主要猜测是它主要使用像SIMD这样的处理器指令,类似于Java JIT does。这是an example。我对它的加速感到好奇,我想知道Mono是否也这样做了。

2 个答案:

答案 0 :(得分:15)

这特定于RyuJIT,这是微软目前正在开发的下一代64位抖动。仍然在alpha(又名CTP)中,下一版本的.NET和Visual Studio将被包含在内。目前可在.NET 4.6 Preview中使用。

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支持,它似乎得到了stuck 5 years ago。 .NET Core最近刚刚宣布使用非常自由的MIT许可证开源,我假设(但不知道一个事实)这将包括RyuJIT的源代码。 github项目现在正在进行中并且非常不完整。


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

答案 1 :(得分:2)

2018年更新:显然,[JitIntrinsic]并未用于其预期目的,而是由System.Runtime.CompilerServices.IntrinsicAttribute代替。

在有关移动Vector classes to the CoreLib的讨论中提到了该属性:

  

@jkotas:我们不需要JitIntrinsicAttribute。据我所知,该属性是面向未来的证明,从未用于任何实际用途。我们应该删除它,而改用CoreLib的IntrinsicAttribute。

,后来替换为IntrinsicReplace JitIntrinsicAttribute with IntrinsicAttribute

请参见What does the [Intrinsic] attribute in C# do?,以了解有关[Intrinsic]特技的类似讨论,该讨论实际上用于实现低级优化。