drucken __m128i variable
Ich versuche zu lernen, um code mit Interna und unten ist ein code der nicht neben
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;
}
Bekomme ich die folgende Fehlermeldung:
test.c(9): error: expression must have pointer-to-object type
printf("%d\n",c[2]);
Wie Drucke ich die Werte in der variable c
die den Typ __m128i
InformationsquelleAutor der Frage arunmoezhi | 2012-11-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwendung mit dieser Funktion drucken Sie:
Split 128bits in 16-bit(oder 32-bits), bevor Sie zu drucken.
Dies ist ein Weg, der 64-bit-splitting und drucken, wenn Sie 64-bit-Unterstützung verfügbar:
InformationsquelleAutor der Antwort askmish
_mm_setr_epiX
). Rückseite der array-Indizes, wenn Sie es vorziehen zu drucken in der gleichen Reihenfolge die Intel-Handbücher verwenden, wo das wichtigste element ist auf der linken Seite (wie_mm_set_epiX
). Related: Konvention für die Anzeige von Vektor-RegisterMit einem
__m128i*
laden aus einem array vonint
ist sicher, weil__m128
Typen definiert sind, erlauben aliasing. (z.B. im gcc die Header, die definition umfasst__attribute__((may_alias))
.)Umgekehrter nicht safe (eine
__m128i
- Objekt und einint
Zeiger). Es könnte passieren, funktioniert in den meisten Fällen, aber warum das Risiko eingehen?(uint32_t*) &my_vector
gegen die C-und C++ - aliasing-Regeln, und ist nicht garantiert, um zu arbeiten, wie Sie erwarten würden,. Die Speicherung auf einem lokalen array und dann zugreifen-garantiert sicher sein. Es auch optimiert, Weg mit den meisten Compilern, so erhalten Siemovq
/pextrq
direkt von xmm-zu-integer-Register anstelle eines tatsächlichen speichern/laden, zum Beispiel.Quelle + asm-Ausgabe auf der Godbolt compiler explorer: Beweis es kompiliert mit MSVC und so weiter.
Wenn Sie benötigen Portabilität zu C99 und C++03 oder früher (d.h. ohne C11 /C++11), entfernen Sie die
alignas()
und verwendenstoreu
stattstore
. Oder verwenden Sie__attribute__((aligned(16)))
oder__declspec( align(16) )
statt.(Wenn Sie das schreiben von code mit Interna, die Sie verwenden sollten eine aktuelle compiler-version. Neuere Compiler in der Regel besser asm als bei älteren Compilern, einschließlich der SSE - /AVX-Interna. Aber vielleicht möchten Sie verwenden den gcc-6.3 mit
-std=gnu++03
C++03-Modus für eine Codebasis, die nicht bereit ist für C++11 oder so.)Beispiel für die Ausgabe von Aufruf an alle 4 Funktionen auf
Anpassen der format-strings, wenn Sie wollen pad mit führenden Nullen für die konsistente Ausgabe der Breite. Sehen
printf(3)
.InformationsquelleAutor der Antwort Peter Cordes
Ich weiß, diese Frage ist tagged-C, aber es war das beste Ergebnis der Suche auch bei der Suche nach einem C++ - Lösung für das gleiche problem.
So, das könnte eine C++ Implementierung:
Verwendung:
Ergebnis:
Hinweis: es gibt einen einfachen Weg, um zu vermeiden, die
if (size(T)==1)
finden Sie https://stackoverflow.com/a/28414758/2436175InformationsquelleAutor der Antwort Antonio
Versuchen, diesen code.
InformationsquelleAutor der Antwort Lucien