Envoyé par
ToTo13
Questions :
- 1 - Est ce que quelqu'un pourrait m'expliquer comment fonctionne les opérations _mm_shuffle_epi* ?
https://software.intel.com/sites/lan..._1&expand=4743
Le masque est obscure, mais pour cet exemple :
maxval = _mm_max_ps(maxval, _mm_shuffle_ps(maxval, maxval, 0x93));
0x93 : 10 01 00 11 -> srcB[2] srcB[1] srcA[0] srcA[3]; ici srcA = srcB = maxval.
tmp[0] = maxval[3];
tmp[1] = maxval[0];
tmp[2] = maxval[1];
tmp[3] = maxval[2];
maxval = tmp;
Ça permet de réorganiser les éléments dans un vecteur.
L'idée ici c'est de calculer le min / max (verticalement) entre 2 "rotations" du même vecteur, pour arriver à un résultat type :
v = [0, 1, 2, 3]
vMin = [0, 0, 0, 0]
vMax = [3, 3, 3, 3]
Envoyé par
ToTo13
- 2 - Quelle est la méthode la plus rapide pour extraire le plus grand/petit byte d'un __m128i ?
Aucune idée, mais si tu as besoin de faire des opérations horizontales au milieu de ton algo (ou pire, au milieu d'une boucle), généralement c'est mauvais signe (mauvaise approche).
Si c'est à la fin pour regrouper les 4/8/16 éléments sur lesquels tu travaillais en parallèle, alors c'est souvent négligeable (ça ne représente qu'une petite partie du traitement).
Partager