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:
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:
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.
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.
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% 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%Tags und Links c sse vectorization