빠른 1/sqrt(n) 계산방법

2014.03.05 03:43

단장 조회 수:549

http://en.wikipedia.org/wiki/Fast_inverse_square_root


사실 애니메이션 본TM계산시 엄청나게 많이 쓰는데 당연한 얘기지만 각종 노말라이즈에 다 들어가는 수식이기 때문이가.

그런데 생각보다 속도가 느리다... 이를 최적화하는 기법. 


최초 구현된 것은 ID의 Quake 3 Arena에서 존카멕 형이 만든 것. 아래의 소스 코드이다.


float Q_rsqrt( float number )
{
	long i;
	float x2, y;
	const float threehalfs = 1.5F;
 
	x2 = number * 0.5F;
	y  = number;
	i  = * ( long * ) &y;                       // evil floating point bit level hacking
	i  = 0x5f3759df - ( i >> 1 );               // what the fuck?
	y  = * ( float * ) &i;
	y  = y * ( threehalfs - ( x2 * y * y ) );   // 1st iteration
//      y  = y * ( threehalfs - ( x2 * y * y ) );   // 2nd iteration, this can be removed
 
	return y;
}



아래는 언리얼4엔진에서 사용하고 있는 방법. SSE 를 사용하고 있다.


static FORCEINLINE float InvSqrt( float F )

{

static const __m128 fThree = _mm_set_ss( 3.0f );

static const __m128 fOneHalf = _mm_set_ss( 0.5f );

__m128 Y0, X0, Temp;

float temp;


Y0 = _mm_set_ss( F );

X0 = _mm_rsqrt_ss( Y0 ); // 1/sqrt estimate (12 bits)


// Newton-Raphson iteration (X1 = 0.5*X0*(3-(Y*X0)*X0))

Temp = _mm_mul_ss( _mm_mul_ss(Y0, X0), X0 ); // (Y*X0)*X0

Temp = _mm_sub_ss( fThree, Temp ); // (3-(Y*X0)*X0)

Temp = _mm_mul_ss( X0, Temp ); // X0*(3-(Y*X0)*X0)

Temp = _mm_mul_ss( fOneHalf, Temp ); // 0.5*X0*(3-(Y*X0)*X0)

_mm_store_ss( &temp, Temp );


return temp;

}



댓글 0

파일 첨부

여기에 파일을 끌어 놓거나 파일 첨부 버튼을 클릭하세요.

파일 크기 제한 : 0MB (허용 확장자 : *.*)

0개 첨부 됨 ( / )
 
목록
번호 제목 글쓴이 날짜 조회 수
24 아마추어 암호 설계자에게 주는 충고 by 브루스 슈나이어 단장 2005.12.22 983
23 AMD CPU 리퍼런스 테이블 단장 2005.07.11 978
22 서울 시내에서 '무료'로 주차하기 단장 2007.03.06 976
21 R6002 floating point not loaded ??? 단장 2006.05.16 973
20 VC 디버그빌드에서 들어가는 쓰레기값들의 의미 단장 2006.04.15 964
19 이펙터 단장 2006.06.14 962
18 NOR-플래시 메모리 제어 (2) 단장 2005.07.04 961
17 유명 다이아몬드들 단장 2007.01.31 960
16 일어 12월명 [1] 단장 2006.03.21 933
15 귤화위지의 고사 단장 2005.10.03 924
14 No Silver Bullet 단장 2007.01.04 911
13 이해의 선물 단장 2007.03.02 909
12 부동산 매수 시 고려해야 할 38가지 단장 2006.04.19 882
11 파워맥에 들어가는 배터리 단장 2005.06.28 864
10 오자서 평전 단장 2005.09.26 855
9 플래시 메모리 쉽게 끝내기 (1) 단장 2005.07.04 855
8 해외 취업, 미국으로 가는 길 단장 2006.04.26 849
» 빠른 1/sqrt(n) 계산방법 단장 2014.03.05 549
6 마포에서 AF되는 포서드용 렌즈들 단장 2014.02.13 436
5 VC 2012이후에서 릴리즈 빌드 스택변수들 디버깅하기 file 단장 2014.03.05 401