_mm_shuffle_ps () entspricht für Integer-Vektoren (__m128i)?

8

Der _mm_shuffle_ps() intrinsic erlaubt es, Float-Eingaben in Low-2-Floats und High-2-Floats des Outputs zu verschachteln.

Zum Beispiel:

%Vor%

führt zu:

%Vor%

Ich wollte wissen, ob es einen ähnlichen intrinsischen Datentyp für den Datentyp integer gibt. Etwas, das zwei __m128i Variablen und eine Maske zum Interleaving benötigt?

Die _mm_shuffle_epi32() intrinsisch, nimmt nur einen 128-Bit-Vektor anstelle von zwei.

    
user1715122 31.10.2012, 08:05
quelle

1 Antwort

11

Nein, es gibt keine Ganzzahl, die dem entspricht. Also musst du es entweder emulieren oder betrügen.

Eine Methode besteht darin, _mm_shuffle_epi32() für A und B zu verwenden. Dann maskieren Sie die gewünschten Begriffe und OR sie wieder zusammen.

Das ist chaotisch und hat ungefähr 5 Anweisungen. (Oder 3, wenn Sie die SSE4.1-Blend-Anweisungen verwenden.)

Hier ist die SSE4.1-Lösung mit 3 Anweisungen:

%Vor%

Die Methode, die ich bevorzuge, ist tatsächlich zu betrügen - und Gleitkomma-Shuffle wie folgt:

%Vor%

Dies bedeutet, dass der Datentyp in Gleitkomma umgewandelt wird, damit er die Gleitkommazahl verwenden kann. Dann wandle es zurück.

Beachten Sie, dass diese "Konvertierungen" bitweise Konvertierungen (auch Neuinterpretationen genannt) sind. Es wird keine Konvertierung durchgeführt und sie werden keiner Anweisung zugeordnet. In der Assembly gibt es keinen Unterschied zwischen einem Ganzzahl- oder Gleitkomma-SSE-Register. Diese Cast-Intrinsics sind nur um die Typ-Sicherheit von C / C ++ auferlegt.

Beachten Sie jedoch, dass dieser Ansatz eine zusätzliche Latenz für das Hin- und Herverschieben von Daten zwischen den Integer- und Gleitkomma-SIMD-Ausführungseinheiten mit sich bringt. Also wird es teurer als nur die Shuffle-Anweisung.

    
Mysticial 31.10.2012, 08:18
quelle

Tags und Links