문서 중 언급하신 부분의 표들 중
요즘 주로 사용하는 core 시리즈는 06_xx 를 보시면 될 겁니다.
문서에는 32-bit imul이 3 cycles, fmul이 5 cycles로 되어 있네요.
64-bit imul에 대해서는 못찾았구요. 아마 5 cycles 정도 일 겁니다.
애초에 궁금하신 것이,
비슷한 연산량에 대해 고정소수점 버전이 2배 정도 느린데,
그것이 납득할 만 한 것인지, 버그가 있는 것인지 하는 것이라면..
버그가 없어도 성능이 느린 것은 충분히 납득할 수 있겠으나,
두 배 정도나 차이나는 것은 그 원인이 하도 다양해서
코드를 보기 전에는 설명이 불가능 할 것 같고
그렇다고 실제 버그가 없는지도 알 수 없는 일이라는
뻔한 얘기 밖에는 못하겠네요.
유효숫자로 인한 오차가 중요한 계산이 아니라면,
그냥 속 편하게 부동소수점을 사용하시는 것이 좋다고 생각합니다.
intel cpu에서는 꽤 오래 전 부터 imul을 fp unit에서 계산해왔거든요.
FPU에서 부동소수점 연산을 하나,
intel x86 명령으로 정수연산으로 하나 비슷하다 치더라도,
실제 code로 돌려보면
정수연산이 빠르게 나올겁니다.
FPU로 연산하려면, cpu 레지스터에 있는 값을 FPU stack으로 전달해야 하는데,
이 처리량도 감안해야 합니다.
"보통 PC 환경"이 워낙
"보통 PC 환경"이 워낙 다양하긴 하지만.. ^^;
요즘 많이 쓰는 intel core2 의 경우,
32-bit imul: 3 cycles,
64-bit imul: 5 cycles,
32, 64-bit fmul: 4 cycles
의 latency를 가지는 것으로 기억합니다. (레퍼런스는 찾기가 귀찮아서;;; )
요즘처럼 트랜지스터가 남아도는 시대에는
PC용 코어에서 부동 소수점 연산을 빠르게 구현하는 것은 큰 문제는 아닙니다만,
DSP의 경우는 부동 소수점 연산 장치가 달리지 않은 코어가 더 많은 것으로 압니다.
경우에 따라 쓸 일이 거의 없을테니까요.
혹시 reference를
혹시 reference를 정확히 알 수 있을까요??
http://www.intel.com/Assets/PDF/manual/248966.pdf
문서의 C.3에 있는 어떤 instruction인지 알기가 어렵네요..
a, b가 32bit integer일때,
그리고 FMUL에서의 곱셈, ((int64)(a)*(int64)(b)) 는
32bit imul인가요?, 64bit imul인가요?
답글이 없어 위로
답글이 없어 위로 끌어올립니다.
질문이 이상한가요?
두번째 32bit vs 64bit 은 저는 당연히! 64bit mul이라고 생각하는데,
32bit mul라는 주장이 있어서 제 상식에 문제가 있는건가 자문 구합니다..
제 주장은.
요즘 펜티엄 이상급의 CPU들은
FPU를 가지고 있기 때문에, 부동소숫점 연산이 그닥 느리지 않습니다.
위의 질문에서 간과한 것은,
정수곱셈이 실제로 몇 cycle 빠르다 할 지언정,
실수곱셈을 그대로 하는 것보다 느린 이유는,
casting에 있지 않나 합니다.
그리고, 아랫부분에 말씀하신 것은
64bit 곱셈으로 될 것입니다.
casting 하셨잖아요.
답글이 달린 줄
답글이 달린 줄 모르고 있었네요. ^^;
문서 중 언급하신 부분의 표들 중
요즘 주로 사용하는 core 시리즈는 06_xx 를 보시면 될 겁니다.
문서에는 32-bit imul이 3 cycles, fmul이 5 cycles로 되어 있네요.
64-bit imul에 대해서는 못찾았구요. 아마 5 cycles 정도 일 겁니다.
애초에 궁금하신 것이,
비슷한 연산량에 대해 고정소수점 버전이 2배 정도 느린데,
그것이 납득할 만 한 것인지, 버그가 있는 것인지 하는 것이라면..
버그가 없어도 성능이 느린 것은 충분히 납득할 수 있겠으나,
두 배 정도나 차이나는 것은 그 원인이 하도 다양해서
코드를 보기 전에는 설명이 불가능 할 것 같고
그렇다고 실제 버그가 없는지도 알 수 없는 일이라는
뻔한 얘기 밖에는 못하겠네요.
유효숫자로 인한 오차가 중요한 계산이 아니라면,
그냥 속 편하게 부동소수점을 사용하시는 것이 좋다고 생각합니다.
intel cpu에서는 꽤 오래 전 부터 imul을 fp unit에서 계산해왔거든요.
인텔 CPU 매뉴얼에는
인텔 CPU 매뉴얼에는 명령어당 걸리는 클럭수가 표기되지 않고 있는데(복잡한 파이프라인 단계와 OOO의 영향 때문에 정확한 클럭을 적기가 애매하죠), 어떻게 알고 계신지 모르겠네요.
위 코드가 실제 CPU에서 어떻게 처리되는지 얘기하자면
첫번째꺼는 부동소수점 명령어 한방에 끝나지만,
두번째는 두 변수를 먼저 정수변환한 뒤 정수곱셈을 수행해야 합니다. 결과치를 부동소수점으로 요구한다면 이 정수를 다시 부동소수로 바꿔줘야 하고요.
기계의 특성에 따다 다를겁니다. 부동소수점을 emulation하는식으로 돌아간다면 첫번째가 느리겠지만, FPU 있다면 거의 대부분 두번째안이 느리다고 할 수 있습니다.
** 정수는 덧셈, 뺄셈이 쉽지만 부동소수점은 곱셈, 나눗셈이 더 쉽습니다. 부동소수점 덧셈과 뺄셈은 자리수 맞춰야하기 때문에 복잡하죠.
Written By the Black Knight of Destruction
Written By the Black Knight of Destruction
부동소수점 <->
부동소수점 <-> 고정소수점 간 변환 코스트는 없습니다.
별도로 존재하는 2개의 프로그램입니다.
fpu가 있는 기계에서 느릴수있다고 할때 어느 정도까지 느린가가 궁금합니다.
비슷한 연산량에 대해서 현재 고정소수점 버전이 약2배정도 느린데.. (덧셈/곱셈 연산량이 굉장히 많습니다.)
이게 납득이 가능 상황인지, 다른 버그등의 팩터가 있는것인지가 궁금합니다.
latency나 throughput은 매뉴얼에 있긴 하더군요.
그런데 최적화관련하여 변수가 많아 그걸로 따지기는 어려울거 같기도하고요.
native 64-bit processor가 아니라면 64비트 정수 곱셈은 32비트 곱셈을 3회 이상 할 겁니다.
꼭 64비트로 형변환을 해야할 이유가 없다면 32비트로 처리하는게 빠를겁니다.
그리고 Core 2 쪽은 IMUL에 대해 활성화 되는 유닛이 FP_MUL이더군요.
내부 계산 속도가 부동 소수점 쪽이 빠른 건지도 모르겠습니다.
fpu 전달
FPU에서 부동소수점 연산을 하나,
intel x86 명령으로 정수연산으로 하나 비슷하다 치더라도,
실제 code로 돌려보면
정수연산이 빠르게 나올겁니다.
FPU로 연산하려면, cpu 레지스터에 있는 값을 FPU stack으로 전달해야 하는데,
이 처리량도 감안해야 합니다.
댓글 달기