programming/Code_Optimization

최적화 (code optimization)

Roien 2015. 3. 10.
반응형

보통 최적화를 수행할때, 어느 정도 수준까지 최적화를 달성 할수 있을까 하는 의문을 갖게 되는데,

실제로 최적화는 기존의 상식을 뛰어 넘는 수준 까지 가능하다.

예를들어, 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)


반응형

댓글