2010-07-29 7 views
13

Ich bin auf der Suche nach der effizientesten Methode des Umdrehens des Zeichens auf allen vier Floats in einem SSE-Register verpackt.Umdrehen Zeichen auf gepackten SSE Schwimmer

Ich habe keine intrinsische dafür im Intel Architecture Software-Entwicklerhandbuch gefunden. Unten sind die Dinge, die ich schon versucht habe.

Für jeden Fall habe ich den Code 10 Milliarden mal durchlaufen und die Wandzeit angezeigt bekommen. Ich versuche, mindestens 4 Sekunden zu erreichen, es dauert mein Nicht-SIMD-Ansatz, der nur den unären Minus-Operator verwendet.


[48 sec]
_mm_sub_ps(_mm_setzero_ps(), vec);


[32 sec]
_mm_mul_ps(_mm_set1_ps(-1.0f), vec);


[9 sec]

union NegativeMask { 
    int intRep; 
    float fltRep; 
} negMask; 
negMask.intRep = 0x80000000; 

_mm_xor_ps(_mm_set1_ps(negMask.fltRep), vec); 


Der Compiler ist gcc 4.2 mit -O3 . Die CPU ist ein Intel Core 2 Duo.

Antwort

4

Sie Ihre eigene Antwort der gcc Dokumentation zu diesen eingebauten Vektoren zu vervollständigen:

The types defined in this manner can be used with a subset of normal C 
operations. Currently, GCC will allow using the following operators on 
these types: `+, -, *, /, unary minus, ^, |, &, ~'. 

Es ist wahrscheinlich eine gute Idee, diese immer zu bleiben, wenn möglich. Mit sehr hohen Chancen bietet gcc immer den effizientesten Code für dieses SSE-Zeug.

Fügen Sie für Ihre Compileroptionen etwas spezifischer zu Ihrer Architektur hinzu, etwas wie -march=native wird in den meisten Fällen tun.

2

Eine Lektion fürs Leben über Codierung bis 3 Uhr morgens .....

Ich habe nie versucht Vektor nur mit dem unären Minus auf meinem verpackt. Das kompiliert tatsächlich und hat die gleiche Leistung wie der Nicht-SIMD-Ansatz.

+5

obwohl Vorsicht - gcc-spezifische Erweiterungen wie diese mit diesem Code nicht tragbar macht. –

+0

hast du gesehen, welchen Code das generiert? – Aktau

21

Das ist die Vereinigung nicht wirklich nötig, am besten aller Welten (Lesbarkeit, Schnelligkeit und Portabilität):

_mm_xor_ps(vec, _mm_set1_ps(-0.f))