2016-07-14 5 views
0

Ich portiere einen Code, der stark von SSE4-Intrinsics Gebrauch macht. Es hat eine Nicht-SSE-Implementierung, aber ich möchte, dass CPUs mit nur SSE2 immer noch in der Lage sind, die schnelleren Funktionen zu verwenden.Gibt es eine SSE2-Entsprechung für _mm_insert_epi32?

Könnte jemand einen effizienten Ersatz für _mm_insert_epi32 vorschlagen - ich glaube, ich habe alles andere bereits abgedeckt ... In der Tat, die zweite und die dritte Argumente der Funktion sind Nullen in meinem Fall:

foo = _mm_insert_epi32(vec, 0, 0); 

Antwort

2

Sie wollen also eigentlich das niedrige Element eines Vektors auf Null setzen? Das ist ein schlechter Anwendungsfall für _mm_insert_epi32. Es sind 2 Ups auf Intel-CPUs, von denen eine den Shuffle-Port benötigt.

Sowohl Ihre SSE4.1- und SSE2-Versionen verwenden

foo = _mm_and_si128(vec, _mm_set_epi32(-1,-1,-1, 0)); // mask off the low element 

, Alternativ movss von einem auf Null gesetzten Vektor verwenden, aber dies könnte eine Bypass-Verzögerung für die Verwendung eines FP Shuffle zwischen zwei Integer-Befehle verursachen . Es gibt eine nervige Menge an Casting in der C-intrinsics-Version, also ist es einfacher zu lesen als asm.

# vec in xmm0 
pxor xmm1, xmm1 ; _mm_setzero_si128() 
movss xmm0, xmm1 ; zero the low 32 bits of xmm0 

2x _mm_insert_epi16 ist mit ziemlicher Sicherheit nicht der beste Weg, dies zu tun, auch wenn Sie ein anderes Element als das niedrige Element mit variablem Inhalt ersetzen wollte. Es ist eine 2-UOP-Anweisung, aber in vielen Fällen können Sie die Arbeit mit weniger als 4 UPs erledigen.

Für variable Inhalte wäre es wahrscheinlich besser, _mm_cvtsi32_si128 (movd) zu verwenden und zwei Vektoren zusammen zu mischen. Die Entpackungsanweisungen sind praktisch, um Daten von zwei Registern zu kombinieren, und das ist shufps (ja, Sie können es für ganzzahlige Daten verwenden).

Sie können auch vec mischen, so dass das zu ersetzende Element das niedrige Element ist, und dann durch movss (oder AND/OR) ersetzen.

Vielleicht 2x pinsrw ist nicht schrecklich für den allgemeinen Fall, aber die meisten spezifischen Fälle sollten Sie mit etwas besser kommen lassen. Unter http://agner.org/optimize/ und dem Tag-Wiki finden Sie weitere Ressourcen, die Ihnen beim Schreiben von effizientem Code helfen.

Verwandte Themen