Ich prüfe, welche Art von Beschleunigung ich von der Verwendung von SIMD-Anweisungen mit RyuJIT bekommen kann und ich sehe einige Disassemblierungsanweisungen, die ich nicht erwarte. Ich stütze den Code auf this blog post von Kevin Frei des RyuJIT-Teams und einen verwandten Posten here. Hier ist die Funktion:Was sind diese zusätzlichen Demontageanweisungen bei der Verwendung von SIMD-Eigen- schaften?
static void AddPointwiseSimd(float[] a, float[] b) {
int simdLength = Vector<float>.Count;
int i = 0;
for (i = 0; i < a.Length - simdLength; i += simdLength) {
Vector<float> va = new Vector<float>(a, i);
Vector<float> vb = new Vector<float>(b, i);
va += vb;
va.CopyTo(a, i);
}
}
Der Abschnitt der Demontage bin ich kopiert die Array-Werte in die Vector<float>
abfragt. Die meisten der Demontage ist ähnlich dem in Kevin und Sasha Beiträge, aber ich habe einige zusätzliche Anweisungen hervorgehoben (zusammen mit meinem verwirrten Anmerkungen), die in ihrer Demontagen nicht erscheinen:
;// Vector<float> va = new Vector<float>(a, i);
cmp eax,r8d ; <-- Unexpected - Compare a.Length to i?
jae 00007FFB17DB6D5F ; <-- Unexpected - Jump to range check failure
lea r10d,[rax+3]
cmp r10d,r8d
jae 00007FFB17DB6D5F
mov r11,rcx ; <-- Unexpected - Extra register copy?
movups xmm0,xmmword ptr [r11+rax*4+10h ]
;// Vector<float> vb = new Vector<float>(b, i);
cmp eax,r9d ; <-- Unexpected - Compare b.Length to i?
jae 00007FFB17DB6D5F ; <-- Unexpected - Jump to range check failure
cmp r10d,r9d
jae 00007FFB17DB6D5F
movups xmm1,xmmword ptr [rdx+rax*4+10h]
Hinweis der Schleifenbereichsprüfung wie erwartet:
;// for (i = 0; i < a.Length - simdLength; i += simdLength) {
add eax,4
cmp r9d,eax
jg loop
, damit ich weiß nicht, warum es gibt zusätzliche Vergleiche zu eax
. Kann jemand erklären, warum ich diese zusätzlichen Anweisungen sehe und ob es möglich ist, sie loszuwerden.
Im Fall ist es im Zusammenhang mit den Projekteinstellungen ich ein sehr ähnliches Projekt habe, das das gleiche Problem zeigt here on github (siehe FloatSimdProcessor.HwAcceleratedSumInPlace()
oder UShortSimdProcessor.HwAcceleratedSumInPlaceUnchecked()
).