Als Erweiterung zu Moyners Antwort ist der On-Chip sqrt
normalerweise eine rsqrt
, dh eine reziproke Quadratwurzel, die ein → 1 / √ berechnet . Wenn Sie also in Ihrem Code nur1/r verwenden(wenn Sie Molekulardynamik betreiben), können Siedirektrechnenund sich die Teilung sparen. Der Grundfür die Berechnungist, dass die Newton-Iteration keine Divisionen, sondern nur Additionen und Multiplikationen enthält.a → 1 / a--√1 / rr = rsqrt(r2)
rsqrt
sqrt
Nebenbei bemerkt, Divisionen werden auch iterativ berechnet und sind fast genauso langsam wie rsqrt
in Hardware. Wenn Sie nach Effizienz streben, sollten Sie versuchen, überflüssige Trennlinien zu entfernen.
Einige modernere Architekturen, wie die POWER-Architekturen von IBM, bieten nicht rsqrt
per se, sondern eine auf wenige Bits genaue Schätzung, z . B. FRSQRTE . Wenn ein Benutzer aufruft rsqrt
, generiert dies eine Schätzung und dann eine oder zwei (beliebig viele) Iterationen des Newton- oder Goldschmidt-Algorithmus unter Verwendung regelmäßiger Multiplikationen und Additionen. Der Vorteil dieses Ansatzes besteht darin, dass die Iterationsschritte ohne Blockierung der FPU in Pipelines angeordnet und mit anderen Anweisungen verschachtelt werden können (für einen sehr guten Überblick über dieses Konzept, wenn auch auf älteren Architekturen, siehe Rolf Strebels Doktorarbeit ).
Bei Interaktionspotentialen kann die sqrt
Operation vollständig vermieden werden, indem ein Polynominterpolant der Potentialfunktion verwendet wird. Meine ( mdcore
in diesem Bereich implementierte ) Arbeit zeigt jedoch, dass der sqrt
Befehl zumindest auf x86-Architekturen schnell genug ist.
Aktualisieren
Da diese Antwort anscheinend einiges an Aufmerksamkeit erhält, möchte ich auch auf den zweiten Teil Ihrer Frage eingehen, dh, lohnt es sich wirklich, zu versuchen, grundlegende Vorgänge zu verbessern / zu beseitigen, wie z sqrt
.
Im Zusammenhang mit Molekulardynamik-Simulationen oder partikelbasierten Simulationen mit Cutoff-begrenzten Wechselwirkungen können bessere Algorithmen für die Nachbarbestimmung viel bewirken. Wenn Sie mit Zellenlisten , oder etwas ähnliches, Nachbarn zu finden oder eine erstellen Verlet Liste finden Sie eine große Anzahl von falschen paarweise Abstände werden zu berechnen. Im naiven Fall befinden sich nur 16% der untersuchten Partikelpaare tatsächlich im Grenzabstand voneinander. Obwohl für solche Paare keine Wechselwirkung berechnet wird, ist der Zugriff auf die Partikeldaten und die Berechnung des störenden paarweisen Abstands mit hohen Kosten verbunden.
Meine eigenen Arbeiten in diesem Bereich ( hier , hier und hier ) sowie die anderer (z. B. hier ) zeigen, wie diese falschen Berechnungen vermieden werden können. Diese Nachbarsuchalgorithmen übertreffen sogar Verlet-Listen, wie hier beschrieben .
Der Punkt, den ich hervorheben möchte, ist, dass, obwohl es einige Verbesserungen geben kann, wenn man die zugrunde liegende Hardwarearchitektur besser kennt / ausnutzt, es auch potenziell größere Gewinne gibt, wenn man die Algorithmen der höheren Ebene neu überdenkt.
rsqrtps
und AVX handeltvrsqrtps
es sich ebenfalls um Schätzungen. Sie erhalten die ersten 11 bis 12 Bit korrekt und Sie sollten mit ein oder zwei Newton-Iterationen verfeinern, wenn Sie mehr Genauigkeit wünschen. Dies sind 5/1 und 7/1 (Latenz / inversen Durchsatz) Anweisungen auf Sandy Bridge (siehe Intel docs oder Agner Fog Instruktionstabellen , die der Multiplikation vergleichbar ist. Im Gegensatz dazu die volle Genauigkeit(v)sqrtps
(double precision(v)sqrtpd
) nehmen 10-43 / 10-43 (Einzelheiten finden Sie in den Anweisungstabellen.)Die Quadratwurzel ist auf den meisten Prozessoren in Hardware implementiert, das heißt, es gibt spezifische Montageanweisungen, und die Leistung sollte in den meisten Sprachen vergleichbar sein, da es sehr schwierig ist, die Implementierung zu verbessern. Sie werden den FSQRT-Befehl wahrscheinlich nie schlagen können, da er von einem intelligenten Hardware-Designer entworfen wurde.
Wie es in Hardware implementiert ist, kann variieren, aber es ist wahrscheinlich eine Art Festkomma-Iteration, zum Beispiel die Newton-Raphson-Methode, die eine bestimmte Anzahl von Iterationen durchführt, bis die Anzahl der erforderlichen Ziffern berechnet ist. Iterative Methoden in der Hardware sind im Allgemeinen viel langsamer als andere Operationen, da mehrere Zyklen abgeschlossen sein müssen, bevor das Ergebnis fertig ist.
Es gibt auch einige Streaming-SIMD-Befehle , die in den XMM-Registern für schnelle Vektorberechnungen verwendet werden können . Diese Register sind ziemlich klein, aber wenn Sie eine bekannte Anzahl von Koordinaten haben (z. B. ein dreidimensionales kartesisches Koordinatensystem), können sie ziemlich viel schneller sein.
Wenn Ihre Sprache niedrig genug ist, können Sie immer mit einer niedrigeren Genauigkeit tippen oder eine niedrigere Genauigkeit für Ihre Koordinaten verwenden. Einzelne Genauigkeit ist oft mehr als gut genug und wird, wie ich mich erinnere, beim Berechnen von Quadratwurzeln schneller sein, da die Iterationen früher beendet werden können.
Es sollte einfach genug sein, verschiedene Sprachen zu vergleichen: Schreiben Sie einfach eine lange Reihe von Zufallszahlen in eine Datei, laden Sie sie in verschiedenen Sprachen und messen Sie die Quadratwurzeln.
quelle
Es kann Leistungsverbesserungen geben, aber zuerst sollte man wissen, dass das Berechnen des Kehrwerts des sqrt der Flaschenhals ist (und nicht etwa das Laden der Positionen und das Speichern der Kräfte).
Das GROMACS MD-Projekt entstand aus der Idee, die Details des IEEE-Gleitkommaformats zu nutzen, um ein Newton-Raphson-Iterationsschema für die Berechnung einer akzeptablen Annäherung an den Kehrwert der Quadratwurzel zu erstellen (siehe Anhang B.3 von http: / /www.gromacs.org/Documentation/Manual ), aber es werden keine HPC-CPUs verwendet, bei denen GROMACS diese Idee noch verwendet.
quelle