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*