"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 carregar 8 caracteres em uma variável __m256 como flutuadores de precisão única compactados?

Como carregar 8 caracteres em uma variável __m256 como flutuadores de precisão única compactados?

Publicado em 2024-11-06
Navegar:143

How to Load 8 Chars into an __m256 Variable as Packed Single Precision Floats?

Carregando 8 caracteres da memória em uma variável __m256 como flutuadores de precisão única compactados

Em um esforço para otimizar um algoritmo para desfoque gaussiano, você procure substituir o uso de um buffer flutuante por uma variável intrínseca __m256. Esta questão tem como objetivo determinar as instruções ideais para esta tarefa.

Instruções para arquitetura AVX2:

  • Utilize PMOVZX para estender seus caracteres para zero em 32 bits inteiros em um registro 256b.
  • Converta para flutuar no local com VCVTDQ2PS.
; rsi = new_image
VPMOVZXBD   ymm0,  [rsi]   ; or SX to sign-extend  (Byte to DWord)
VCVTDQ2PS   ymm0, ymm0     ; convert to packed foat

Estratégias adicionais:

  • Considere usar uma carga de transmissão de 128 bits para alimentar vpmovzxbd ymm,xmm e vpshufb ymm (_mm256_shuffle_epi8) para o alto 64 bits. Essa abordagem reduz a contagem de UOP e pode ser benéfica em CPUs Ryzen.
  • Evite usar instruções extras de embaralhamento, pois elas podem se tornar um gargalo quando o embaralhamento já for uma limitação.

Instruções para arquitetura AVX1:

  • Execute as seguintes etapas:

    VPMOVZXBD   xmm0,  [rsi]
    VPMOVZXBD   xmm1,  [rsi 4]
    VINSERTF128 ymm0, ymm0, xmm1, 1   ; put the 2nd load of data into the high128 of ymm0
    VCVTDQ2PS   ymm0, ymm0     ; convert to packed float

Considerações intrínsecas:

  • GCC e MSVC podem exigir tratamento especial para garantir a geração de código ideal ao usar intrínsecos para VPMOVZXBD ymm,[mem].
  • Considere usar o intrínseco _mm_loadl_epi64, que pode ser dobrado no operando de memória para um conjunto ideal em -O3 com GCC nas versões 9 e posteriores do GCC.
  • Para Otimização apenas AVX1, escrever a versão intrínseca é um exercício nada divertido.
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