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.
RyuJIT ist Open Source auf GitHub, also können Sie seinen Code überprüfen und direkt mit den Entwicklern diskutieren. –