SlideShare a Scribd company logo
1 of 25
GPG2권 2.1부동소수점 비법들 IEEE 부동소수점을 통한 성능 향상 김준섭 (트라시르)
목적 정확성을 희생하여 부동소수점 연산 속도를 빠르게 하는 여러 가지 비법 제시 임의의 부동소수점 함수의 최적화를 위한  일반화된 선형 및 대수적 참조 테이블 기법 소개
IEEE 부동소수점 표준 부동소수점 트릭 사인 코사인 최적화를 위한 선형 참조 테이블 제곱근에 대한 대수적 최적화 임의의 함수의 최적화 성능 측정
IEEE 부동소수점 표준 31 30 0 23 22 s : 부호 e : 바이어스된 지수 m : 정규화된 가수 n = s * 1.m x 2(𝑒−127)   지수는 127이 더해져 바이어스된 형식의 양수 가수는 정규화를 하고 가장 왼쪽의 1.을 생략 e = 255일때 무한대를 표현  E = 0은 숫자가 너무 작아서 지수가 8비트를 넘어갔을 때의 경우
IEEE 부동소수점 표준 부동소수점 트릭 사인 코사인 최적화를 위한 선형 참조 테이블 제곱근에 대한 대수적 최적화 임의의 함수의 최적화 성능 측정
float/int변환 부동소수점에서정수로의 형 변환을 수행하는 빠른 방법은  부동소수점 수에 1 * 223을 더하고 그 결과에서 상위 지수 비트들을 버리는 것이다.    typedef union { int     i;          // as integer     float   f;          // as float }INTORFLOAT; INTORFLOAT	n; INTORFLOAT	bias; bias.i = (23 + 127) << 23; n.f = 43.25; n.f += bias.f; n.i -= bias.i; 수가223보다 작다면 문제 없이 작동하게 된다.  
음의 수 처리 Bias = ((23 + 127) << 23) + (1 << 22)를사용해야 한다.  수가 222보다 작아야 한다.   부동소수점/고정소수점변환 Bias = ((23 – 소수부비트수+ 127) << 23)를 사용한다.  int/float 변환 float/int변환을 역으로 적용하면 된다. 일반적인 형 변환으로도 충분히 빠르게 수행할 수 있다.
부호 판정 부동소수점 수의 부호 비트 위치는 정수와 마찬가지이다. 정수 비교를 이용하면 더 빠를 수 있다. 비교 a의지수가 b의 지수보다 크면 가수에 상관없이 a는 b보다 크다. 정수의 파이프라이닝을 사용하여 정수 비교를 하면 더 빠르다. 단 a와 b가 모두 음수인 경우에는 적용되지 않는다.
제한 하나의 값을 특정한 범위로 제한해야 하는 경우가 흔히 생긴다. 부동소수점 수를 0으로 제한하는 것은  부호 비트를 하나의 마스크로 만드는 식으로 처리할 수 있다. f<0이면 f=0으로 제한의 경우 INTROFLOAT ftmp; ftmp.f = f; int s = ftmp.i >> 31; 	// 부호 비트 마스크를 만든다. s = ~s;			// 마스크 비트를 뒤집는다. ftmp.i &= s;	 f = ftmp.f;
f>0이면 f=0으로 제한의 경우 INTROFLOAT ftmp; ftmp.f = f; int s = ftmp.i >> 31; 	// 부호 비트 마스크를 만든다. ftmp.i &= s;	 f = ftmp.f; f>1이면 f=1으로 제한의 경우 1을 빼고 0으로 제한하고 다시 1을 더해서 수행한다. 절대값 부호 비트를0으로 설정하면 된다.
IEEE 부동소수점 표준 부동소수점 트릭 사인 코사인 최적화를 위한 선형 참조 테이블 제곱근에 대한 대수적 최적화 임의의 함수의 최적화 성능 측정
사인 참조 테이블 구현 2𝜋를 256단계로 나눠서 저장하는 참조 테이블   sintable[i] = (float)sin((double)i * 2.0f * PI / 256.0f) 사인 함수 구현 float fsin( float theta ) { int i = (unsigned int)(theta * (256.0f / (2.0f * PI))) return sintable[i]; } 문제점 느린 float -> int변환을 수행한다. theta의 범위가 (0, 2𝜋) 바깥이면 정수 색인의 범위를 넘어가게된다.  
사인 함수 개선 float fsin( float theta ) { inti; INTORFLOAT ftmp; INTORFLOAT bias = ((23 + 127) << 23) + (1 << 22); ftmp.f = theta * ( 256.0f / ( 2.0f * PI )) + bias.f; //정수 변환 i = ftmp.i & 255;	// 마스킹으로 범위 제한 	return sintable[i]; }
코사인 cos𝜃= sin(𝜃+𝜋2)의 성질을 이용하면 된다.   코사인 함수 구현 float fcos( float theta ) { inti; INTORFLOAT ftmp; INTORFLOAT bias = ((23 + 127) << 23) + (1 << 22); ftmp.f = theta * ( 256.0f / ( 2.0f * PI )) + bias.f+ 64.0f;  i = ftmp.i & 255;	 	return sintable[i]; } 𝜋2는 256/4에 해당 되므로 64를 더하면 된다.  
IEEE 부동소수점 표준 부동소수점 트릭 사인 코사인 최적화를 위한 선형 참조 테이블 제곱근에 대한 대수적 최적화 임의의 함수의 최적화 성능 측정
제곱근에 대한 대수적 최적화 제곱근은 지수에 관련된 것이며 가수와는 상관이 없기 때문에,  지수 비트들만 적당히 조작하면 제곱근을 얻을 수 있다. 부동소수점 제곱근 공식 𝑓=1.𝑚×2𝑒 𝑠𝑞𝑟𝑡𝑓  =𝑠𝑞𝑟𝑡(1.𝑚×2𝑒) =𝑠𝑞𝑟𝑡(1.𝑚) ×2𝑒/2   지수가홀수이면 2로 나눴을 때 하위 비트를잃게 된다. 이 문제는 지수의 하위 비트를 가수로 넘겨줌으로써 해결할 수 있다. 𝑠𝑞𝑟𝑡𝑓  =𝑠𝑞𝑟𝑡(1.𝑚×2𝑒0) ×2𝑒/2  
함수 구현 float fsqrt( float f ) { INTORFLOAT	ftmp; unsigned int	n, e; ftmp.f = f; n = ftmp.i; e = (n >> 1) & 0x3f800000;	// 지수를 2로 나눈다. n = (n >> 16) & 0xff;		// 테이블 색인은 e0+m22–m16 ftmp.i = sqrttable[n] + e;		// 재 바이어스 	return ftmp.f; } 제곱근의 지수는 f의 지수를 Rsh 1하면 얻을 수 있다. 지수는 바이어스된 것이므로 1비트 이동시키면 결과적으로  지수뿐만 아니라 바이어스 또한 2로 나눠지게 된다. 원치 않는 결과이므로 추가적인 인수를 더함으로 다시 바이어스 시킨다.
IEEE 부동소수점 표준 부동소수점 트릭 사인 코사인 최적화를 위한 선형 참조 테이블 제곱근에 대한 대수적 최적화 임의의 함수의 최적화 성능 측정
임의의 함수의 최적화 하나의 매개변수를 가지는 임의의 부동소수점 함수를 생각해보자. 𝑦=𝑓(𝑥)   사인과 코사인의 경우, 𝑥의값은 선형적 수량화되며  𝑦를 참조하기 위한 테이블 색인으로 쓰인다. 제곱근의 경우, 𝑥의 값은 대수적으로 수량화되며  어떠한 하나의 값을 참조하기 위한 테이블 색인으로 쓰인다.   이 두 기법을 일반화하면 임의의 함수에 대한 최적화를 구현할 수 있다. 선형적, 대수적 수량화를 사용할 것이냐는 함수의 성격에 따라 달라진다.
선형적 수량화 어떤 함수의 정의역(x의범위)이 고정되어 있다고 하자( 즉 𝑥 ∈𝐴, 𝐵) 그러면 범위를 균일하게 포괄하는 하나의 참조 테이블을 만들 수 있으며, 그 범위 안의 x를 테이블에 대한 색인으로 만들 수 있다.  
함수 구현 #define TABLESIZE 	256 #define INDEXSCALE 	((float)TABLESIZE / (B – A)) float flut( float x) { int i;	 	INTORFLOAT ftmp; 	INTORFLOAT bias = ((23 + 127) << 23) + (1 << 22); ftmp.f = x * INDEXSCALE + (bias.f – A * INDEXSCALE);  	i = ftmp.i & (TABLESIZE – 1); 	return table[i]; } 참조 테이블 구현 sintable[i] = f((float)i / INDEXSCALE + A); 여기서 f는 완전한 정밀도를 가진 보동소수점 값을 돌려주는 “진짜” 함수이다.
대수적 수량화 기본적인 개념은 부동소수점 x를 정수 범위로 변환하는 대신 비트들을 직접 테이블 색인으로 사용한다는 것이다. 기본적인접근 방식은 부호나 지수, 가수의 일부 비트들을 추출하고 조작함으로써  또 다른 임의의 부동소수점 형식으로 변환하는 것이다. 지수로부터 ebits개의 비트들을 뽑고  가수로부터 mbits개의 비트들을 뽑아내는 방법은 다음과 같다. 𝑏𝑖𝑡𝑠=𝑛≫23−𝑚𝑏𝑖𝑡𝑠 & 1≪𝑒𝑏𝑖𝑡𝑠+𝑚𝑏𝑖𝑡𝑠−1   이 코드는 수 n의 가수와 지수 중 원하는 만큼의 비트들을 수n의 가장 오른쪽으로 밀어서 이동시키고,  마스킹AND 연산을 수행하는 것이다. 또 다른 방법은 제곱근 예에서와 같이 지수와 대수 연산을 분해하는 것이다. 𝑓𝑥=𝑓1.𝑚×2𝑒=𝑓1(1.𝑚)×2𝑓2(𝑒)   8 비트 가수 m을 이용해서 f1을 256 항목의 참조 테이블로 근사하고  f2는 지수 e에 대한 정수 연산으로서 직접 계산할 수있다.
IEEE 부동소수점 표준 부동소수점 트릭 사인 코사인 최적화를 위한 선형 참조 테이블 제곱근에 대한 대수적 최적화 임의의 함수의 최적화 성능 측정
이론상으로 멋진 최적화 기법도 실제 구현에서는 안하느니만 못한 결과를 낳을 수 있다. 뭔가를 변경했다면 성능이 향상되었는지 짚어봐야 한다. 펜티엄 컴퓨터의 경우 rdtcs(read time stamp counter) 명령을  이용해서 현재의 CPU 사이클 카운트를 얻을 수 있다. 일관적인 타이밍 결과를 얻기 위해서는 cpuid처럼  명령 캐시를 비우는 명령을 사용하도록 권장하고 있다. 절대적 시간을 얻어야 하는 경우  사이클 카운트를 프로세스의 실행 속도(MHz)로 나누면 초단위시간을 얻을 수 있다. Vtune이나 TrueTime같은 도구들도 고수준 프로파일링에 유용하다. Inter VTune
Q/A

More Related Content

What's hot

RNC C++ lecture_5 Array
RNC C++ lecture_5 ArrayRNC C++ lecture_5 Array
RNC C++ lecture_5 Arrayitlockit
 
Pure Function and Rx
Pure Function and RxPure Function and Rx
Pure Function and RxHyungho Ko
 
Data Structure - 1st Study
Data Structure - 1st StudyData Structure - 1st Study
Data Structure - 1st StudyChris Ohk
 
Haskell study 10
Haskell study 10Haskell study 10
Haskell study 10Nam Hyeonuk
 
Functional programming
Functional programmingFunctional programming
Functional programmingssuserdcfefa
 
Pure Function and Honest Design
Pure Function and Honest DesignPure Function and Honest Design
Pure Function and Honest DesignHyungho Ko
 
2012 Ds C2 06
2012 Ds C2 062012 Ds C2 06
2012 Ds C2 06seonhyung
 
최소 편집 거리와 동적 프로그래밍
최소 편집 거리와 동적 프로그래밍최소 편집 거리와 동적 프로그래밍
최소 편집 거리와 동적 프로그래밍EunGi Hong
 
자바 스터디(6기) 1
자바 스터디(6기) 1자바 스터디(6기) 1
자바 스터디(6기) 1Jina Lee
 
Backtracking [ICPC Sinchon]
Backtracking [ICPC Sinchon]Backtracking [ICPC Sinchon]
Backtracking [ICPC Sinchon]Jae-yeol Lee
 
C Language For Arduino
C Language For ArduinoC Language For Arduino
C Language For Arduino영욱 김
 
Selection Sort Algorithm(선택 정렬 알고리즘)
Selection Sort Algorithm(선택 정렬 알고리즘)Selection Sort Algorithm(선택 정렬 알고리즘)
Selection Sort Algorithm(선택 정렬 알고리즘)Junyeong Choi
 
[TAOCP] 1.3.1 MIX 설명
[TAOCP] 1.3.1 MIX 설명[TAOCP] 1.3.1 MIX 설명
[TAOCP] 1.3.1 MIX 설명종빈 오
 
MIPS CPU의 이해 (입문)
MIPS CPU의 이해 (입문)MIPS CPU의 이해 (입문)
MIPS CPU의 이해 (입문)Jin wook
 
String Searching Algorithms
String Searching AlgorithmsString Searching Algorithms
String Searching Algorithmsskku_npc
 
Design Pattern In Functional Language
Design Pattern In Functional LanguageDesign Pattern In Functional Language
Design Pattern In Functional LanguageSH Park
 

What's hot (18)

RNC C++ lecture_5 Array
RNC C++ lecture_5 ArrayRNC C++ lecture_5 Array
RNC C++ lecture_5 Array
 
Pure Function and Rx
Pure Function and RxPure Function and Rx
Pure Function and Rx
 
이산수학 Ch.5
이산수학 Ch.5이산수학 Ch.5
이산수학 Ch.5
 
HI-ARC PS 101
HI-ARC PS 101HI-ARC PS 101
HI-ARC PS 101
 
Data Structure - 1st Study
Data Structure - 1st StudyData Structure - 1st Study
Data Structure - 1st Study
 
Haskell study 10
Haskell study 10Haskell study 10
Haskell study 10
 
Functional programming
Functional programmingFunctional programming
Functional programming
 
Pure Function and Honest Design
Pure Function and Honest DesignPure Function and Honest Design
Pure Function and Honest Design
 
2012 Ds C2 06
2012 Ds C2 062012 Ds C2 06
2012 Ds C2 06
 
최소 편집 거리와 동적 프로그래밍
최소 편집 거리와 동적 프로그래밍최소 편집 거리와 동적 프로그래밍
최소 편집 거리와 동적 프로그래밍
 
자바 스터디(6기) 1
자바 스터디(6기) 1자바 스터디(6기) 1
자바 스터디(6기) 1
 
Backtracking [ICPC Sinchon]
Backtracking [ICPC Sinchon]Backtracking [ICPC Sinchon]
Backtracking [ICPC Sinchon]
 
C Language For Arduino
C Language For ArduinoC Language For Arduino
C Language For Arduino
 
Selection Sort Algorithm(선택 정렬 알고리즘)
Selection Sort Algorithm(선택 정렬 알고리즘)Selection Sort Algorithm(선택 정렬 알고리즘)
Selection Sort Algorithm(선택 정렬 알고리즘)
 
[TAOCP] 1.3.1 MIX 설명
[TAOCP] 1.3.1 MIX 설명[TAOCP] 1.3.1 MIX 설명
[TAOCP] 1.3.1 MIX 설명
 
MIPS CPU의 이해 (입문)
MIPS CPU의 이해 (입문)MIPS CPU의 이해 (입문)
MIPS CPU의 이해 (입문)
 
String Searching Algorithms
String Searching AlgorithmsString Searching Algorithms
String Searching Algorithms
 
Design Pattern In Functional Language
Design Pattern In Functional LanguageDesign Pattern In Functional Language
Design Pattern In Functional Language
 

Similar to 2.1 부동소수점 비법들

Python Sympy 모듈 이해하기
Python Sympy 모듈 이해하기Python Sympy 모듈 이해하기
Python Sympy 모듈 이해하기Yong Joon Moon
 
[컴퓨터비전과 인공지능] 6. 역전파 2
[컴퓨터비전과 인공지능] 6. 역전파 2[컴퓨터비전과 인공지능] 6. 역전파 2
[컴퓨터비전과 인공지능] 6. 역전파 2jdo
 
4.5부동소수점
4.5부동소수점4.5부동소수점
4.5부동소수점JaeHong Park
 
2012 Dm A0 06 Pdf
2012 Dm A0 06 Pdf2012 Dm A0 06 Pdf
2012 Dm A0 06 Pdfjinwookhong
 
2012 Dm A0 06 Pdf
2012 Dm A0 06 Pdf2012 Dm A0 06 Pdf
2012 Dm A0 06 Pdfkd19h
 
Java세미나 4장 연산자
Java세미나 4장 연산자Java세미나 4장 연산자
Java세미나 4장 연산자Jeung_mh
 

Similar to 2.1 부동소수점 비법들 (8)

Python Sympy 모듈 이해하기
Python Sympy 모듈 이해하기Python Sympy 모듈 이해하기
Python Sympy 모듈 이해하기
 
[컴퓨터비전과 인공지능] 6. 역전파 2
[컴퓨터비전과 인공지능] 6. 역전파 2[컴퓨터비전과 인공지능] 6. 역전파 2
[컴퓨터비전과 인공지능] 6. 역전파 2
 
Haskell study 4
Haskell study 4Haskell study 4
Haskell study 4
 
4.5부동소수점
4.5부동소수점4.5부동소수점
4.5부동소수점
 
06장 함수
06장 함수06장 함수
06장 함수
 
2012 Dm A0 06 Pdf
2012 Dm A0 06 Pdf2012 Dm A0 06 Pdf
2012 Dm A0 06 Pdf
 
2012 Dm A0 06 Pdf
2012 Dm A0 06 Pdf2012 Dm A0 06 Pdf
2012 Dm A0 06 Pdf
 
Java세미나 4장 연산자
Java세미나 4장 연산자Java세미나 4장 연산자
Java세미나 4장 연산자
 

2.1 부동소수점 비법들

  • 1. GPG2권 2.1부동소수점 비법들 IEEE 부동소수점을 통한 성능 향상 김준섭 (트라시르)
  • 2. 목적 정확성을 희생하여 부동소수점 연산 속도를 빠르게 하는 여러 가지 비법 제시 임의의 부동소수점 함수의 최적화를 위한 일반화된 선형 및 대수적 참조 테이블 기법 소개
  • 3. IEEE 부동소수점 표준 부동소수점 트릭 사인 코사인 최적화를 위한 선형 참조 테이블 제곱근에 대한 대수적 최적화 임의의 함수의 최적화 성능 측정
  • 4. IEEE 부동소수점 표준 31 30 0 23 22 s : 부호 e : 바이어스된 지수 m : 정규화된 가수 n = s * 1.m x 2(𝑒−127)   지수는 127이 더해져 바이어스된 형식의 양수 가수는 정규화를 하고 가장 왼쪽의 1.을 생략 e = 255일때 무한대를 표현 E = 0은 숫자가 너무 작아서 지수가 8비트를 넘어갔을 때의 경우
  • 5. IEEE 부동소수점 표준 부동소수점 트릭 사인 코사인 최적화를 위한 선형 참조 테이블 제곱근에 대한 대수적 최적화 임의의 함수의 최적화 성능 측정
  • 6. float/int변환 부동소수점에서정수로의 형 변환을 수행하는 빠른 방법은 부동소수점 수에 1 * 223을 더하고 그 결과에서 상위 지수 비트들을 버리는 것이다.   typedef union { int i; // as integer float f; // as float }INTORFLOAT; INTORFLOAT n; INTORFLOAT bias; bias.i = (23 + 127) << 23; n.f = 43.25; n.f += bias.f; n.i -= bias.i; 수가223보다 작다면 문제 없이 작동하게 된다.  
  • 7. 음의 수 처리 Bias = ((23 + 127) << 23) + (1 << 22)를사용해야 한다. 수가 222보다 작아야 한다.   부동소수점/고정소수점변환 Bias = ((23 – 소수부비트수+ 127) << 23)를 사용한다. int/float 변환 float/int변환을 역으로 적용하면 된다. 일반적인 형 변환으로도 충분히 빠르게 수행할 수 있다.
  • 8. 부호 판정 부동소수점 수의 부호 비트 위치는 정수와 마찬가지이다. 정수 비교를 이용하면 더 빠를 수 있다. 비교 a의지수가 b의 지수보다 크면 가수에 상관없이 a는 b보다 크다. 정수의 파이프라이닝을 사용하여 정수 비교를 하면 더 빠르다. 단 a와 b가 모두 음수인 경우에는 적용되지 않는다.
  • 9. 제한 하나의 값을 특정한 범위로 제한해야 하는 경우가 흔히 생긴다. 부동소수점 수를 0으로 제한하는 것은 부호 비트를 하나의 마스크로 만드는 식으로 처리할 수 있다. f<0이면 f=0으로 제한의 경우 INTROFLOAT ftmp; ftmp.f = f; int s = ftmp.i >> 31; // 부호 비트 마스크를 만든다. s = ~s; // 마스크 비트를 뒤집는다. ftmp.i &= s; f = ftmp.f;
  • 10. f>0이면 f=0으로 제한의 경우 INTROFLOAT ftmp; ftmp.f = f; int s = ftmp.i >> 31; // 부호 비트 마스크를 만든다. ftmp.i &= s; f = ftmp.f; f>1이면 f=1으로 제한의 경우 1을 빼고 0으로 제한하고 다시 1을 더해서 수행한다. 절대값 부호 비트를0으로 설정하면 된다.
  • 11. IEEE 부동소수점 표준 부동소수점 트릭 사인 코사인 최적화를 위한 선형 참조 테이블 제곱근에 대한 대수적 최적화 임의의 함수의 최적화 성능 측정
  • 12. 사인 참조 테이블 구현 2𝜋를 256단계로 나눠서 저장하는 참조 테이블   sintable[i] = (float)sin((double)i * 2.0f * PI / 256.0f) 사인 함수 구현 float fsin( float theta ) { int i = (unsigned int)(theta * (256.0f / (2.0f * PI))) return sintable[i]; } 문제점 느린 float -> int변환을 수행한다. theta의 범위가 (0, 2𝜋) 바깥이면 정수 색인의 범위를 넘어가게된다.  
  • 13. 사인 함수 개선 float fsin( float theta ) { inti; INTORFLOAT ftmp; INTORFLOAT bias = ((23 + 127) << 23) + (1 << 22); ftmp.f = theta * ( 256.0f / ( 2.0f * PI )) + bias.f; //정수 변환 i = ftmp.i & 255; // 마스킹으로 범위 제한 return sintable[i]; }
  • 14. 코사인 cos𝜃= sin(𝜃+𝜋2)의 성질을 이용하면 된다.   코사인 함수 구현 float fcos( float theta ) { inti; INTORFLOAT ftmp; INTORFLOAT bias = ((23 + 127) << 23) + (1 << 22); ftmp.f = theta * ( 256.0f / ( 2.0f * PI )) + bias.f+ 64.0f; i = ftmp.i & 255; return sintable[i]; } 𝜋2는 256/4에 해당 되므로 64를 더하면 된다.  
  • 15. IEEE 부동소수점 표준 부동소수점 트릭 사인 코사인 최적화를 위한 선형 참조 테이블 제곱근에 대한 대수적 최적화 임의의 함수의 최적화 성능 측정
  • 16. 제곱근에 대한 대수적 최적화 제곱근은 지수에 관련된 것이며 가수와는 상관이 없기 때문에, 지수 비트들만 적당히 조작하면 제곱근을 얻을 수 있다. 부동소수점 제곱근 공식 𝑓=1.𝑚×2𝑒 𝑠𝑞𝑟𝑡𝑓  =𝑠𝑞𝑟𝑡(1.𝑚×2𝑒) =𝑠𝑞𝑟𝑡(1.𝑚) ×2𝑒/2   지수가홀수이면 2로 나눴을 때 하위 비트를잃게 된다. 이 문제는 지수의 하위 비트를 가수로 넘겨줌으로써 해결할 수 있다. 𝑠𝑞𝑟𝑡𝑓  =𝑠𝑞𝑟𝑡(1.𝑚×2𝑒0) ×2𝑒/2  
  • 17. 함수 구현 float fsqrt( float f ) { INTORFLOAT ftmp; unsigned int n, e; ftmp.f = f; n = ftmp.i; e = (n >> 1) & 0x3f800000; // 지수를 2로 나눈다. n = (n >> 16) & 0xff; // 테이블 색인은 e0+m22–m16 ftmp.i = sqrttable[n] + e; // 재 바이어스 return ftmp.f; } 제곱근의 지수는 f의 지수를 Rsh 1하면 얻을 수 있다. 지수는 바이어스된 것이므로 1비트 이동시키면 결과적으로 지수뿐만 아니라 바이어스 또한 2로 나눠지게 된다. 원치 않는 결과이므로 추가적인 인수를 더함으로 다시 바이어스 시킨다.
  • 18. IEEE 부동소수점 표준 부동소수점 트릭 사인 코사인 최적화를 위한 선형 참조 테이블 제곱근에 대한 대수적 최적화 임의의 함수의 최적화 성능 측정
  • 19. 임의의 함수의 최적화 하나의 매개변수를 가지는 임의의 부동소수점 함수를 생각해보자. 𝑦=𝑓(𝑥)   사인과 코사인의 경우, 𝑥의값은 선형적 수량화되며 𝑦를 참조하기 위한 테이블 색인으로 쓰인다. 제곱근의 경우, 𝑥의 값은 대수적으로 수량화되며 어떠한 하나의 값을 참조하기 위한 테이블 색인으로 쓰인다.   이 두 기법을 일반화하면 임의의 함수에 대한 최적화를 구현할 수 있다. 선형적, 대수적 수량화를 사용할 것이냐는 함수의 성격에 따라 달라진다.
  • 20. 선형적 수량화 어떤 함수의 정의역(x의범위)이 고정되어 있다고 하자( 즉 𝑥 ∈𝐴, 𝐵) 그러면 범위를 균일하게 포괄하는 하나의 참조 테이블을 만들 수 있으며, 그 범위 안의 x를 테이블에 대한 색인으로 만들 수 있다.  
  • 21. 함수 구현 #define TABLESIZE 256 #define INDEXSCALE ((float)TABLESIZE / (B – A)) float flut( float x) { int i; INTORFLOAT ftmp; INTORFLOAT bias = ((23 + 127) << 23) + (1 << 22); ftmp.f = x * INDEXSCALE + (bias.f – A * INDEXSCALE); i = ftmp.i & (TABLESIZE – 1); return table[i]; } 참조 테이블 구현 sintable[i] = f((float)i / INDEXSCALE + A); 여기서 f는 완전한 정밀도를 가진 보동소수점 값을 돌려주는 “진짜” 함수이다.
  • 22. 대수적 수량화 기본적인 개념은 부동소수점 x를 정수 범위로 변환하는 대신 비트들을 직접 테이블 색인으로 사용한다는 것이다. 기본적인접근 방식은 부호나 지수, 가수의 일부 비트들을 추출하고 조작함으로써 또 다른 임의의 부동소수점 형식으로 변환하는 것이다. 지수로부터 ebits개의 비트들을 뽑고 가수로부터 mbits개의 비트들을 뽑아내는 방법은 다음과 같다. 𝑏𝑖𝑡𝑠=𝑛≫23−𝑚𝑏𝑖𝑡𝑠 & 1≪𝑒𝑏𝑖𝑡𝑠+𝑚𝑏𝑖𝑡𝑠−1   이 코드는 수 n의 가수와 지수 중 원하는 만큼의 비트들을 수n의 가장 오른쪽으로 밀어서 이동시키고, 마스킹AND 연산을 수행하는 것이다. 또 다른 방법은 제곱근 예에서와 같이 지수와 대수 연산을 분해하는 것이다. 𝑓𝑥=𝑓1.𝑚×2𝑒=𝑓1(1.𝑚)×2𝑓2(𝑒)   8 비트 가수 m을 이용해서 f1을 256 항목의 참조 테이블로 근사하고 f2는 지수 e에 대한 정수 연산으로서 직접 계산할 수있다.
  • 23. IEEE 부동소수점 표준 부동소수점 트릭 사인 코사인 최적화를 위한 선형 참조 테이블 제곱근에 대한 대수적 최적화 임의의 함수의 최적화 성능 측정
  • 24. 이론상으로 멋진 최적화 기법도 실제 구현에서는 안하느니만 못한 결과를 낳을 수 있다. 뭔가를 변경했다면 성능이 향상되었는지 짚어봐야 한다. 펜티엄 컴퓨터의 경우 rdtcs(read time stamp counter) 명령을 이용해서 현재의 CPU 사이클 카운트를 얻을 수 있다. 일관적인 타이밍 결과를 얻기 위해서는 cpuid처럼 명령 캐시를 비우는 명령을 사용하도록 권장하고 있다. 절대적 시간을 얻어야 하는 경우 사이클 카운트를 프로세스의 실행 속도(MHz)로 나누면 초단위시간을 얻을 수 있다. Vtune이나 TrueTime같은 도구들도 고수준 프로파일링에 유용하다. Inter VTune
  • 25. Q/A