|
열씸! 님이 쓰신 글 :
: FPU는 부동소수점 연산 장치입니다. 정수 연산에선 의미 없습니다.
:
: 정수를 먼저 예로 들죠
: 1. 덧셈과 뺄셈은 2의 보수 표현을 쓸 뿐이므로 사실상 같습니다.
:
: 2. 인텔 80486 이하의 CPU들에선 곱셈과 나눗셈은 비트연산이나 덧셈 연산들에 비해
: 확실히 느렸었습니다만. 펜티엄 이상에선 정수의 덧셈 곱셈이 거의 동일한 사이클에 수행됩니다.
:
: 3. / 나눗셈과 % 나머지는 똑같이 DIV(부호가 있을 경우 IDIV) 연산을 거치게 됩니다.
: DIV 연산의 결과 몫과 나머지가 분리되 두 개의 기억장소로 나뉘어 저장되는데
: 그 둘 중 몫만 쓰는게 / 고, 나머지를 쓰는게 %죠.
:
: 4. 486 이하의 과거시절엔 비트 연산 두번에 덧셈을 섞는게 곱셈 나눗셈 보다 두배는 빨랐습니다.
: 예를들어 성능을 고려한 코드에선 y * 640 을 하는 대신 (y << 9 ) + (y << 7) 을 했었죠.
: 포팅성을 고려한다거나 인텔 호환 CPU에서의 발열 / 에너지 소모 문제를 고려한다고 해도
: 상대적으로 간단한 instruction을 사용하는게 의미는 있지만,
: 과거처럼 곱셈 한번을 몇개의 비트연산 조합으로 사용하는건 오히려 성능에 장애를 주죠.
: 따라서 비트 연산 하나로 처리할 수 있는 연산들만 비트 연산을 사용하는게 좋습니다.
:
: 예>
: 2의 승수 형태로 표현되는 값의 곱셈, 나눗셈, 나머지 연산
: a * 1024 ----> a << 10
: a / 64 ----> a >> 6
: a % 128 -----> a & 127
:
: 실수 연산의 경우를 잠시 언급하죠.
:
: 부동소수점 표현 매카니즘은 [부호 1비트 + 지수부 8비트 + 히든 비트 1 비트 + 가수부]
: 로 나뉘어 집니다. float 든 double 이든 long double 이든 말이죠.
: 이 매카니즘은 연산이 복잡하기 때문에, 펜티엄4라 하더라도 겔겔 대게 됩니다.
: 따라서 속도가 중요하다면 고정소수점(실은 정수) 형태로 변환해서 사용하셔야 하고,
: 함수 호출을 자제하고, 가능한 부분은 매크로함수로 정의하거나 인라인 함수, 인라인 어셈블리와
: 병행해서 처리하셔야 합니다.
:
: 고정소수점 최적화에 관한 내용은 게임 최적화 관련 문서들에서 흔히 접하실수 있습니다.
|