Ich portiere einen SSE-Optimierungscode von Windows nach Linux. Und ich habe festgestellt, dass der folgende Code, der in MSVC gut funktioniert, in GCC nicht funktioniert. Der Code soll ein Array von __m128i initialisieren. Jedes __mi28i enthält 16 int8_t. Es wird mit gcc kompiliert, aber das Ergebnis ist nicht wie erwartet. Da gcc __m128i als "long long int" definiert, initialisiert der Code ein Array wie folgt: long long int coeffs_ssse3 [4] = {64, 83, 64, 36}. Ich googelte und mir wurde gesagt, dass "der einzige portable Weg, um einen Vektor zu initialisieren, _mm_set_XXX intrinsics ist." Ich möchte jedoch wissen, gibt es eine andere Möglichkeit, das Array __m128i zu initialisieren? Statisch besser, und muss den folgenden Code nicht viel ändern (da ich Tonnen von Code im folgenden Format habe). Jeder Vorschlag wird geschätzt.
%Vor% Es scheint, dass gcc
die __m128*
-Typen nicht als Kandidaten für die Aggregat-Initialisierung behandelt. Da sie keine Standardtypen sind, wird dieses Verhalten von Compiler zu Compiler variieren. Ein Ansatz wäre, das Array als ein ausgerichtetes Array von 8-Bit-Ganzzahlen zu deklarieren und dann einfach einen Zeiger darauf zu werfen:
Ich glaube jedoch nicht, dass diese Syntax ( __attribute__((aligned(x)))
) von Visual Studio unterstützt wird. Sie benötigen also #ifdef
trickery, um die richtigen Direktiven zu verwenden, um die von Ihnen gewünschte Ausrichtung zu erreichen Zielplattformen.
Tags und Links gcc initialization sse