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.
obwohl Vorsicht - gcc-spezifische Erweiterungen wie diese mit diesem Code nicht tragbar macht. –
hast du gesehen, welchen Code das generiert? – Aktau