빠른 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개 첨부 됨 ( / )
 
목록
번호 제목 글쓴이 날짜 조회 수
64 문길 설치법 단장 2017.04.19 179
63 디카 이미지 슬라이드필름처럼 보정하기 file 단장 2014.02.13 241
62 비디오 카드의 정의 단장 2013.11.30 269
61 진 여신전생 스트레인지 저니 에디터 코드 단장 2015.06.18 369
60 VC 2012이후에서 릴리즈 빌드 스택변수들 디버깅하기 file 단장 2014.03.05 401
59 마포에서 AF되는 포서드용 렌즈들 단장 2014.02.13 436
» 빠른 1/sqrt(n) 계산방법 단장 2014.03.05 549
57 해외 취업, 미국으로 가는 길 단장 2006.04.26 849
56 플래시 메모리 쉽게 끝내기 (1) 단장 2005.07.04 855
55 오자서 평전 단장 2005.09.26 855
54 파워맥에 들어가는 배터리 단장 2005.06.28 864
53 부동산 매수 시 고려해야 할 38가지 단장 2006.04.19 882
52 이해의 선물 단장 2007.03.02 909
51 No Silver Bullet 단장 2007.01.04 911
50 귤화위지의 고사 단장 2005.10.03 924
49 일어 12월명 [1] 단장 2006.03.21 933
48 유명 다이아몬드들 단장 2007.01.31 960
47 NOR-플래시 메모리 제어 (2) 단장 2005.07.04 961
46 이펙터 단장 2006.06.14 962
45 VC 디버그빌드에서 들어가는 쓰레기값들의 의미 단장 2006.04.15 964