¿Cuáles son estas instrucciones adicionales de desmontaje cuando se utilizan intrínsecos SIMD?
Estoy probando qué tipo de aceleración puedo obtener al usar las instrucciones SIMD con RyuJIT y veo algunas instrucciones de desmontaje que no espero. Estoy basando el código enesta publicación de blog del equipo Kevin Frei de RyuJIT y una publicación relacionadaaquí. Aquí está la función:
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 sección de desmontaje que estoy consultando copia los valores de la matriz en elVector<float>
. La mayor parte del desensamblaje es similar al de las publicaciones de Kevin y Sasha, pero he resaltado algunas instrucciones adicionales (junto con mis confusas anotaciones) que no aparecen en sus desensamblajes:
;// 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]
Tenga en cuenta que la verificación del rango del bucle es la esperada:
;// for (i = 0; i < a.Length - simdLength; i += simdLength) {
add eax,4
cmp r9d,eax
jg loop
así que no sé por qué hay comparaciones adicionales paraeax
. ¿Alguien puede explicar por qué estoy viendo estas instrucciones adicionales y si es posible deshacerse de ellas?
En caso de que esté relacionado con la configuración del proyecto, tengo un proyecto muy similar que muestra el mismo problemaaquí en github (verFloatSimdProcessor.HwAcceleratedSumInPlace()
oUShortSimdProcessor.HwAcceleratedSumInPlaceUnchecked()
)