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.


Anmelden zum Antworten