gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 07:46:39 27 4
gpt4 key购买 nike

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

我在 Intel Core i5-3337U Processor 上运行,它实现了 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");

产生:

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

我哪里错了?要查看所有项目设置等,该项目可用 here .

最佳答案

您的处理器有点过时,其微架构是 Ivy Bridge。 Sandy Bridge 的“tock”,一个在没有建筑变化的情况下缩小的特征。你的克星是 RyuJIT 中的这段代码,located in 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 之后的下一个微架构,一个“tick”。非常好的处理器顺便说一句,发现像this one有一个主要的哇因素。

除了购物,您别无他法。为了获得灵感,您可以查看它在 this post 中生成的代码类型.

关于c# - RyuJIT 没有充分利用 SIMD 内在函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34897178/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com