Maison > Article > développement back-end > Comment charger 8 caractères de la mémoire dans une variable __m256 : trois approches efficaces
Problème :
Vous souhaitez optimiser un algorithme pour le flou gaussien sur une image en remplaçant un tampon flottant[8] par une variable intrinsèque __m256 pour améliorer les performances.
Solution 1 : Utiliser PMOVZX et VCVTDQ2PS d'AVX2
Ceci L'approche utilise PMOVZX pour étendre les caractères 8 bits en entiers 32 bits, puis les convertit en valeurs à virgule flottante via VCVTDQ2PS. Plus précisément :
VPMOVZXBD ymm0, [rsi] ; Byte to DWord VCVTDQ2PS ymm0, ymm0 ; convert to packed float
Solution 2 : combiner la charge de diffusion et le brassage
Cette stratégie consiste à effectuer une charge de diffusion de 128 bits pour produire un vecteur de contrôle aléatoire de 64 bits. pour vpshufb, permettant une extension nulle et une conversion float compressée. Il offre un débit élevé en éliminant le besoin d'instructions de lecture aléatoire supplémentaires.
VPMOVSXBD xmm0, [rsi] ; Byte to DWord VPMOVSXBD xmm1, [rsi+4] VINSERTF128 ymm0, ymm0, xmm1, 1 VCVTDQ2PS ymm0, ymm0 ; convert to packed float.
Solution 3 : Gestion des limitations d'AVX1
En l'absence d'AVX2, les étapes suivantes peuvent être utilisés :
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.
Remarques supplémentaires :
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!