2016-01-20 19 views
14

Ich benutze einige C# -Code, die System.Numerics.Vector<T> verwendet, aber soweit ich sagen kann, bekomme ich nicht den vollen Vorteil von SIMD intrinsics. Ich verwende Visual Studio Community 2015 mit Update 1, und meine clrjit.dll ist v4.6.1063.1.RyuJIT macht SIMD intrinsics nicht voll aus

Ich bin auf einem Intel Core i5-3337U Processor ausgeführt, der die AVX-Befehlssatzerweiterungen implementiert. Daher sollte es mir möglich sein, die meisten SIMD-Befehle in einem 256-Bit-Register auszuführen. Zum Beispiel sollte die Demontage Anweisungen wie vmovups, vmovupd, vaddups, etc ... enthalten, und Vector<float>.Count sollte 8 zurückgeben, Vector<double>.Count sollte 4 sein, etc ... Aber das ist nicht, was ich sehe.

Statt meine Demontage enthält Anweisungen wie movups, movupd, addups, etc ... und den folgenden Code:

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"); 

Produziert:

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

Wohin gehe ich falsch? Um alle Projekteinstellungen usw. zu sehen, ist das Projekt verfügbar here.

+1

RyuJIT ist Open Source auf GitHub, also können Sie seinen Code überprüfen und direkt mit den Entwicklern diskutieren. –

Antwort

11

Ihr Prozessor ist ein bisschen veraltet, seine Mikroarchitektur ist Ivy Bridge. Das "Tack" von Sandy Bridge, ein Feature ohne architektonische Veränderungen schrumpfen. Ihr Erzfeind ist dieses Stück Code in RyuJIT, located in ee_il_dll.cpp, CILJit :: getMaxIntrinsicSIMDVectorLength() Funktion:

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; 
    } 
} 

Beachten Sie die Verwendung von CORJIT_FLG_USE_AVX2. Ihr Prozessor unterstützt AVX2 noch nicht, diese Erweiterung wurde in Haswell verfügbar. Die nächste Mikroarchitektur nach Ivy Bridge, ein "Tick". Sehr nette Prozessor BTW, Entdeckungen wie this one haben einen großen Wow-Faktor.

Nichts, was Sie dagegen tun können, aber einkaufen gehen. Zur Inspiration können Sie sich die Art von Code ansehen, der in this post generiert wird.

+0

Er kann eigentlich auch versuchen, die AVX-Unterstützung zu implementieren und einen Patch zu senden. Nicht dass dies eine realistische Option ist. Oder öffnen Sie dort ein Ticket - vielleicht war die Verwendung von AVX2 nicht völlig beabsichtigt? Aber generell - ja. Einkaufen ist die beste Option. – TomTom