[Q] ARM에서 곱하기가 빠를까요, 쉬프트&덧셈이 빠를까요?ㅋ

lovelyphy07의 이미지

아, 이 문제 한번 같이 고민해보았으면 좋겠습니다.

현재 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 현상이 사라졌습니다!

=_= 아.. 그런데 이거, 멀티플라이어가 후졌다는 건가요? 암만 후져도 분명 한 싸이클 안에 계산될텐데 말이지요.

싸이클 수로 따지자면 쉬프트&덧셈이 훨씬 긴데 말이지요. 이런 패러덕스가 ㅠ

역어셈하고 싶은데 어떻게 해야할지를 모르겠습니다;; 이 문제를 어떻게 설명해야할까요?

MasterQ의 이미지

assembly상의 single instruction이 single cycle이 걸린다는 얘기는 아닙니다. 비싼 instruction이 존재하고 multiplier가 그중하나가 되겠죠. 마찬가지로 branch관련 instruction들도 "비싼" instruction입니다.

lovelyphy07의 이미지

파이프라인 프로세서라면 ALU 명령어는 ALU Stage 안에서 다 끝나야 하는 것이 아닌가요?;;

분기 명령어는 또 다른 얘기겠지만요..

QuietJoon의 이미지

최근에 학교에서 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에서는 더하기 보다도 빼기가 더 빠릅니다.
왜 그런지는 하드웨어 전공이 아니라서 잘 모르겠고..

임베디드 코드 최적화에 관심이 있으시면 다음 책을 한번 읽어보시기 바랍니다.

http://www.yes24.com/24/goods/2849712?scode=032&srank=1

굳이 구매하지 않고 대형서점 코너에 가서 그냥 보셔도 도움이 될겁니다.
필요하다 싶으면 나중에 구매해도 되는거니까요.