RyuJIT没有充分利用SIMD内在函数

我正在运行一些使用System.Numerics.Vector C#代码,但据我所知,我没有得到SIMD内在函数的全部好处。 我正在使用Visual Studio Community 2015和Update 1,而我的clrjit.dll是v4.6.1063.1。

我正在使用英特尔酷睿i5-3337U处理器 ,它实现了AVX指令集扩展。 因此,我认为,我应该能够在256位寄存器上执行大多数SIMD指令。 例如,反汇编应该包含像vmovupsvmovupdvaddups等的指令,以及Vector.Count应该返回8, Vector.Count应该是4等等……但那不是我的意思我看到了。

相反,我的反汇编包含诸如movupsmovupdaddups等指令……以及以下代码:

 WriteLine($"{Vector.Count} bytes per operation"); WriteLine($"{Vector.Count} floats per operation"); WriteLine($"{Vector.Count} ints per operation"); WriteLine($"{Vector.Count} doubles per operation"); 

生产:

 16 bytes per operation 4 floats per operation 4 ints per operation 2 doubles per operation 

我哪里错了? 要查看所有项目设置等,可在此处获得该项目。

你的处理器有点陈旧,它的微架构是Ivy Bridge。 Sandy Bridge的“tock”,function缩小,没有架构变化。 您的克星是RyuJIT中的一些代码, 位于ee_il_dll.cpp ,CILJit :: getMaxIntrinsicSIMDVectorLength()函数中:

 if (((cpuCompileFlags & CORJIT_FLG_PREJIT) == 0) && ((cpuCompileFlags & CORJIT_FLG_FEATURE_SIMD) != 0) && ((cpuCompileFlags & CORJIT_FLG_USE_AVX2) != 0)) { static ConfigDWORD fEnableAVX; if (fEnableAVX.val(CLRConfig::EXTERNAL_EnableAVX) != 0) { return 32; } } 

注意使用CORJIT_FLG_USE_AVX2。 您的处理器尚不支持AVX2,该扩展程序在Haswell中可用。 继Ivy Bridge之后的下一个微架构,一个“嘀嗒”。 非常好的处理器btw,像这样的发现有一个主要的令人惊叹的因素。

没什么可以做的,但去购物。 为了获得灵感,您可以查看它在本文中生成的代码类型。

Interesting Posts