[Q] ARM에서 곱하기가 빠를까요, 쉬프트&덧셈이 빠를까요?ㅋ
글쓴이: lovelyphy07 / 작성시간: 월, 2010/02/01 - 4:16오후
아, 이 문제 한번 같이 고민해보았으면 좋겠습니다.
현재 ARM에서 임베디드 프로그래밍을 하고 있는데요, 영상에서 YUV포맷을 입력받아 RGB로 변환하는 루틴을 작성하고 있습니다.
이게 좀 복잡한 숫자가 다뤄지는데요, 예를들어 41881*Cr/65536 뭐 이런 계산을 각 픽셀마다 수행합니다.
저 계산이 느려서, 한번 (41881*Cr)>>16으로 해보았는데도 느리네요. 느리다는 것은 변환된 이미지를 다시 Frame Buffer에 뿌려 확인하는데
Twinkling, 그니까 연속으로 안보이고 매 프레임마다 끊어져 보인다는 것입니다.
혹시나 해서, 41881을 이진수로 바꾼뒤, shl(shift left) 매크로 함수를 만들어서 쉬프트&덧셈으로 곱셈을 대체해보았습니다.
41881은 복잡하니까 뭐 13을 예로 들면, 이진수로 1101이니까, 13*Cr = shl(Cr, 3) + shl(Cr, 2) + Cr로 대체할 수 있죠.
이렇게 했더니 Twinkling 현상이 사라졌습니다!
=_= 아.. 그런데 이거, 멀티플라이어가 후졌다는 건가요? 암만 후져도 분명 한 싸이클 안에 계산될텐데 말이지요.
싸이클 수로 따지자면 쉬프트&덧셈이 훨씬 긴데 말이지요. 이런 패러덕스가 ㅠ
역어셈하고 싶은데 어떻게 해야할지를 모르겠습니다;; 이 문제를 어떻게 설명해야할까요?
Forums:
assembly상의 single
assembly상의 single instruction이 single cycle이 걸린다는 얘기는 아닙니다. 비싼 instruction이 존재하고 multiplier가 그중하나가 되겠죠. 마찬가지로 branch관련 instruction들도 "비싼" instruction입니다.
ㅠ 제가 아는 것이 적습니다;
파이프라인 프로세서라면 ALU 명령어는 ALU Stage 안에서 다 끝나야 하는 것이 아닌가요?;;
분기 명령어는 또 다른 얘기겠지만요..
저도 많이 아는 것은 아닙니다만,
최근에 학교에서 m68k로 어셈블리하면서 명령마다 사이클·페이즈(?) 수 같은것도 계산하면서 사용했는데, 곱셈명령은 다른 간단한 ALU명령에 비해서 7~9배 정도 더 먹습니다.
이를테면, 같은 피연산자를 대상으로 ADD,SUB:8,10, MULU: 74 DIV:144,162클록씩 걸립니다.
프로세서가 알아서 몇번 더 계산하는 것 같네요.
그에 비해서 시프트는 거의 얼마 안걸리니까요.(10+2n클록. n은 시프트하는 개수라는데... 실험시간에 만들었던 ALU하고는 좀 다른듯. 그땐 몇개던지 한번에 시프트 했는데.)
m68k가 좀 오래된 프로세서기는 합니다만, ARM이라고 이 면에서 많이 다를거 같지는 않습니다.
ARM매뉴얼에도 각 명령별 계산시간같은게 있을테니까 참조하시면 좋을듯 합니다.(그런데 ARM은 매뉴얼 공짠가요?)
P.S. ARM은 FPU같은거 붙어 있나요?
어떤 컴파일러를
어떤 컴파일러를 사용하시는지는 모르겠지만
gcc 의 경우 대문자 -S 옵션을 붙이면 어셈블리 파일로 만들어줍니다.
물론 소스코드는 있어야 하구요.
ARM에서 배포하는 컴파일러도 크게 다르지 않을겁니다.
컴파일러 옵션을 찾아보시기 바랍니다.
ARM CPU에서는 더하기
ARM CPU에서는 더하기 보다도 빼기가 더 빠릅니다.
왜 그런지는 하드웨어 전공이 아니라서 잘 모르겠고..
임베디드 코드 최적화에 관심이 있으시면 다음 책을 한번 읽어보시기 바랍니다.
http://www.yes24.com/24/goods/2849712?scode=032&srank=1
굳이 구매하지 않고 대형서점 코너에 가서 그냥 보셔도 도움이 될겁니다.
필요하다 싶으면 나중에 구매해도 되는거니까요.