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.
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.
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).
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.
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.
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
Tags und Links optimization x86 sse simd native