Optimización de __mm_add_epi32_inplace_purego mediante ensamblaje
Esta pregunta busca optimizar el bucle interno de la función __mm_add_epi32_inplace_purego, que realiza un recuento de población posicional en una matriz de bytes. El objetivo es mejorar el rendimiento mediante la utilización de instrucciones de ensamblaje.
La implementación original de Go del bucle interno:
__mm_add_epi32_inplace_purego(&counts[i], expand)
El el uso de '&counts[i]' para pasar la dirección de un elemento de matriz puede resultar ineficiente. Para optimizar esto, podemos pasar el puntero a toda la matriz:
__mm_add_epi32_inplace_inplace_purego(counts, expand)
Esta modificación reduce la sobrecarga asociada con pasar matrices como argumentos.
Además, el bucle interior se puede optimizar aún más siguiendo las instrucciones de montaje. El siguiente código ensamblador es una versión de __mm_add_epi32_inplace_purego implementada en ensamblador:
// func __mm_add_epi32_inplace_asm(counts *[8]int32, expand *[8]int32) TEXT ·__mm_add_epi32_inplace_asm(SB),NOSPLIT,$0-16 MOVQ counts 0(FP), DI MOVQ expand 8(FP), SI MOVL 8*0(DI), AX // load counts[0] ADDL 8*0(SI), AX // add expand[0] MOVL AX, 8*0(DI) // store result in counts[0] MOVL 8*1(DI), AX // load counts[1] ADDL 8*1(SI), AX // add expand[1] MOVL AX, 8*1(DI) // store result in counts[1] MOVL 8*2(DI), AX // load counts[2] ADDL 8*2(SI), AX // add expand[2] MOVL AX, 8*2(DI) // store result in counts[2] MOVL 8*3(DI), AX // load counts[3] ADDL 8*3(SI), AX // add expand[3] MOVL AX, 8*3(DI) // store result in counts[3] MOVL 8*4(DI), AX // load counts[4] ADDL 8*4(SI), AX // add expand[4] MOVL AX, 8*4(DI) // store result in counts[4] MOVL 8*5(DI), AX // load counts[5] ADDL 8*5(SI), AX // add expand[5] MOVL AX, 8*5(DI) // store result in counts[5] MOVL 8*6(DI), AX // load counts[6] ADDL 8*6(SI), AX // add expand[6] MOVL AX, 8*6(DI) // store result in counts[6] MOVL 8*7(DI), AX // load counts[7] ADDL 8*7(SI), AX // add expand[7] MOVL AX, 8*7(DI) // store result in counts[7] RET
Este código ensamblador carga los elementos de 'counts' y 'expand' en registros, realiza la suma y almacena el resultado nuevamente en 'counts'. Al evitar la necesidad de pasar matrices como argumentos y utilizar instrucciones de ensamblaje eficientes, este código mejora significativamente el rendimiento del bucle interno.
En resumen, al pasar el puntero a la matriz en lugar de la dirección de un elemento y al implementar el bucle interno en el ensamblaje, la función __mm_add_epi32_inplace_purego se puede optimizar para lograr un mejor rendimiento en operaciones de conteo de población posicional.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3