imprimer un __m128i variable
Je suis en train d'apprendre à coder à l'aide de intrinsèques et ci-dessous est un code qui n'est plus
compiler used: icc
#include<stdio.h>
#include<emmintrin.h>
int main()
{
__m128i a = _mm_set_epi32(1,2,3,4);
__m128i b = _mm_set_epi32(1,2,3,4);
__m128i c;
c = _mm_add_epi32(a,b);
printf("%d\n",c[2]);
return 0;
}
J'obtiens l'erreur ci-dessous:
test.c(9): error: expression must have pointer-to-object type
printf("%d\n",c[2]);
Comment puis-je imprimer les valeurs de la variable c
qui est de type __m128i
Notez également que
lié au titre: comment faire pour imprimer __uint128_t nombre à l'aide de gcc?
Notez que certains compilateurs ont intégré dans les printf de soutien pour SIMD types, par exemple d'Apple versions de gcc, clang, etc, tout le soutien
Je suis en utilisant le compilateur intel
Est il possible de le faire masqués de plus. Dire que j'aimerais stocker uniquement l'autre des éléments (c[0],c[2])?
__m128i
n'a aucune info sur le type qui est stockée. Il pourrait être de 8 bits entiers, 16 bits entiers, 32-bit, etc... Certains compilateurs soutenir le .m128i_i32
terrain extensions. Mais ce n'est certainement pas la norme et non pas dans GCC.lié au titre: comment faire pour imprimer __uint128_t nombre à l'aide de gcc?
Notez que certains compilateurs ont intégré dans les printf de soutien pour SIMD types, par exemple d'Apple versions de gcc, clang, etc, tout le soutien
%vld
pour l'impression d'un __m128i
4 x 32 bits entiers.Je suis en utilisant le compilateur intel
Est il possible de le faire masqués de plus. Dire que j'aimerais stocker uniquement l'autre des éléments (c[0],c[2])?
OriginalL'auteur arunmoezhi | 2012-11-06
Vous devez vous connecter pour publier un commentaire.
Utilisez cette fonction pour imprimer:
Vous split 128bits en 16 bits(ou 32-bits) avant de les imprimer.
C'est une façon de 64 bits du fractionnement et de l'impression si vous avez 64-bit support disponible:
llx
aveclld
si tu veux int.elle fonctionne. J'ai utilisé uint32_t pour imprimer les nombres entiers de 32 bits. Mais la sortie est inversée. Au lieu de
2,4,6,8
- je obtenir8,6,4,2
. Ne_mm_add_epi32
stocker les valeurs dans l'ordre inverse?Avez-vous lu Endian-ness?
Est ce pointeur aliasing juridique?
Probablement pas. Un
_mm_extract_epi32
, ou à une banque locale tableau sont de plus normal. Vous pouvez également affecter ununion
d'un__m128i
et un tableau. C'est très bien pour le test / debug-imprime si il arrive à travailler lorsque vous essayez-le. Un débogueur va vous montrer ce qui est dans votre vecteurs plus facilement que debug-estampes, cependant.OriginalL'auteur
_mm_setr_epiX
). Inverser les indices de tableau, si vous préférez impression dans le même ordre d'Intel manuels d'utilisation, où l'élément le plus significatif est sur la gauche (comme_mm_set_epiX
). Connexes: Convention pour l'affichage des registres vectorielsÀ l'aide d'un
__m128i*
à charger à partir d'un tableau deint
est sûr parce que la__m128
types sont définis pour permettre le repliement. (par exemple, dans le ccag-têtes, la définition inclut les__attribute__((may_alias))
.)L'inverse n'est pas coffre-fort (une
__m128i
objet et unint
pointeur). Il peut arriver de travailler dans la plupart des cas, mais pourquoi prendre le risque?(uint32_t*) &my_vector
viole le C et le C++ aliasing règles, et n'est pas garanti pour fonctionner de la façon que vous attendez. Le stockage à un tableau et ensuite l'accès, il est garanti d'être en sécurité. Même optimise loin avec la plupart des compilateurs, de sorte que vous obtenezmovq
/pextrq
directement à partir de xmm entier registres au lieu d'une réelle magasin/recharger, par exemple.Source + asm sortie sur le Godbolt compilateur explorer: la preuve il compile avec MSVC et ainsi de suite.
Si vous avez besoin de portabilité de C99 ou C++03 ou plus tôt (c'est à dire sans C11 /C++11), retirez la
alignas()
et l'utilisationstoreu
au lieu destore
. Ou utiliser__attribute__((aligned(16)))
ou__declspec( align(16) )
à la place.(Si vous écrivez du code avec intrinsèques, vous devriez être en utilisant une récente version de compilateur. Nouveaux compilateurs font généralement mieux asm que les anciens compilateurs, y compris pour les SSE/AVX intrinsèques. Mais peut-être que vous voulez utiliser gcc-6.3 avec
-std=gnu++03
C++03 mode pour une base de code qui n'est pas prêt pour le C++11 ou quelque chose.)Exemple de sortie de l'appel de tous les 4 fonctions sur
Ajuster le format des chaînes si vous voulez pad avec les zéros non significatifs pour la cohérence des résultats de la largeur. Voir
printf(3)
.OriginalL'auteur
Je sais que cette question est marqué C, mais c'était le meilleur résultat de la recherche aussi lors de la recherche du C++ solution au même problème.
Donc, cela pourrait être une implémentation C++:
Utilisation:
Résultat:
Remarque: il existe un moyen simple pour éviter les
if (size(T)==1)
, voir https://stackoverflow.com/a/28414758/2436175alignas(16) T values[16/sizeof(T)];
et_mm_storeu_si128( (__m128i*)values, var);
Tout le reste du code qui fonctionne très bien ensuite. Et simplifie, car vous pouvez utiliser une fourchette commefor(T v : values)
, je pense.Je vois votre point de vue. Je me demande si on pourrait simplement utiliser un memcpy au lieu de cela, que serait épargner la nécessité d'avoir une alignée de la mémoire tampon.
Voir ma réponse. Utilisation
storeu
au lieu destore
si vous n'avez pas de C++11 pouralignas
, ou le compilateur directives spécifiques. Il sera probablement encore optimiser loin. (Et BTW, moderne Windows / Linux déjà alignez la pile par 16B, de sorte qu'il ne coûte pas le compilateur rien à aligner le tampon, s'il ne fait stocker/reload.)Pourtant, n'est-ce pas memcpy une alternative valable?
Ouais, c'est seulement un problème de performances si vous ne l'utilisez avec un pas une puissance de 2 classe, pas
uint*_t
. Il est logique de le maintenir comme tel pour des raisons de lisibilité. (Surtout depuis qu'il n'y a rien à hautes performances sur l'utilisation destd::string
et une chaîne de stream pour imprimer un vecteur.) Si vous avez été de mettre cela dans une bibliothèque pour les personnes à utiliser sans le regarder, au lieu d'une SORTE de réponse, vous auriez du faire des choix différents.OriginalL'auteur
Essayer ce code.
Je suis sûr que c'est pas strictement juridique (sauf si vous utilisez
-fno-strict-aliasing
ou quelque chose). J'ai posté une réponse qui est sûr.OriginalL'auteur