2016-01-20 57 views
14

我正在運行一些使用System.Numerics.Vector<T>的C#代碼,但據我所知我沒有得到SIMD內在函數的全部好處。我在Update 1中使用Visual Studio Community 2015,而我的clrjit.dll是v4.6.1063.1。RyuJIT沒有充分利用SIMD內在函數

我在實現AVX指令集擴展的Intel Core i5-3337U Processor上運行。因此,我認爲,我應該能夠在256位寄存器上執行大多數SIMD指令。例如,反彙編應該包含如vmovups,vmovupd,vaddups等的指令,而Vector<float>.Count應該返回8,Vector<double>.Count應該是4等等......但那不是我所看到的。

而不是我的拆卸包含像movupsmovupdaddups,等...和下​​面的代碼指令:

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

+1

RyuJIT是GitHub上的開源代碼,因此您可以檢查其代碼並直接與開發人員討論。 –

回答

11

您的處理器有點過時,它的微架構是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之後的下一個微架構,一個「滴答」。很好的處理器順便說一句,發現像this one有一個主要的哇因素。

你可以做什麼,但要去購物。爲了獲得靈感,您可以查看它在this post中生成的代碼種類。

+0

他實際上也可以嘗試實現AVX支持並提交補丁。並不是說這是一個現實的選擇。或者在那裏打開票 - 也許使用AVX2並不完全是故意的?但通常 - 是的。購物是最好的選擇。 – TomTom