2016-07-14 5 views
3

Intel's intrinsic guide semble faire une distinction mystérieuse avec des valeurs immédiates. Ils appellent certains comme const et d'autres pas comme const. En pratique, les deux types doivent être compiler des constantes de temps ou le compilateur se plaindra. Je me demande juste pourquoi la distinction? Quelque chose qui me manque?Pourquoi certains éléments intrinsèques d'Intel prennent-ils immédiatement des const, tandis que d'autres sont non-const?

Voici un exemple de ce que intel dit:

_mm_blend_epi16 (__m128i a, __m128i b, const int imm8) 
_mm_srli_si128 (__m128i a, int imm8) 

Répondre

5

Juste vieux trucs d'Intel étant moins bien écrit que leur nouvelles choses, en supposant une amélioration const considérer.

Notez que blend_epi16 est SSE4.1, tandis que srli_si128 est SSE2. Probablement, ils ont décidé de renforcer le point que l'argument doit être une constante à la compilation quand ils ont ajouté des intrinsèques pour SSE4.1.

L'AVX2 intrinsèque pour la version 256 bits utilise const: __m256i _mm256_srli_si256 (__m256i a, const int imm). Cela confirme essentiellement qu'ils n'avaient pas encore pensé à const, puisqu'ils ont commencé à utiliser const pour la même instruction.

Notez également qu'ils étaient si malheureux avec le nom _mm_srli_si128 pour le psrldq instruction qu'ils ont introduit un nouveau nom pour elle: _mm_bsrli_si128 devrait être préféré dans le nouveau code, pour le rend plus il est un octet de décalage, pas un 128bit large bit -décalage. C'est très différent de _mm_srli_epi64. Le manuel de référence de l'instruction ne mentionne malheureusement pas le nom bsrli.


AVX512 intrinsics chargement/stockage utilisera void* au lieu de __m128i*, ce qui est un autre changement agréable. Donc, fondamentalement, Intel fait les choses différemment parce que l'ancienne façon était sous-optimale, et non parce qu'ils le doivent.

+0

Intéressant, d'après mes identifiants erreurs non trouvées, _mm_bsrli_si128 n'est pas disponible dans VS 2015. Cependant, _mm_srli_si128 est disponible. – Thomas

+0

@Volatile: c'est malheureux. [Le guide intrinsèques d'Intel le répertorie] (https://software.intel.com/sites/landingpage/IntrinsicsGuide/#techs=SSE,SSE2,SSE3,SSSE3,SSE4_1,SSE4_2,AVX,AVX2,Other&text=bsrli&expand=552), et gcc/clang le supportent. Peut-être que ce n'est pas vraiment standard. J'aurais aimé que ce soit, parce que c'est évidemment plus clair. C'est vraiment dommage que ce ne soit pas portable pour MSVC. Vous avez inclus le 'fourre-tout' immintrin.h ou 'x86intrin.h', non? –

+0

Oui, j'obtiens l'erreur d'identifiant avec immintrin.h inclus. – Thomas