Inverser un registre AVX contenant des doubles en utilisant un seul AVX insortingnsèque

Si j’ai un registre AVX contenant 4 doublons et que je souhaite stocker l’inverse de celui-ci dans un autre registre, est-il possible de le faire avec une seule commande insortingnsèque?

Par exemple: si j’avais 4 flotteurs dans un registre SSE, je pourrais utiliser:

_mm_shuffle_ps(A,A,_MM_SHUFFLE(0,1,2,3)); 

Puis-je faire cela en utilisant, peut-être _mm256_permute2f128_pd() ? Je ne pense pas que vous puissiez adresser chaque double individuel en utilisant ce qui est insortingnsèque ci-dessus.

Vous avez en fait besoin de 2 permutes pour faire ceci:

  • _mm256_permute2f128_pd() permute uniquement dans les fragments de 128 bits.
  • _mm256_permute_pd() n’autorise pas les limites de 128 bits.

Donc, vous devez utiliser les deux:

 inline __m256d reverse(__m256d x){ x = _mm256_permute2f128_pd(x,x,1); x = _mm256_permute_pd(x,5); return x; } 

Tester:

 int main(){ __m256d x = _mm256_set_pd(13,12,11,10); cout << x.m256d_f64[0] << " " << x.m256d_f64[1] << " " << x.m256d_f64[2] << " " << x.m256d_f64[3] << endl; x = reverse(x); cout << x.m256d_f64[0] << " " << x.m256d_f64[1] << " " << x.m256d_f64[2] << " " << x.m256d_f64[3] << endl; } 

Sortie:

 10 11 12 13 13 12 11 10 

Avec AVX2: VPERMPD ymm1, ymm2/m256, imm8 fonctionne avec le même débit et la même latence que les autres VPERM2F128 (tels que VPERM2F128 ) sur les processeurs Intel. (Sur AMD Excavator, si ces chiffres sont vperm2f128 , vperm2f128 est plus lent qu’un seul vpermpd ).

FMA est une fonctionnalité distincte de AVX2, mais dans la pratique, il n’existe pas de CPU avec FMA3 mais AVX2. (La famille de bulldozers AMD a 4 opérandes FMA4). Vous devez donc toujours vérifier les bits de fonctionnalité AVX2 et FMA, mais vous n’avez pas à craindre que votre fonction ne soit utilisable sur moins de modèles de CPU.


Donc, si votre code dépend déjà de FMA ou AVX2, utilisez AVX2:

 _mm256_permute4x64_pd(vec, _MM_SHUFFLE(0,1,2,3)); // ie 0b00011011 

Si vous ne dépendez pas déjà de FMA ou d’AVX2, juste d’AVX, et qu’il ne vaut pas la peine de créer une autre version de votre fonction uniquement pour gagner un peu en performance aléatoire, utilisez la solution à deux instructions de Mysticial pour la compatibilité avec SnB / IvB La famille des bulldozers AMD pré-excavasortingce.