Sto testando quale tipo di accelerazione posso ottenere usando le istruzioni SIMD con RyuJIT e sto vedendo alcune istruzioni di smontaggio che non mi aspetto. Sto basando il codice su this blog post da Kevin Frei del team RyuJIT e un post correlato here. Ecco la funzione:Quali sono queste istruzioni per lo smontaggio extra quando si utilizzano gli intrinsechi SIMD?
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);
}
}
La sezione di disassemblaggio Sono interrogazione copia i valori di matrice nella Vector<float>
. La maggior parte del smontaggio è simile a quella di Kevin e Sasha dei messaggi, ma ho messo in evidenza alcune istruzioni in più (insieme con i miei annotazioni confuse) che non appaiono nei loro smontaggi:
;// 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]
Nota Il test di ricezione ciclo è come previsto:
;// for (i = 0; i < a.Length - simdLength; i += simdLength) {
add eax,4
cmp r9d,eax
jg loop
quindi non so il motivo per cui non ci sono paragoni extra per eax
. Qualcuno può spiegare perché sto vedendo queste istruzioni extra e se è possibile sbarazzarsi di loro.
Nel caso in cui sia correlato alle impostazioni del progetto, ho un progetto molto simile che mostra lo stesso numero here on github (vedere FloatSimdProcessor.HwAcceleratedSumInPlace()
o UShortSimdProcessor.HwAcceleratedSumInPlaceUnchecked()
).