(주) 언제나 그렇듯이 지극히 개인적인 관점이 포함되어 있습니다.
(주) 인텔 C++ 컴파일러는 Evaluation version을 다운받아서 테스트 해볼 수 있습니다.
등록하면 한달짜리 라이센스를 보내줍니다.
인텔 C++ 컴파일러의 최적화 능력을 테스트 해보도록 하겠습니다.
프로젝트로 최적화에 관련된 프로젝트가 있는데, 이리저리 손파일러로 최적화를 하고 있지만,
속도올리기가 힘들어져서 아예 이번에는 플랫폼을 바꾸어서 하기로 하였습니다.
인텔 기반 최적화에 관해서는 지원해주는 툴셋이 여러가지가 있지만,
intel c++ 컴파일러에서 최적화를 수행하기로 하였습니다.
몇가지 장점이 있지만, 무엇보다도, visual c++에서 통합하여 개발 할 수 있고
(그렇다고 하지만 저는 Text Base에서 코딩합니다.)
또 코드상에 숨어있는 vector 연산등을 찾아내어서 최적화시켜주는 능력등이 탁월합니다.
일단 대상으로 선정한 것은 그래픽도 나오는 이쁘장한 것으로 Intel TBB의 예제로 주어지는 tachyon입니다.
화면상에 7000여개의 오브젝트를 그리는 프로그램인데요, TBB의 예제로서 제공되기 때문에
Serial과 TBB도 함께 비교할 수 있습니다.
Serial이란 것은 Thread를 생성하지 않고 순차적으로 프로그램을 실행하는 방식입니다.
TBB는 프로그램을 thread로 잘라서 실행하는 것을 도와주는 라이브러리입니다.
Makefile을 가지고 컴파일하면 g++을 이용해서 컴파일하도록 되어 있습니다.
그래서 g++로 컴파일하는 코드를 인텔 C++컴파일러인 icc로 바꾸어서 최적화 옵션을 주어가면서
최적화 결과를 보도록 하겠습니다.
다만, 다른 코드도 테스트를 겸하기 위해서 tbb 라이브러리를 호출해서 사용하는 것을 사용하기로 하였습니다.
지금 진행하는 프로젝트에서도 tbb도 중요한 최적화의 포인트이기 때문입니다.
아래와 같은 경우를 모두 테스트 해봅니다.
g++로 할 경우
g++ + Thread Building Block 1d를 이용 할 경우
g++ + Thread Building Block 2d를 이용 할 경우
intel c++로 할경우
intel c++ + Thread Building Block 1d를 이용 할 경우
intel c++ + Thread Building Block 2d를 이용 할 경우
intel c++ + parallel optimzation 을 수행 할경우
intel c++ + parallel optimzation 을 수행+ Thread Building Block 1d를 이용 할 경우
intel c++ + parallel optimzation 을 수행+ Thread Building Block 2d를 이용 할 경우
intel c++ + performance guide optimizaton + parallel optimzation 을 수행 할경우
intel c++ + performance guide optimizaton + parallel optimzation 을 수행+ Thread Building Block 1d를 이용 할 경우
intel c++ + performance guide optimizaton + parallel optimzation 을 수행+ Thread Building Block 2d를 이용 할 경우
을 할 경우로 한다. 모두 12가지 경우를 테스트 하는 것이 되네요
아래 그림은 Serial로 그리는 경우에 대한 그림입니다.
한번에 하나씩 차례로 그려 나갑니다.
마지막 그림은 TBB2D를 사용한것입니다.
일정 블럭단위로 쪼개서 계속 그려나가는 그림입니다.
다만 정확하게 할려면 같은 프로그램을 100번 이상 수행해서 그 평균을 내야 하지만,
귀차니즘이 있어서리.. 그냥 한 두번 수행한 결과임을 미리 밝힙니다. (개인적인 참고 자료여서 굳이 100번이상이나 할 필요가.. )
대상으로 하는 프로그램은 TBB의 예제중 하나인 tachyon 이다.
각각의 것으로 실행하여 수행시간을 측정한 결과는 아래에 표시된 것과 같습니다.
g++ intel c++ intel c++ + parallel icc + parallel + pgo
serial 26.640 20.617 20.635 19.673
tbb1d 10.243 9.635 9.459 8.646
tbb2d 9.733 9.068 8.885 7.921
최종 최적화 결과와 최초의 결과를 비교하면
3.36배가 빨라졌습니다. 가장 느린것 대비 29.7%의 수행 시간을 가집니다.
컴파일러를 바꾸고 옵션을 바꾸어서 최적화를 수행하면 코드를 건드리지 않고도 위와 같이 3배 이상 빨라진다는 것을 알수 있습니다. 음.. 코드를 바꾸지 않은것은 아니네요, serial 에서 tbb1d로 바꾸는것이나 tbb2d로 바꾸는 것은 최적화를 위해서 코드를 바꾸는 것이 됩니다.
같은 레벨의 코드에서 그냥 icc+parallel+pgo 를 하였을때 약 20% 정도 빨라지는 것을 알 수 있습니다.
pgo란 profile guided optimization의 약자로서, 컴파일을 두번해서 최적화 하는 것입니다.
1차 컴파일시에 컴파일러는 여러가지 예측을 통해서 최적화를 시도하지만, 그 결과가 예측이 안되는 경우가 많습니다. 상황에 따라서 알쏭달쏭 한 부분을 모두 기억하고 있다가, 프로그램이 실행되면 실제 동작되는 정보를 얻습니다. 그리고 그걸 기반으로 2차 컴파일시에 확신을 가지고 최적화 선택을 하게 됩니다. 이런 방식으로 동일한 코드에서도 20%정도 빨라진 효과를 거둘 수 있는 것입니다.
우숩게 보일지 모르지만 초당 20fps를 할 수 있는 h.264 code를 손도 안되고 20% 빨리 하여서 초당 24fps를 달성 할 수 있는 것입니다. 최적화는 해보신 분들만 아실수 있는 문제가 어느정도 최적화를 진행하다 보면 진도가 잘 나가지 않아서 1% 올리는 것도 정말 힘들게 됩니다. 열심히 해도 표시도 잘 안나는 영역에 도달하면, 개발자도 관리자도 모두 힘들어지는 것입니다.
그 숨겨진 1%를 찾기 위해서 엄청난 고생을 해야할 때가 많습니다. 그것을 도구를 (어찌보면 반칙일 수 있는..) 사용해서 달성하는 것이 가능하다면 그만큼 가치가 있다고 생각합니다.
그외에도, 숨겨진 최적화 옵션을 찾아서 적용해보면 더욱 빨라 질수 있을것입니다.
물론 최고의 최적화는 사람의 머리입니다.(일명 손파일러, 헤드파일러). 아무리 툴이 발달하고, 좋아져도, 결국 궁극의 최적화는 사람의 머리에서 나오는 알고리듬 효율의 극대화입니다. 하지 않아도 되는 일을 열심히하는 컴파일러의 작업을 최적화하는 것 보다는 그런것을 찾아서 삭제하는 사람의 머리에서 나오는 최적화가 훨씬 좋다는 것은 당연하겠지요.
(주) OpenCV를 ICC로 빌드해놓긴 헀습니다만 속도 비교할 만한 예제를 찾지 못하였습니다.
- 빠른지 어떤지를 확인하기 위해서는 가능하면 무거운 프로그램을 가지고 테스트를 해야 하는데요
그정도로 무거운 프로그램을 돌리지 않아서 비교하지 못하였습니다
'Embedded' 카테고리의 다른 글
LVDS Owner’s Manual [3] (0) | 2009.05.16 |
---|---|
LVDS Owner’s Manual [2] (0) | 2009.05.15 |
LVDS Owner’s Manual [1] (0) | 2009.05.14 |
EISC 코드를 맥에 컴파일 하기 (2) | 2009.01.16 |
2008년 10가지 Embedded Design 컬럼 (0) | 2009.01.03 |