2014.03.05 03:43
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;
}
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
24 | 효율적인 동기화를 위한 아이디어 하나 | 단장 | 2007.09.29 | 3284 |
23 | 버텍스버퍼의 효율적인 사용 | 단장 | 2007.10.01 | 5100 |
22 | NAT 홀펀칭 | 단장 | 2007.10.25 | 1294 |
21 | 한국운전면허를 일본운전면허로 바꾸기 [2] | 단장 | 2007.10.26 | 1351 |
20 | Nat기반 P2P 프로그래밍 | 단장 | 2007.11.21 | 1627 |
19 | 개인적으로 만들어 본 리눅스 게임 서버 FAQ | 단장 | 2007.11.27 | 1125 |
18 | Networking Best Practices in XBOX360 | 단장 | 2007.12.19 | 10896 |
17 | 일본어 날짜 | 단장 | 2008.02.19 | 1150 |
16 | std::tr1 | 단장 | 2008.03.13 | 1848 |
15 | 제트 추력 엔진 | 단장 | 2008.04.29 | 1600 |
14 | vTune 사용법 | 단장 | 2009.01.13 | 3234 |
13 | Fast Bit Counting | 단장 | 2009.02.21 | 1883 |
12 | 골프의 물리학 | 단장 | 2009.05.30 | 1681 |
11 | Stream of Life | 단장 | 2009.06.29 | 1285 |
10 | 마력 구하는 공식 | 단장 | 2013.07.11 | 7383 |
9 | Windows 8.1 복구 파티션 만들기 | 단장 | 2013.11.13 | 6692 |
8 | 비디오 카드의 정의 | 단장 | 2013.11.30 | 269 |
7 | 디카 이미지 슬라이드필름처럼 보정하기 | 단장 | 2014.02.13 | 241 |
6 | 마포에서 AF되는 포서드용 렌즈들 | 단장 | 2014.02.13 | 436 |
» | 빠른 1/sqrt(n) 계산방법 | 단장 | 2014.03.05 | 549 |