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
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
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!
Déclaration: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