eoi*_*lan 15 c# sse simd avx ryujit
我正在运行一些使用的C#代码,System.Numerics.Vector<T>
但据我所知,我没有得到SIMD内在函数的全部好处.我正在使用Visual Studio Community 2015和Update 1,而我的clrjit.dll是v4.6.1063.1.
我正在使用英特尔酷睿i5-3337U处理器,它实现了AVX指令集扩展.因此,我想,我应该能够在256位寄存器上执行大多数SIMD指令.例如,拆卸中应包含的指令vmovups
,vmovupd
,vaddups
,等...,并且Vector<float>.Count
应该返回8,Vector<double>.Count
应该是4,等等......但是,这不是我所看到的.
相反,我的拆卸包含指令等movups
,movupd
,addups
等...以下代码:
WriteLine($"{Vector<byte>.Count} bytes per operation");
WriteLine($"{Vector<float>.Count} floats per operation");
WriteLine($"{Vector<int>.Count} ints per operation");
WriteLine($"{Vector<double>.Count} doubles per operation");
Run Code Online (Sandbox Code Playgroud)
生产:
16 bytes per operation
4 floats per operation
4 ints per operation
2 doubles per operation
Run Code Online (Sandbox Code Playgroud)
我哪里错了?要查看所有项目设置等,可在此处获得该项目.
Han*_*ant 12
你的处理器有点陈旧,它的微架构是Ivy Bridge.Sandy Bridge的"tock",功能缩小,没有架构变化.你的克星是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;
}
}
Run Code Online (Sandbox Code Playgroud)
注意使用CORJIT_FLG_USE_AVX2.您的处理器尚不支持AVX2,该扩展程序在Haswell中可用.继Ivy Bridge之后的下一个微架构,一个"滴答".非常好的处理器btw,像这样的发现有一个主要的令人惊叹的因素.
没什么可以做的,但去购物.为了获得灵感,您可以查看它在此帖子中生成的代码类型.
归档时间: |
|
查看次数: |
1428 次 |
最近记录: |