programming/Code_Optimization
최적화 (code optimization)
반응형
보통 최적화를 수행할때, 어느 정도 수준까지 최적화를 달성 할수 있을까 하는 의문을 갖게 되는데,
실제로 최적화는 기존의 상식을 뛰어 넘는 수준 까지 가능하다.
예를들어, flexible한 S/W 계산을 위해서 탄생한 DSP processor에서의 최적화의 경우는
보통 95%~98%의 최적화까지 달성할 수 있다.
95%정도의 최적화를 달성하는 것은 단순하게 C, C++ level에서 가능하다.
우리가 많이 알고 있는 최적화 기법들 10가지 정도를 사용하여 달성 가능한 수준이다.
나머지 3%는?
사실 이 나머지에 대한 최적화는 compiler에 따라 다를 수 있다.
좋은 assembly code를 generate할 수 있는 compiler라면, assembly 최적화에 대한 개선도는 10% 내외이다.
그러나 compiler가 좋지 않다면? assembly code에 대한 최적화의 개선도는 10%를 휠씬 더 많이 상회하게 된다.
Assembly level에서 최적화를 많이 달성하기 위해서는 단순한 assembly code의 최적화는 의미가 없다.
아이러닉 하게도, 예를들어 load, store가 대부분인 코드의 최적화는 해 봐야, 오히려 더욱 더 증가된 cycle의 결과를 확인할 수 있을 것이다.
assembly level의 최적화는 hardware architecture를 정확히 이해 한 다음에야 가능하다. ARM의 NEON, INTEL의 MMX, TI의 circular buffer등, 해당 hardware architecture가 제공 해 주는 기능을 정확히 사용해야 달성 가능한 기법들이다.
이 외에도, compiler 이론, 혹은 computer architecture에서 언급하고 있는, data dependency, control dependency
RAW, WAW, RAR 등의 특징을 파악해서 assembly 단에서 최적화를 수행 할 수도 있으며, TI DSP의 특징인 Sample period를 개선하기 위한 graph의 개선을 수행하여 instruction scheduling table을 개선 시키는 최적화를 수행 할 수도 있다.
무엇보다도 가장 좋은 최적화는 구조의 변경이다.
쓸데 없는 코드를 제거 하고, 잘못된 연산 흐름을 개선 시키는 것이 무엇보다 중요하다.
간단하게 GSM-AMR codec의 최적화에 대한 profile 결과를 참고 하도록 하자. (아래 그림)
(bold로 표시한 부분이 최적화를 실제로 어느 정도 - 완전히는 아님 - 수행한 function이다. - 이 부분의 코드가 전체적으로 가장 중요하기 때문이다. - 20:80 rule)
반응형
댓글