2008-09-23 3 views
13

Ich schreibe etwas Code und versuche, es mit SIMD intrinsics SSE2/3 zu beschleunigen. Mein Code ist so beschaffen, dass ich einige Daten in ein XMM-Register laden und viele Male darauf reagieren muss. Wenn ich den generierten Assembler-Code anschaue, scheint GCC die Daten immer wieder in den Speicher zu schreiben, um etwas anderes in XMM0 und XMM1 neu zu laden. Ich kompiliere für x86-64, also habe ich 15 Register. Warum verwendet GCC nur zwei und was kann ich tun, um mehr zu verwenden? Gibt es irgendeine Möglichkeit, einen Wert in einem Register festzuhalten? Ich habe das Schlüsselwort "register" zu meiner Variablendefinition hinzugefügt, aber der generierte Assemblercode ist identisch.Wie kann GCC dazu gebracht werden, mehr als zwei SIMD-Register zu verwenden, wenn intrinsische Daten verwendet werden?

+0

Ich habe das gleiche Problem, mit ARM. AFAICT, die Syntax, die ich verwende, ist korrekt - sie stimmt mit der in den GCC-Dokumenten angegebenen überein. Allerdings bekomme ich den gleichen Fehler ... Ich frage mich, ob die neuesten GCCs in dieser Hinsicht abgehört werden. –

+0

Ah - tut mir leid - mein Kommentar ist in der Tat in Bezug auf das Problem, das florin in seinem Kommentar zu der Antwort unten beschreibt (die Verwendung von asm ("regname") erzeugt einen Fehler). –

+1

eine häufige Ursache für dieses Verhalten ist nicht die Aktivierung von Optimierungen (-O1, -O2 oder -O3), bei der Verwendung von intrinsics ohne Optimierungen wird es jedes Mal in den Speicher fluten und im Wesentlichen nur 2-3 simd Register verwenden – jtaylor

Antwort

3

Ja, Sie können. Explicit Reg Vars spricht über die Syntax, die Sie benötigen, um eine Variable an ein bestimmtes Register anzuhängen.

+0

Ich versuchte >> Register __m128i v0 asm ("xmm7"); << aber der Compiler mag es nicht >> error: erwartet '=', ',', ';', 'asm' oder '__attribute__' vor 'asm' <<. – florin

+0

Haben Sie # #eingeschlossen? –

2

Wenn Sie zu dem Punkt kommen, wo Sie einzelne Register für jedes intrinsische angeben, können Sie auch einfach das Assembly-Verzeichnis schreiben, besonders angesichts der ekligen Gewohnheit von gcc, in vielen Fällen unnötige Pessimierungen von Intrinsics vorzunehmen.

Verwandte Themen