빠른 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 Guitar World선정 최고의 기타솔로곡 단장 2006.06.14 245269
63 Networking Best Practices in XBOX360 단장 2007.12.19 10886
62 마력 구하는 공식 단장 2013.07.11 7383
61 Windows 8.1 복구 파티션 만들기 단장 2013.11.13 6692
60 버텍스버퍼의 효율적인 사용 단장 2007.10.01 5100
59 효율적인 동기화를 위한 아이디어 하나 단장 2007.09.29 3279
58 vTune 사용법 단장 2009.01.13 3234
57 술의 이력서 단장 2007.02.09 2270
56 Large Address Aware file 단장 2014.03.05 1948
55 Fast Bit Counting 단장 2009.02.21 1883
54 std::tr1 단장 2008.03.13 1848
53 골프의 물리학 단장 2009.05.30 1681
52 자동차 정비용어 정리 단장 2007.01.20 1660
51 Nat기반 P2P 프로그래밍 단장 2007.11.21 1627
50 제트 추력 엔진 단장 2008.04.29 1600
49 이스람(Islam:회교:回敎)에서의 성 단장 2007.02.08 1379
48 한국운전면허를 일본운전면허로 바꾸기 [2] 단장 2007.10.26 1351
47 [C++]function objects 단장 2007.05.01 1341
46 NAT 홀펀칭 단장 2007.10.25 1293
45 Stream of Life 단장 2009.06.29 1285