빠른 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 초간단 VTune 세팅법 [3] 김도완 2005.06.16 1137
63 [공지] 게시판 용도 김도완 2005.06.16 1178
62 파워맥에 들어가는 배터리 단장 2005.06.28 864
61 플래시 메모리 쉽게 끝내기 (1) 단장 2005.07.04 855
60 NOR-플래시 메모리 제어 (2) 단장 2005.07.04 961
59 맥 탄생비화 (1) 단장 2005.07.04 1177
58 AMD CPU 리퍼런스 테이블 단장 2005.07.11 978
57 CPU 평균온도 단장 2005.07.13 1087
56 음식 칼로리표 -_-;;; [3] 단장 2005.07.14 1040
55 Direct3D API들의 실행 사이클 단장 2005.07.15 988
54 순수 탄소 - 퓔러렌 단장 2005.07.19 989
53 오자서 평전 단장 2005.09.26 855
52 귤화위지의 고사 단장 2005.10.03 924
51 비싼 카메라 이야기 단장 2005.11.21 1000
50 니콜라 테슬라 단장 2005.11.26 1168
49 요요회사간의 베어링 규격 단장 2005.12.05 1084
48 원핸드 스트링 기본. 마운트. [1] 단장 2005.12.05 1075
47 아마추어 암호 설계자에게 주는 충고 by 브루스 슈나이어 단장 2005.12.22 983
46 일어 12월명 [1] 단장 2006.03.21 933
45 VC 디버그빌드에서 들어가는 쓰레기값들의 의미 단장 2006.04.15 964