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.)