17 Stimmen

Wie vergleicht man zwei Vektoren mit SIMD und erhält ein einzelnes boolesches Ergebnis?

Ich habe zwei Vektoren mit jeweils 4 Ganzzahlen und möchte einen SIMD-Befehl verwenden, um sie zu vergleichen (z. B. einen Ergebnisvektor zu erzeugen, bei dem jeder Eintrag entsprechend dem Ergebnis des Vergleichs 0 oder 1 ist).

Dann möchte ich den Ergebnisvektor mit einem Vektor aus 4 Nullen vergleichen und nur wenn sie gleich sind, etwas tun.

Wissen Sie, welche SIMD-Befehle ich dafür verwenden kann?

18voto

Paul R Punkte 201623

Zum Vergleich zweier SIMD-Vektoren:

#include <stdint.h>
#include <xmmintrin.h>

int32_t __attribute__ ((aligned(16))) vector1[4] = { 1, 2, 3, 4 };
int32_t __attribute__ ((aligned(16))) vector2[4] = { 1, 2, 2, 2 };
int32_t __attribute__ ((aligned(16))) result[4];

__m128i v1 = _mm_load_si128((__m128i *)vector1);
__m128i v2 = _mm_load_si128((__m128i *)vector2);
__m128i vcmp = _mm_cmpeq_epi32(v1, v2);
_mm_store_si128((__m128i *)result, vcmp);

Notes :

  • die Daten werden als 32-Bit-Ganzzahlen angenommen
  • vector1 , vector2 , result alle müssen auf 16 Byte ausgerichtet sein
  • Das Ergebnis ist -1 für gleich, 0 für nicht gleich ( { -1, -1, 0, 0 } für obiges Code-Beispiel)

UPDATE

Wenn Sie nur ein einziges boolesches Ergebnis für den Fall wünschen, dass alle 4 Elemente übereinstimmen, können Sie dies so tun:

#include <stdint.h>
#include <xmmintrin.h>

int32_t __attribute__ ((aligned(16))) vector1[4] = { 1, 2, 3, 4 };
int32_t __attribute__ ((aligned(16))) vector2[4] = { 1, 2, 2, 2 };

__m128i v1 = _mm_load_si128((__m128i *)vector1);
__m128i v2 = _mm_load_si128((__m128i *)vector2);
__m128i vcmp = _mm_cmpeq_epi32(v1, v2);
uint16_t mask = _mm_movemask_epi8(vcmp);
int result = (mask == 0xffff);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X