"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como a função __mm_add_epi32_inplace_purego pode ser otimizada usando instruções de montagem para melhor desempenho em operações de contagem posicional de população?

Como a função __mm_add_epi32_inplace_purego pode ser otimizada usando instruções de montagem para melhor desempenho em operações de contagem posicional de população?

Publicado em 2024-11-06
Navegar:729

How can the __mm_add_epi32_inplace_purego function be optimized using assembly instructions for better performance in positional population counting operations?

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.

Tutorial mais recente Mais>

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