Chargement de 8 caractères de la mémoire dans une variable __m256 sous forme de flotteurs compacts à simple précision
Dans les algorithmes de flou gaussien, une optimisation pour une exécution plus rapide peut être obtenue en chargeant efficacement les données dans des registres vectoriels. Une de ces optimisations consiste à remplacer un tableau de flotteurs par une variable __m256. Cet article fournit une solution optimale pour cette tâche, exploitant la puissance des instructions AVX2.
Solution utilisant les instructions AVX2
Pour charger efficacement 8 caractères de la mémoire dans une variable __m256 en utilisant AVX2, les instructions suivantes sont recommandées :
VPMOVZXBD ymm0, [rsi] ; or SX to sign-extend (Byte to DWord) VCVTDQ2PS ymm0, ymm0 ; convert to packed foat
Spécificités des instructions
Optimisation supplémentaire
Pour optimiser davantage ce processus, pensez à utiliser une charge de diffusion pour alimenter l'instruction VPMOVZXBD et une instruction Vpshufb pour les 64 bits élevés. Cette stratégie réduit le nombre global d'uop, améliorant ainsi l'efficacité :
<code class="pseudocode">__m256 b = [float(new_image[x+7]), float(new_image[x+6]), ... , float(new_image[x])]; __m256 b = _mm256_broadcast_ss(&new_image[x]) _mm256_shuffle_epi8(b, _mm256_set1_epi8(0)); // fills upper 64 bits with zeroes _mm256_cvtps_epu32(b); // convert to integers _mm256_cvtepu32_ps(b); // convert back to floats</code>
Évitez les techniques sous-optimales
Considérations 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!