Frage

Ich bin mit 3D-Mathematik in meiner Anwendung ausgiebig. Wie viel Speed-up kann ich durch die Umwandlung meiner Vektor / Matrix-Bibliothek SSE, AltiVec oder einem ähnlichen SIMD-Code erreichen?

War es hilfreich?

Lösung

Nach meiner Erfahrung in ich in der Regel über eine 3x Verbesserung sehe einen Algorithmus von x87 bis SSE nehmen und ein besser als 5x Verbesserung geht VMX / AltiVec (wegen der komplizierten Fragen, die mit dem zu tun Pipeline Tiefe, Terminplanung, usw.). Aber ich in der Regel nur tun dies in Fällen, in denen ich Hunderte oder Tausende von Zahlen arbeiten auf, nicht für die, wo ich mache einen Vektor zu einer Zeit ad hoc.

Andere Tipps

Das ist nicht die ganze Geschichte, aber es ist möglich, weitere Optimierungen zu bekommen SIMD verwenden, hat Präsentation einen Blick auf Miguels etwa wenn er SIMD-Befehle mit MONO implementiert, denen er unter PDC 2008 ,


(Quelle: tirania.org )

Bild von Miguel Blog-Eintrag.

Für einige sehr grobe Zahlen: Ich habe einige Leute gehört, auf ompf.org 10x Geschwindigkeit ups für einige Hand behaupten -optimierte Raytracing-Routinen. Ich habe auch einige gute Geschwindigkeit ups hatte. Ich schätze, ich habe irgendwo zwischen 2x und 6x auf meinen Routinen je nach Problemstellung, und viele von ihnen hatten ein paar unnötigen Geschäfte und Lasten. Wenn Sie eine riesige Menge an Verzweigung in Ihrem Code haben, vergessen Sie es, aber für Probleme, die von Natur aus Daten parallel sind, können Sie ganz gut tun.

Aber ich möchte hinzufügen, dass Ihre Algorithmen sollten für Daten-parallele Ausführung ausgelegt sein. Das bedeutet, dass, wenn Sie eine allgemeine mathematische Bibliothek, wie Sie erwähnt haben, dann sollte es verpackt Vektoren nehmen anstatt einzelne Vektoren oder Sie werden nur Ihre Zeit verschwenden.

z. So etwas wie

namespace SIMD {
class PackedVec4d
{
  __m128 x;
  __m128 y;
  __m128 z;
  __m128 w;

  //...
};
}

Die meisten Probleme , wo Leistung zählt parallelisiert werden, da Sie höchstwahrscheinlich mit einer großen Datenmenge arbeiten. Ihr Problem klingt wie ein Fall der vorzeitigen Optimierung zu mir.

Für 3D-Operationen von nicht initialisierten Daten in Ihrer W-Komponente passen. Ich habe Fälle gesehen, wo SSE ops (_mm_add_ps) 10x normale Zeit wegen der schlechten Daten in W nehmen würde.

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

Die Gewinne können von einigen Prozentpunkten gehen, auf „mehrere Male schneller“, die Bereiche besonders anfällig für Gewinne sehen, sind diejenigen, bei denen man nicht mit isolierten Vektoren oder Werte, sondern mehrere Vektoren oder Werte handelt, die sein müssen auf die gleiche Art und Weise verarbeitet werden.

Ein weiterer Bereich ist, wenn Sie Cache oder Speichergrenzen treffen sind, die wiederum eine Menge von Werten erfordert / Vektoren verarbeitet werden.

Die Bereiche, in denen Gewinne die drastischsten sein können, sind wahrscheinlich diejenigen von Bild- und Signalverarbeitung, Computersimulationen sowie allgemeinen 3D-Mathematik Betrieb auf Netze (und nicht als isolierte Vektoren).

In diesen Tagen alle guten Compiler für x86 erzeugen SSE-Befehle für SP und DP Float math standardmäßig. Es ist fast immer schneller diese Anweisungen als die Einheimischen zu verwenden, auch für skalare Operationen, so lange, wie Sie sie richtig planen. Dies wird als eine Überraschung für viele, die SSE in der Vergangenheit gefunden „langsam“ zu sein, und dachte Compiler konnte nicht schnell SSE skalaren Befehle erzeugen. Aber jetzt müssen Sie einen Schalter verwenden SSE Generation auszuschalten und x87 verwenden. Beachten Sie, dass x87 effektiv an diesem Punkt ist veraltet und kann von zukünftigen Prozessoren vollständig entfernt werden. Der einzige Nachteil Punkt dafür ist, dass wir die Fähigkeit verlieren, können 80bit DP Schwimmer im Register zu tun. Aber der Konsens scheint zu sein, wenn Sie auf 80bit je anstelle von 64-Bit-DP für die Präzision Schwimmern, Ihre für eine Präzisionsverlust tolerante Algorithmus aussehen sollte.

Alles oben kam völlig überraschend für mich. Es ist sehr unlogisch. Aber Daten Gespräche.

Die meisten wahrscheinlich, dass Sie nur sehr kleinen Speedup sehen werden, falls vorhanden, und der Prozess wird komplizierter als erwartet. Weitere Einzelheiten finden Sie unter Der Ubiquitous SSE Vektorklasse Artikel von Fabian Giesen.

  

Die Ubiquitous SSE Vektorklasse: ein weit verbreiteter Mythos entlarven

     

nicht so wichtig

     

In erster Linie Ihre Vektor-Klasse ist wahrscheinlich nicht so wichtig für die Leistung des Programms, wie Sie denken (und wenn es ist, ist es wahrscheinlicher, weil Sie etwas falsch als tun, weil die Berechnungen sind ineffizient). Verstehen Sie mich nicht falsch, es wird wahrscheinlich eines der am häufigsten verwendeten Klassen in Ihrem gesamten Programm sein, zumindest wenn 3D-Grafik zu tun. Aber nur weil Vektoroperationen werden häufig bedeutet nicht automatisch, dass sie dann die Ausführungszeit des Programms dominieren.

     

Nicht so heiß,

     

Nicht einfach

     

Nicht jetzt

     

Nicht immer

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top