Otimizando __mm_add_epi32_inplace_purego usando Assembly
Esta questão busca otimizar o loop interno da função __mm_add_epi32_inplace_purego, que executa uma contagem de população posicional em uma matriz de bytes. O objetivo é melhorar o desempenho utilizando instruções de montagem.
A implementação Go original do loop interno:
__mm_add_epi32_inplace_purego(&counts[i], expand)
O o uso de '&counts[i]' para passar o endereço de um elemento da matriz pode ser ineficiente. Para otimizar isso, podemos passar o ponteiro para o array inteiro:
__mm_add_epi32_inplace_inplace_purego(counts, expand)
Essa modificação reduz a sobrecarga associada à passagem de arrays como argumentos.
Além disso, o loop interno pode ser otimizado ainda mais usando instruções de montagem. O código assembly a seguir é uma versão de __mm_add_epi32_inplace_purego implementado em assembly:
// 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 assembly carrega os elementos de 'counts' e 'expand' em registros, realiza a adição e armazena o resultado de volta em 'counts'. Ao evitar a necessidade de passar arrays como argumentos e ao usar instruções de montagem eficientes, este código melhora significativamente o desempenho do loop interno.
Em resumo, passando o ponteiro para o array em vez do endereço de um elemento e implementando o loop interno na montagem, a função __mm_add_epi32_inplace_purego pode ser otimizada para obter melhor desempenho em operações posicionais de contagem de população.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3