Suche ISSE Funktionen



  • Hi,

    ich möchte mein Programm mit ISSE-Funktionen optimieren, kann jedoch kein Assembler und legs auch nicht drauf an, es zu lernen.

    Drum frag ich ob evtl. jemand ein paar ISSE Funktionen in C oder C++ hat die ich verwenden kann, detect ISSE CPU und Wurzelziehen hab ich schon. Nur sowas wie sin,cos,tan hab ich noch net 😞



  • der unterschied ist soooo gering, da bringt es normalerweise nichts, irgendwelche optimierten instruktionen zu verwenden, außerdem machst du dein programm damit plattformabhängig, in diesem fall sogar CPU-spezifisch (Intel)... von daher schreib lieber guten code bzw. vertrau auf die fertigen Funktion deiner C-Runtime-Library, die sind meistens auch recht optimiert... ich weiß ja nicht, wozu du das brauchst, aber wenn du nur paar hundert mal in der sekunde sin() aufrufst, merkst du nicht wirklich einen unterschied... erst bei echtzeit-anwendungen und synthese, wo man sin locker mal 100.000 mal in der sekunde braucht, würde man da evtl. was merken...



  • es ist ja auch eine Echtzeitanwendung bei der relativ oft sin und co. benutzt wird.

    Nebenbei, ich hab so gecodet, das zuerst die CPU erkannt wird und falls ISSE nicht unterstüzt wird, werden die normalen Runtime funktionen benutzt. 3DNow! soll ja auch noch rein, aber erst ISSE da die auch von AMDs unterstützt werden.



  • SSE kann sin und co. nicht.

    Besorg dir den Intel Compiler und schau dir die intrinsics an.



  • Ringding schrieb:

    SSE kann sin und co. nicht.

    Besorg dir den Intel Compiler und schau dir die intrinsics an.

    Hab grad bei google diese Funktion gefunden und sie ist ca. 15x schneller als die normale funktion:

    float ISSE_cos( float x)
    {
    	float temp;
    	__asm
    	{
    		movss	xmm0, x
    		movss	xmm1, _ps_am_inv_sign_mask
    		andps	xmm0, xmm1
    		addss	xmm0, _ps_am_pi_o_2
    		mulss	xmm0, _ps_am_2_o_pi
    
    		cvttss2si	ecx, xmm0
    		movss	xmm5, _ps_am_1
    		mov		edx, ecx
    		shl		edx, (31 - 1)
    		cvtsi2ss	xmm1, ecx
    		and		edx, 0x80000000
    		and		ecx, 0x1
    
    		subss	xmm0, xmm1
    		movss	xmm6, _sincos_masks[ecx * 4]
    		minss	xmm0, xmm5
    
    		movss	xmm1, _ps_sincos_p3
    		subss	xmm5, xmm0
    
    		andps	xmm5, xmm6
    		movss	xmm7, _ps_sincos_p2
    		andnps	xmm6, xmm0
    		mov		temp, edx
    		orps	xmm5, xmm6
    		movss	xmm0, xmm5
    
    		mulss	xmm5, xmm5
    		movss	xmm4, _ps_sincos_p1
    		movss	xmm2, xmm5
    		mulss	xmm5, xmm1
    		movss	xmm1, _ps_sincos_p0
    		addss	xmm5, xmm7
    		mulss	xmm5, xmm2
    		movss	xmm3, temp
    		addss	xmm5, xmm4
    		mulss	xmm5, xmm2
    		orps	xmm0, xmm3
    		addss	xmm5, xmm1
    		mulss	xmm0, xmm5
    
    		movss   x,    xmm0
    
    	}
    
    	return x;
    }
    

    Also wie war das?



  • woher willst du das mit dem 15x schneller wissen??



  • er hats mit seiner flick-flack uhr gemessen =p



  • Ringding schrieb:

    SSE kann sin und co. nicht.

    Besorg dir den Intel Compiler und schau dir die intrinsics an.

    hier gings drum, optimierte sin() und cos() funktionen zu verwenden, die halt zur optimierung u.a. SSE-Instruktionen benutzen... es ist trotzdem fraglich, ob man nicht mit FPU-Instruktionen (wie FSIN, FCOS, FPTAN usw.) besser kommt... zumal hier garantiert ist, dass das jeder prozessor ab 80486DX kann... (wenn man schon asm benutzt 🙂 )

    ein

    float fpu_sin (float f) {
      asm {
            finit
            fld f
    
            fsin
            fst f
        }
      return (f);
    }
    

    ist da bestimmt schneller als dein 15x schnellerer code 🙂

    außerdem werden bei deinem code (so wie das auf den ersten blick aussieht) noch externe variablen/arrays benutzt... dann ist das keine kunst, mit werte-tabellen bekomme ich sowas auch hin... dann muss man nur noch in der lage sein, eine schnelle interpolation durchzuführen *lol*


Anmelden zum Antworten