Normalize Vector SSE
-
Ich habe mal eine Funktion zum Normalisieren eines 3D-Vectors in SSE geschrieben:
c3DVector& OptimizedSSE_Vector3DNormalize(c3DVector &Out,const c3DVector &Vector) { const float *input=Vector.v; const float *result=Out.v; __declspec(align(16)) static const float Packedf0pt5[4] = {0.5f, 0.5f, 0.5f, 0.5f}; __declspec(align(16)) static const float Packedf3pt0[4] = {3.0f, 3.0f, 3.0f, 3.0f}; __asm { mov ebx,input mov ecx,result movss xmm0,[ebx+8] //store z, rest of xmm0 is cleared automatically shufps xmm0,xmm0,0xCF //map: aa=11/bb=11/cc=00/dd=11 movlps xmm0,[ebx] //store x and y // movaps xmm5,Packedf0pt5 movaps xmm6,Packedf3pt0 //calculation movaps xmm2,xmm0 //save original vector to xmm2 mulps xmm0,xmm0 //xmm0: x*x/y*y/z*z/w*w movaps xmm3,xmm0 movaps xmm4,xmm0 shufps xmm3,xmm3,0xC1 //after shuffle: y*y/x*x/x*x/w*w shufps xmm4,xmm4,0xDA //after shuffle: z*z/z*z/y*y/w*w addps xmm0,xmm3 addps xmm0,xmm4 rsqrtps xmm1,xmm0 //refine it, a=xmm0 / rsqrtps(a)=xmm1 //0.5*rsqrtps(a)*[3.0-[a * rsqrtps(a)] *rsqrtps(a)] mulps xmm0,xmm1 //xmm0=[a * rsqrtps(a)] mulps xmm0,xmm1 //xmm0=[a * rsqrtps(a)] *rsqrtps(a) subps xmm6,xmm0 //xmm6=3.0-[a * rsqrtps(a)] *rsqrtps(a) mulps xmm1,xmm6 //xmm1=rsqrtps(a)*[3.0-[a * rsqrtps(a)] *rsqrtps(a)] mulps xmm1,xmm5 //xmm1=0.5*rsqrtps(a)*[3.0-[a * rsqrtps(a)] *rsqrtps(a)] mulps xmm2,xmm1 //multiply it by original vector movlps [ecx],xmm2 //write x and y shufps xmm2,xmm2,0xFE //map: aa=10/bb=11/cc=11/dd=11 movss [ecx+8],xmm2 //write z } return Out; }
Allerdings kann ich mir vorstellen, dass man das noch optimieren kann.
Kennt jemand auch generelle Tipps zum Optimieren von SSE-Code?
-
Und noch etwas:
Wie misst man die Anzahl der CPU-Cycles (also die Takte, oder?), die bei einer bestimmten Funktion gebraucht werden? Und ist das dann gleichbedeutend mit der Geschwindigkeit? (je weniger Takte desto schneller)
-
SlimTimmy schrieb:
Und noch etwas:
Wie misst man die Anzahl der CPU-Cycles (also die Takte, oder?), die bei einer bestimmten Funktion gebraucht werden? Und ist das dann gleichbedeutend mit der Geschwindigkeit? (je weniger Takte desto schneller)Die braucht man nicht messen. Steht in den Intel Büchern.
Das mit den Takts und der Geschwindigkeit stimmt so natürlich. Nur ist das halt die reine Rechnengeschwindigkeit. Viel entscheidender für die Ausführungsgeschwindigkeit der Funktion, weil idR viel zeitaufwendiger, sind aber die Speicher/IO Sachen.
Also wo liegen Daten: Register? L1/2 Cache? RAM?
Bin da jetzt bei Leibe kein Experte.dafür.