我正在浏览.NET源代码并看到this attribute。它说,
可以附加到JIT内在方法/属性
的属性
并根据MSDN:
表示修改后的方法是一个内在值 实时(JIT)编译器可以执行特殊代码生成。这个 class不能被继承。
但是我很难找到如何。在什么样的代码上执行特殊的代码生成?
我的主要猜测是它主要使用像SIMD这样的处理器指令,类似于Java JIT does。这是an example。我对它的加速感到好奇,我想知道Mono是否也这样做了。
答案 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。
,后来替换为Intrinsic
:Replace JitIntrinsicAttribute with IntrinsicAttribute。
请参见What does the [Intrinsic] attribute in C# do?,以了解有关[Intrinsic]
特技的类似讨论,该讨论实际上用于实现低级优化。