SSE langsam



  • Hallo,
    ich will in einem sehr grossen Programm das etwas berechnet die Routine optimieren die im Moment am langsamsten laeuft.

    Zur Zeit ist das nur ein simples Skalarprodukt, das ich durch SSE schneller ausrechnen wollte.

    float r[2];
    float pos[3];
    
    r[0] = pos[0]*pos[0] + pos[1]*pos[1] + pos[2]*pos[2];
    r[1] = sqrt(r[0]);
    

    Das wird ersetzt durch (Core2 Duo CPU, SSSE3 faehig, Ubuntu als OS)

    #include <tmmintrin.h>
    __m128 r128, pos128;
    float *r, *pos;
    
    r = (float *) &r128;
    pos = (float *) &pos128;
    
    //pos[3] = 0 ist sichergestellt
    
    asm("movaps xmm0, %0" : "=m"(pos128) );
    asm("mulaps xmm0, xmm0");
    asm("haddps xmm0, xmm0");
    asm("haddps xmm0, xmm0");
    asm("movaps %0, xmm0" : "=m"(r128) );
    r[1] = sqrt(r[0]);
    

    Allerdings laeuft das ganze dadurch deutlich langsamer als vorher, ein objdump zeigt das der alte Code nicht sse optimiert wird vom Compiler.
    Compiliert wird mit:

    gcc -O3 -Wall -fomit-frame-pointer -mtune=core2 -msse3 -mssse3 -masm=intel

    Danke fuer jede Hilfe,
    M.M.



  • Es macht keinen Sinn, eine einzelne Skalarproduktoperation mittels SSE zu optimieren. Hast du aber einen ganzen Satz so kannst du mehrere in einem Swung berechnen. Mache dir einfach die Bedeutung von SIMD klar. Desweiteren sollte man auch auf alignment achten.



  • Es gibt ein fast_sqrt. Vielleicht hilft es.
    http://www.azillionmonkeys.com/qed/sqroot.html



  • SIMD bringt wenig, wenn du dich danach eine Fpu-Routine (höchst wahrscheinlich) verwendest --> sqrtss ist dein Freund.



  • ... und mach, dass Du die Inline-Asm aus Deinem Code los wirst und schreibe eine richtige Assembler Funktion.
    Und schreibe auch eine C-Funktion, die das gleiche implementiert, nur so für "Notfälle".
    Und schreibe auch Testcode... mit dem sowohl die Assembler als auch die C-Funktion getestet werden - mag ich persönlich auch nicht, muss aber sein, denn nur so könntest Du richtig vergleichen und richtige Aussagen machen usw. 🙂
    Und wenn Du es nicht machst, stimmt Deine Aussage "SSE langsam" gar nicht und dann ärgerst Du nur die Leute damit...


Anmelden zum Antworten