Multiplizieren-Subtrahieren in SSE

8

Ich vektorisiere ein Stück Code und irgendwann habe ich folgendes Setup:

%Vor%

Ich packe gerade short s in diese Register, weshalb ich 8 Werte pro Register habe. Was ich tun möchte ist, das i-te Element in b mit dem entsprechenden Wert in a zu subtrahieren, wenn der i-te Wert von b größer als oder gleich dem Wert in a ist (In diesem Beispiel) Fall, a wird mit der Konstante 99 gefüllt). Zu diesem Zweck verwende ich zuerst eine Größer-oder-gleich-Operation zwischen b und a , was für dieses Beispiel ergibt:

%Vor%

Um die Operation abzuschließen, möchte ich die Multiplikation und Subtraktion verwenden, d. h. um in b die Operation b -= a*c zu speichern. Das Ergebnis wäre dann:

%Vor%

Gibt es irgendeine Operation, die so etwas tut? Was ich gefunden habe, waren fusionierte Operationen für Haswell, aber ich arbeite gerade an Sandy-Bridge. Wenn jemand eine bessere Idee dazu hat, lass es mich wissen (z. B. könnte ich eine logische Subtraktion machen: wenn 1 in c , dann subtrahiere ich, sonst nichts.

    
a3mlord 19.06.2015, 16:51
quelle

2 Antworten

3

Sie möchten im Wesentlichen eine SSE-Version dieses Codes, richtig?

%Vor%

Da wir wollen conditionals für die SSE-Version vermeiden, damit wir von dem Steuerablauf wie diese loszuwerden (beachten Sie, dass die Maske invertiert wird):

%Vor%

Ich habe das _mm_cmpgt_epi16 Eigen geprüft und es hat eine schöne Eigenschaft, dass es gibt entweder 0x0000 für falsches oder 0xFFFF für wahr, anstelle einem einzelnen Bits 0 oder 1 (wodurch die Notwendigkeit für die Beseitigung erste Subtraktion). Daher könnte unsere SSE-Version so aussehen.

%Vor%

BEARBEITEN : Harold hat eine viel weniger komplizierte Antwort erwähnt. Die obige Lösung könnte hilfreich sein, wenn Sie die sonst Teil des if / else ändern.

%Vor%

Der SSE-Code wird

sein %Vor%     
hayesti 19.06.2015 17:15
quelle
0

Sie können b in c kopieren, a von c subtrahieren, eine arithmetische Verschiebung um 15 Positionen in den 16-Bit-Werten durchführen, den Wert von c ergänzen, Maske c mit a , und subtrahiere schließlich c von b .

Ich bin nicht vertraut für die intrinsische Syntax, aber die Schritte sind:

%Vor%

Hier ist eine Alternative mit weniger Schritten:

%Vor%     
chqrlie 19.06.2015 17:06
quelle

Tags und Links