Wurzeln schnell ziehen


  • Mod

    0x00000001 schrieb:

    @rapso: Wieso soll der Code auf einem Intel schneller als einem AMD sein? Wegen der Pipeline? Beim InvSqrt sind keine Sprünge drin was gut für die Pipeline ist.

    ich hab nicht gesagt, dass intel dort schneller wäre als AMD.
    ich habe gesagt, bei amd wäre der code wohl nicht schneller als die fpu
    bei intel sollte der schneller sein als die fpu.

    das liegt daran dass die fpu beim p4 nicht so effizient ist wie bei AMD, die intergerleistung hingegen ist eigentlich ziemlich effizient. deswegen hab ich erwartet dass es beim AMD nichts bringt und beim p4 schon eher.

    rapso->greets();

    ps. effiziens ist nicht mit performance vergleichbar! ein p4 mir 3GHz mag wohl genausoviele operationen wie ein athlonfx mit 2.2ghz verarbeiten, nur die zeitschritte zwischen den stufen der abarbeitung sind anders. mit effiziens meinte ich also rechenleistung/takt.



  • 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:1983

    meine 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 🙂


  • Mod

    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.



  • Link

    Die haben ungefähr dieselben Tests gemacht, aber Abweichungen bei der Verwendung von SSE gefunden.

    cya
    liquid


Anmelden zum Antworten