JitIntrinsicAttribute如何影响代码生成?

我浏览.NET源代码并看到了这个属性 。 它说,

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

并根据MSDN :

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

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

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

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

RyuJIT的一个新function是它能够生成SIMD机器代码,利用Intel / AMD处理器中的矢量化指令。 在arrays上进行浮点运算的速度提高了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