Wurzeln schnell ziehen
-
Flow_cplus schrieb:
gerade weil carmack meinte das er euf dem gebiet noch einen genie gebrauchen könnte ....
Na ich hab jedenfalls keine Zeit.
Bye, TGGC (Reden wie die Großen)
-
-
hier mein code den ich benutze und der die besten ergebnisse bringt:
float Sqrt3DNow(float x) { __asm { femms movd MM0, x pfrsqrt MM1, MM0 punpckldq MM0, MM0 pfmul MM0, MM1 movd x, MM0 femms } return x; } float SqrtSSE(float x) { _asm { sqrtss XMM0, x movss x, XMM0 } return x; }
hmm, wie kriegt man die tabs hier richtig formatiert?
-
Sowohl 3DNow als auch SSE benutzen im CPU integrierte Tabellen mit approximierten Ergebnissen um die Werte zu generieren. Bei 3DNow sind es afaik 14 Bits an Präzision, die man so bekommt. Das ist nicht gerade viel und AMD empfiehlt deshalb auch mit einer Newton-Raphson Iteration das Ergebnis zu verbessern. Intel weist darauf auch an verschiedenen Stellen in seinen Dokumentationen hin.
14 Bit sind nicht gerade viel und das kann zu derben Fehlern in der Darstellung führen.cya
liquid
-
LiquidAcid schrieb:
14 Bit sind nicht gerade viel und das kann zu derben Fehlern in der Darstellung führen.
ist bei mir bis jetzt noch nie aufgefallen. die genauigkeit müsste aber trotzdem über der von InvSqrt liegen.
-
Afaik liegen sie in etwa auf demselben Level.
cya
liquid
-
hab mal ein paar tests gemacht und InvSqrt ist wirklich die mit abstand unpräziseste, gefolgt von 3dnow. geschwindikeits/präzisionsverhältniss ist wohl die beste wahl Sqrt2.
gruss
adapto
-
p.s: bei SqrtSSE gab es keine abweichungen zu sqrt.
-
Die haben ungefähr dieselben Tests gemacht, aber Abweichungen bei der Verwendung von SSE gefunden.
cya
liquid
-
Passt aber auf, das ihr euch nicht veroptimiert.
Bye, TGGC \-/
-
Wenn man kein D3DX hat muss man halt selber Hand anlegen.
cya
liquidEDIT: Ahja, was ich noch sagen wollte. Hier im Thread gibt es einige Verwechslung was rsprt und sqrt angeht. Der Code der Carmack angedichtet wird berechnet die reziproke Quadratwurzel. Was hier einige machen ist einfach nur die Quadratwurzel berechnen.
-
InvSqrt(x)*x
-
=Sqrt(x)
ich weiß
-
naja wenn ihr die letzte code-zeile von InvSqrt oefters ausfuehrt, wird auch das ergebnis genauer aber die performance geht in den keller!
// z.b. 3 iterationen x = x*(1.5f - xhalf*x*x); x = x*(1.5f - xhalf*x*x); x = x*(1.5f - xhalf*x*x);
fuer alle die wissen wollen warum das so funktioniert sei folgendes paper empfohlen:
http://www.math.purdue.edu/~clomont/Math/Papers/2003/InvSqrt.pdf
-
Wow, du hast einen über ein Jahr alten Beitrag wieder ausgegraben