Wurzeln schnell ziehen
-
Die Optimierer wieder.
Bye, TGGC (Zu viele Primitive hier.)
-
Ich glaub' euch sowieso nicht!
Wenn das echt vom Carmack ist, ist es - per Definition - min. 10 x schneller...!! :p
-
Wer ist Carmack?
-
H.L.T.O schrieb:
Wer ist Carmack?
Der Chef Programmierer von ID Software. Eines der Optimier Genies schlechthin.
-
Sgt. Nukem schrieb:
Ich glaub' euch sowieso nicht!
Wenn das echt vom Carmack ist, ist es - per Definition - min. 10 x schneller...!! :p
vielleicht stammt das ja aus den doom source und war bei 486 und 386 echt schneller.
-
so habs auch mal mit dem bcb getestet.
erstmal vorweg: kann es sein, dass es im bcb kein equivalent zum sqrtf gibt, sondern nur eine für double/long double(was ja in etwa aufs selbe rauskommen sollte)?bei meiner Messung hab ich mich zur besseren vergleichbarkeit für einen statischen wert von 200.1 entschieden(ich hatte halt mal lust diese Zahl zu nehmen ;))
das ergebnis war meiner meinung nach eindeutig:
1. methode:2093
2. methode:4817
3. methode:1983meine cpu isn athlon 2200+
ok, hier mein code:#include <math.h> #include <iostream> #include <windows>//für GetTickCount #include <stdio.h> #pragma hdrstop using namespace std; float a; //--------------------------------------------------------------------------- float InvSqrt( float x ) { float xhalf = 0.5f*x; int i = *(int*)&x; i = 0x5f3759df - (i >> 1); x = *(float*)&i; x = x*(1.5f - xhalf*x*x); return x; } float Sqrt2(float x) { __asm { fld x fsqrt fstp x } return x; } #pragma argsused int main(int argc, char* argv[]) { //1. methode int Tim1=GetTickCount(); for(int i=0;i<100000000;++i){ a=InvSqrt(200.1f); } int Tim2=GetTickCount(); cout<<(Tim2-Tim1)<<endl; //2.methode int Tim3=GetTickCount(); for(int i=0;i<100000000;++i){ a=1.f/sqrt(200.1f); } int Tim4=GetTickCount(); cout<<(Tim4-Tim3)<<endl; //3.methode int Tim5=GetTickCount(); for(int i=0;i<100000000;++i){ a=Sqrt2(200.1); } int Tim6=GetTickCount(); cout<<(Tim6-Tim5)<<endl; return 0; }
-
Also erstmal: Der Carmack hat die nicht erfunden. Der beschäftigt sich nur den ganzen Tag mit so Zeugs dass er es auch schnell findet. Ich habe gelesen (http://www.math.purdue.edu/~clomont/Math/Papers/2003/InvSqrt.pdf), dass er das in Q3 benutzt hat. Erfunden hats einer bei nvidia.
Edit: Schon wieder Blödsinn entfernt.
-
H.L.T.O schrieb:
Wer ist Carmack?
:D:D:D Also unter Game-Codern ist dieser Name schon Allgemeinbildung schlecht hin. :D:D:D
-
ChockoCookie schrieb:
H.L.T.O schrieb:
Wer ist Carmack?
Der Chef Programmierer von ID Software. Eines der Optimier Genies schlechthin.
widerspruch, ich hab da zwar nicht soviel ahnung, aber wenn ich mich recht erinner, wie hieß der micheal abrash ... (?)(progammers black book ??? ), zumindest hat cramack den eingestell zum optimieren oder so ...., gerade weil carmack meinte das er euf dem gebiet noch einen genie gebrauchen könnte ....
ich weiß net
-
Flow_cplus schrieb:
ChockoCookie schrieb:
H.L.T.O schrieb:
Wer ist Carmack?
Der Chef Programmierer von ID Software. Eines der Optimier Genies schlechthin.
widerspruch, ich hab da zwar nicht soviel ahnung, aber wenn ich mich recht erinner, wie hieß der micheal abrash ... (?)(progammers black book ??? ), zumindest hat cramack den eingestell zum optimieren oder so ...., gerade weil carmack meinte das er euf dem gebiet noch einen genie gebrauchen könnte ....
ich weiß net
doch kein widerspruch
rapso->greets();
-
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 \-/