Wie viel Beschleunigung durch die Umwandlung von 3D-Mathematik in SSE oder andere SIMD?

9

Ich verwende 3D-Mathematik in meiner Anwendung ausgiebig. Wie viel Beschleunigung kann ich erreichen, indem ich meine Vektor / Matrix-Bibliothek in SSE, AltiVec oder einen ähnlichen SIMD-Code umwandle?

    
Suma 22.09.2008, 14:55
quelle

7 Antworten

7

Nach meiner Erfahrung sehe ich normalerweise eine dreifache Verbesserung bei der Verwendung eines Algorithmus von x87 auf SSE und eine bessere als fünffache Verbesserung beim Wechsel zu VMX / Altivec (wegen komplizierter Probleme, die damit zu tun haben Pipeline-Tiefe, Planung, usw.). Aber ich mache das normalerweise nur in Fällen, in denen ich Hunderte oder Tausende von Zahlen bearbeiten muss, nicht für solche, bei denen ich jeweils einen Vektor ad hoc mache.

    
Crashworks 22.12.2009, 13:20
quelle
3

Das ist nicht die ganze Geschichte, aber es ist möglich, weitere Optimierungen mit SIMD zu machen, werfen Sie einen Blick auf Miguels Präsentation darüber, wann er SIMD-Anweisungen mit MONO implementiert hat, die er bei PDC 2008 ,

SIMD Beats verdoppelt den Arsch in dieser speziellen Konfiguration. http://tirania.org/tmp/xpqetp.png

Bild von Miguels Blogeintrag.

    
Henrik 25.02.2009 04:11
quelle
2

Achten Sie bei 3D-Vorgängen auf nicht initialisierte Daten in Ihrer W-Komponente. Ich habe Fälle gesehen, in denen SSE ops (_mm_add_ps) wegen schlechter Daten in W 10x normale Zeit brauchen.

    
Brian Hayes 03.10.2013 16:56
quelle
1

Die Antwort hängt stark davon ab, was die Bibliothek tut und wie sie verwendet wird.

Die Gewinne können von einigen Prozentpunkten auf "mehrere Male schneller" gehen. Die Bereiche, die am stärksten von Verstärkungen betroffen sind, sind solche, bei denen es nicht um isolierte Vektoren oder Werte, sondern um mehrere Vektoren oder Werte geht auf die gleiche Weise verarbeitet.

Ein weiterer Bereich ist, wenn Sie Cache- oder Speicherlimits treffen, was wiederum erfordert, dass viele Werte / Vektoren verarbeitet werden.

Die Bereiche, in denen Verstärkungen am drastischsten sein können, sind wahrscheinlich die der Bild- und Signalverarbeitung, Computersimulationen sowie die allgemeine 3D-Mathematikoperation auf Gittern (anstelle von isolierten Vektoren).

    
Eric Grange 29.05.2009 10:24
quelle
1

Für einige sehr grobe Zahlen: Ich habe gehört, dass einige Leute auf ompf.org für eine Hand-optimierte Ray-Tracing-Routine 10-mal höhere Geschwindigkeiten verlangen. Ich hatte auch einige gute Speed-Ups. Ich schätze, dass ich je nach Problem irgendwo zwischen 2x und 6x in meinen Routinen hatte, und viele von diesen hatten ein paar unnötige Speicher und Lasten. Wenn Sie eine Menge Verzweigungen in Ihrem Code haben, vergessen Sie es, aber für Probleme, die natürlich Daten parallel sind, können Sie ganz gut tun.

Allerdings sollte ich hinzufügen, dass Ihre Algorithmen für die datenparallele Ausführung ausgelegt sein sollten. Dies bedeutet, dass wenn Sie eine generische Math-Bibliothek haben, wie Sie erwähnt haben, sollte es gepackte Vektoren statt einzelne Vektoren oder Sie werden nur Ihre Zeit verschwenden.

z. Etwas wie

%Vor%

Die meisten Probleme , bei denen die Leistung von Bedeutung ist können parallelisiert werden, da Sie höchstwahrscheinlich mit einem großen Dataset arbeiten werden. Dein Problem klingt für mich wie ein Fall vorzeitiger Optimierung.

    
Rehno Lindeque 09.09.2009 13:05
quelle
0

Heutzutage generieren alle guten Compiler für x86 standardmäßig SSE-Anweisungen für SP- und DP-Float-Mathe. Es ist fast immer schneller, diese Befehle als die nativen zu verwenden, selbst für Skalaroperationen, solange Sie sie korrekt planen. Dies wird für viele überraschend sein, die in der Vergangenheit SSE als "langsam" empfanden und dachten, Compiler könnten keine schnellen SSE-Skalaranweisungen erzeugen. Aber jetzt müssen Sie einen Schalter verwenden, um die SSE-Generierung zu deaktivieren und x87 zu verwenden. Beachten Sie, dass x87 zu diesem Zeitpunkt effektiv veraltet ist und möglicherweise vollständig von zukünftigen Prozessoren entfernt wird. Der einzige Nachteil davon ist, dass wir die Fähigkeit verlieren, 80-Bit-DP-Float im Register auszuführen. Aber der Konsens scheint zu sein, wenn Sie für die Präzision auf 80bit anstelle von 64bit DP floats angewiesen sind, sollten Sie einen präziseren verlusttoleranten Algorithmus suchen.

Alles oben erwähnte kam für mich völlig überraschend. Es ist sehr entgegengesetzt intuitiv. Aber Daten reden.

    
user114229 29.05.2009 10:41
quelle
-19

Wahrscheinlich werden Sie nur eine sehr kleine Beschleunigung sehen, wenn überhaupt, und der Prozess wird komplizierter als erwartet. Für weitere Details siehe Die ubiquitäre SSE-Vektorklasse von Fabian Giesen.

  

Die ubiquitäre SSE-Vektorklasse: Einen allgemeinen Mythos entlarven

     

Nicht so wichtig

     

In erster Linie ist Ihre Vektorklasse wahrscheinlich nicht so wichtig für die Leistung Ihres Programms, wie Sie denken (und wenn dies der Fall ist, ist es wahrscheinlicher, dass Sie etwas falsch machen, als weil die Berechnungen ineffizient sind). Versteht mich nicht falsch, es wird wahrscheinlich eine der am häufigsten verwendeten Klassen in Ihrem gesamten Programm sein, zumindest wenn Sie 3D-Grafiken machen. Aber nur weil Vektoroperationen üblich sind, heißt das nicht automatisch, dass sie die Ausführungszeit Ihres Programms dominieren.

     

Nicht so heiß

     

Nicht einfach

     

Nicht jetzt

     

Nicht immer

    
Suma 22.09.2008 14:55
quelle

Tags und Links