"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo cargar 8 caracteres en una variable __m256 como flotadores de precisión individuales empaquetados?

¿Cómo cargar 8 caracteres en una variable __m256 como flotadores de precisión individuales empaquetados?

Publicado el 2024-11-06
Navegar:479

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

Cargar 8 caracteres de la memoria en una variable __m256 como flotadores de precisión individuales empaquetados

En un esfuerzo por optimizar un algoritmo para el desenfoque gaussiano, busca reemplazar el uso de un búfer flotante con una variable intrínseca __m256. Esta pregunta tiene como objetivo determinar las instrucciones óptimas para esta tarea.

Instrucción para la arquitectura AVX2:

  • Utilice PMOVZX para extender cero sus caracteres a 32 bits enteros en un registro 256b.
  • Convertir a flotante in situ con VCVTDQ2PS.
; rsi = new_image
VPMOVZXBD   ymm0,  [rsi]   ; or SX to sign-extend  (Byte to DWord)
VCVTDQ2PS   ymm0, ymm0     ; convert to packed foat

Estrategias adicionales:

  • Considere usar una carga de transmisión de 128 bits para alimentar vpmovzxbd ymm,xmm y vpshufb ymm (_mm256_shuffle_epi8) para Alto 64 bits. Este enfoque reduce el recuento de UOP y puede ser beneficioso en las CPU Ryzen.
  • Evite el uso de instrucciones de reproducción aleatoria adicionales, ya que pueden convertirse en un cuello de botella cuando la reproducción aleatoria ya es una limitación.

Instrucciones para la arquitectura AVX1:

  • Realice los siguientes pasos:

    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

Consideraciones intrínsecas:

  • GCC y MSVC pueden requerir un manejo especial para garantizar una generación óptima de código cuando se usan intrínsecos para VPMOVZXBD ymm,[mem].
  • Considere usar el intrínseco _mm_loadl_epi64 en su lugar, que se puede plegar en el operando de memoria para un ensamblaje óptimo en -O3 con GCC en las versiones 9 y posteriores de GCC.
  • Para Optimización exclusiva de AVX1; escribir la versión intrínseca no es un ejercicio divertido.
Último tutorial Más>

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