Maison > développement back-end > C++ > 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 ?

Patricia Arquette
Libérer: 2024-11-03 13:21:30
original
609 Les gens l'ont consulté

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.
  • Convertir 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
Copier après la connexion

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 high 64 morceaux. 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 opérations suivantes étapes :

    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
    Copier après la connexion

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 des intrinsèques pour VPMOVZXBD ymm,[mem].
  • Pensez à utiliser le _mm_loadl_epi64 intrinsèque à la place, 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 l'optimisation AVX1 uniquement, écrire la version intrinsèque est un exercice peu amusant.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal