"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment charger 8 caractères dans une variable __m256 en tant que flotteurs de précision unique emballés ?

Comment charger 8 caractères dans une variable __m256 en tant que flotteurs de précision unique emballés ?

Publié le 2024-11-06
Parcourir:759

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

Chargement de 8 caractères de la mémoire dans une variable __m256 sous forme de flotteurs compacts à simple précision

Dans le but d'optimiser un algorithme pour le flou gaussien, vous chercher à remplacer l’utilisation d’un tampon flottant par une variable intrinsèque __m256. Cette question vise à déterminer les instructions optimales pour cette tâche.

Instruction pour l'architecture AVX2 :

  • Utilisez PMOVZX pour étendre à zéro vos caractères en 32 bits. nombres entiers dans un registre 256b.
  • Convertissez en flottant sur place avec VCVTDQ2PS.
; rsi = new_image
VPMOVZXBD   ymm0,  [rsi]   ; or SX to sign-extend  (Byte to DWord)
VCVTDQ2PS   ymm0, ymm0     ; convert to packed foat

Stratégies supplémentaires :

  • Envisagez d'utiliser une charge de diffusion 128 bits pour alimenter vpmovzxbd ymm,xmm et vpshufb ymm (_mm256_shuffle_epi8) pour le haut 64 bits. Cette approche réduit le nombre d'opérations et peut être bénéfique sur les processeurs Ryzen.
  • Évitez d'utiliser des instructions de lecture aléatoire supplémentaires, car elles peuvent devenir un goulot d'étranglement lorsque la lecture aléatoire est déjà une limitation.

Instructions pour l'architecture AVX1 :

  • Effectuez les étapes suivantes :

    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

Considérations sur les intrinsèques :

  • GCC et MSVC peuvent nécessiter un traitement spécial pour garantir une génération de code optimale lors de l'utilisation d'intrinsèques pour VPMOVZXBD ymm,[mem].
  • Envisagez plutôt d'utiliser l'intrinsèque _mm_loadl_epi64, qui peut être intégré dans l'opérande mémoire pour un asm optimal à -O3 avec GCC sur les versions 9 et ultérieures de GCC.
  • Pour Optimisation AVX1 uniquement, l'écriture de la version intrinsèque est un exercice peu amusant.
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3