Profile-guided optimization in Visual Studio 2005
Visual Studio 2005에는 Profile-guided optimization(PGO)이라는 기능이 추가되었다. 우리말로 의역을 하자면 "프로그램 실제 실행 결과를 이용한 최적화" 정도가 될 것이다.

컴퓨터 공학자들의 목표 중 가장 큰 것은 더 빠른 컴퓨터를 만드는 것. 그 중에서도 가장 밑 바닥에서 고생하는 사람들이 CPU와 컴파일러를 연구하는 사람들일 것이다. 프로그래머가 짠 코드를 그 원래 의도를 해치지 않는 범위 안에서 CPU와 컴파일러는 온갖 기교를 이용하여 속도 향상을 꾀한다. 프로그램 최적화는 CPU (동적) 그리고 컴파일러 (정적) 두 군데서 이루어진다.

(1) CPU: 주어진 프로그램을 순서대로 차곡차곡 실행하는 (학부 컴퓨터 구조 시간에 배우는) CPU는 이제 박물관에서나 구경할 수 있다 (Itanium 같은 VLIW/EPIC CPU들은 순차적으로 수행을 하기도 함). 파이프라인으로 속도를 높이지만 여전히 in-order 즉, 순서대로 처리한다. 최근 CPU는 미리 수십개 혹은 백여개의 명령어를 미리 가져온 뒤, 그 안에서 최대한의 병렬성을 찾는다. 그런 뒤 이들을 최대한 동시에 실행을 시킨다. 수퍼스케일러, 하이퍼스레딩 같은 기술은 최대한 CPU의 각종 자원들을 놀리지 않고 바쁘게 돌려서 성능 향상을 꾀한다.

(2) 컴파일러: 컴파일러 본연의 임무인 번역 외에 최근 컴파일러는 무척이나 많은 최적화를 수행한다. switch 문은 점프 테이블을 만들기도 하고, 사용하지 않는 변수는 알아서 다 제거, inline을 굳이 쓰지 않아도 코드의 양이 작다면 바로 inline을 해버리기도 하고, 함수 호출 관계를 그래프로 그려 더 고차원적인 최적화를 수행하기도 한다.

CPU는 실시간으로 명령들을 수행하기 때문에 프로그램의 동적인 상태를 자연스럽게 알 수 있다. 어떤 프로그램은 입력 값에 따라 그 작동 상태가 사뭇 다를 수가 있다. 그러나 컴파일러는 단순히 소스 코드만 가지고 분석을 해야하기 때문에 이런 동적인 변수를 고려할 수 없다. 한편, CPU는 매우 짧은 시간에 매우 한정된 자원을 이용하여 최적화를 수행해야하지만 컴파일러는 그렇지 않다. 코드 전체를 다 볼 수도 있고 훨씬 긴 시간을 이용하여 정교한 알고리즘을 이용할 수 있다.

기존의 컴파일러 최적화가 정적인 분석을 하였다면, PGO를 지원하는 컴파일러는 실제 수행 결과를 기반으로 보다 더 풍부한 최적화를 할 수 있다. MS 홈페이지의 광고를 보면 아래와 같이 PGO 기능을 자랑하고 있다.
나도 이 기능을 이용해서 프로그램을 돌려보았는데 아직 정량적으로 얼마나 성능이 늘었는지는 측정하지 못하였다. 간단한 테스트 코드를 짜서 실험을 할 수도 있을 것인데, 일단 시간관계상 생략. (...)


이 기능의 사용 방법은 MSDN을 참고하면 된다. 실제 사용법에 대해서 쓰려니 너무 길어질 것 같아서 간략하게 PGO가 가지는 의미만 이 포스팅에서 쓴다.

대략적인 원리는 특정 옵션을 켠 뒤 빌드를 새롭게 한다. 이 과정을 instrumentation라고 부르는데, 프로파일 정보를 얻기 위해 컴파일러가 부가적인 코드를 집어넣는 것을 뜻한다. 그리고 실제로 프로그램을 돌리면 .pgd 파일이 생성된다. 그리고 이제 이 파일을 가지고 컴파일러가 최적화를 할 수 있도록 다시 빌드를 한다.


이렇게 PGO를 이용하면 실제 실행 정보를 바탕으로 즉, 동적인 정보도 이용하여 보다 최적화된 코드를 만들 수 있다. MSVC 컴파일러가 .pgd를 가지고 수행하는 최적화 중 몇 개를 소개하면:

(1) Virtual Call Speculation: 가상 함수 호출은 생각보다 비용이 비싸다. 왜냐면 어떤 주소로 점프를 해야할지 미리 알 수가 없다. 이 주소가 계산될 때 까지 일반적인 CPU는 일을 할 수 없다. 어디로 가야할지 모르기 때문이다. 일반적인 if/while 같은 분기문의 경우, 분기 예측으로 예측 실행을 할 수 있지만, 가상 함수와 같은 indirect branch는 branch table buffer를 이용하여 목적지까지 예측을 해야한다. 그런데, 만약 특정 가상 함수가 아주 많은 빈도로 불린다면? PGO는 이 정보를 얻어서, 자주 불리는 가상 함수가 바로 호출되도록 코드를 수정한다. 물론 아닐 경우는 다시 복구가 되도록 한다. 그래서 가상 함수 호출 비용을 줄일 수 있다.

(2) Basic Block Optimization: 캐쉬 효율성을 높이기 위해 자주 실행되는 기본 블럭을 인접하게끔 배치되게 한다. 멀리 떨어져있는 코드가 빈번히 실행된다면 cache miss가 많이 발생되고 성능은 당연히 하락될 것이다. 실제 캐쉬 미스가 갑자기 증가하면 성능 하락은 상당히 심각하게 발생한다. 데이터를 배치할 때도, 자주 사용하는 자료구조는 같은 캐쉬 라인에 들어가게끔하는 것이 좋다. (물론 멀티 프로세서 환경에서는 false sharing이라는 골치아픈 경우가 벌어지기도 한다.)


...

쓰고보니 그냥 MSDN을 해석한 수준 밖에 되지 않군요. 아무쪼록 조금이라도 성능을 더 높이고 싶다면 PGO 기능을 적극 사용해보심이 어떨런지요.
by object | 2007/01/04 18:57 | 컴퓨터 | 트랙백 | 핑백(6) | 덧글(8)
트랙백 주소 : http://minjang.egloos.com/tb/767997
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Linked at art.oriented : V.. at 2008/03/06 04:55

... 더 훌륭해진 컴파일러컴파일러만 놓고봐도 VS 2005 이상을 써야할 이유가 충분하다. MS compiler extension이긴 하지만 편리한 키워드도 추가가 되었으며, profile-guided 최적화도 가능하고, 컴파일러 메세지도 보다 친절해졌으며, OpenMP도 그냥 지원이 된다. C99 기능들은 지원하지는 않지만 훨씬 C++ 표준에 부합된 프론트엔드를 가지 ... more

Linked at Death : Rebirth .. at 2008/03/06 09:41

... 더 훌륭해진 컴파일러컴파일러만 놓고봐도 VS 2005 이상을 써야할 이유가 충분하다. MS compiler extension이긴 하지만 편리한 키워드도 추가가 되었으며, profile-guided 최적화도 가능하고, 컴파일러 메세지도 보다 친절해졌으며, OpenMP도 그냥 지원이 된다. C99 기능들은 지원하지는 않지만 훨씬 C++ 표준에 부합된 프론트엔드를 가지 ... more

Linked at jelly's 노트생각 : V.. at 2008/07/24 13:44

... 더 훌륭해진 컴파일러컴파일러만 놓고봐도 VS 2005 이상을 써야할 이유가 충분하다. MS compiler extension이긴 하지만 편리한 키워드도 추가가 되었으며, profile-guided 최적화도 가능하고, 컴파일러 메세지도 보다 친절해졌으며, OpenMP도 그냥 지원이 된다. C99 기능들은 지원하지는 않지만 훨씬 C++ 표준에 부합된 프론트엔드를 가지 ... more

Linked at 메모장 : PGO (Profi.. at 2008/09/28 21:02

... 비용을 줄일 뿐 아니라 부가적으로 함수 인라인이 되는 효과가 있어서 성능 향상을 얻을 수 있다.참고:마소 2008년 8월호 117p,121p 의 내용http://minjang.egloos.com/767997 ... more

Linked at Dreaming Of Plat.. at 2009/08/18 15:26

... profile-guided 최적화</a><a title="다음 링크를 새 창으로 엽니다. : 'profile-guided 최적화'" style="PADDING-LEFT: 15px; BACKGROUND: url(/plugins/NewWindowLink/newwindow.gif) no-repeat 0px 50%; BORDER-TOP-STYLE: none; MARGIN-RIGHT: -0.5em; BORDER-RIGHT-STYLE: none; BORDER-LE ... more

Linked at 시험さま : Profile-g.. at 2011/07/05 14:05

... Profile-guided optimization in Visual Studio 2005 http://minjang.egloos.com/767997switch vs if 어떤 때 어느게 효율적인가요? http://kldp.org/node/62262 ... more

Commented by 학주니 at 2007/01/05 10:15
흑.. 아직까지 환경문제로 인하여 VS6을 사용하고있는 입장에서 저 기능은 그림의 떡이군요.. T.T
VS2005에서도 .NET 접근없이 일반 어플을 컴파일 할 수 없는지(왜 VS6에서 컴파일하면 잘되고 VS2005에서 컴파일하면 뭔가 이상할까요?).. -.-;
Commented by object at 2007/01/05 13:28
많은 분들이 여전히 혼동하시는 것이 Visual Studio .NET 2003이나 Visual Studio 2005 (제품명에 .NET은 공식적으로 빠졌습니다)은 .NET 기반이라 기존의 C/C++ 프로그램은 잘 돌아가지 않는다라는 사실인데요. 전혀 그렇지 않습니다. VS2005에서도 아무런 문제 없이 기존의 Win32 C/C++ 프로그램을 컴파일 할 수 있어야합니다. 혹시나 VS6에서 컴파일이 잘 되던 코드가 2005에서 컴파일 오류가 난다면 이건 고치셔야합니다. VS2005의 C/C++ 컴파일러 버전이 훨씬 C/C++ 표준에 부합하기 때문에 정상적으로 돌아가야합니다. 정확하게 어떤 점에서 안되는지 한번 말씀해주실 수 있을까요? 저도 수 많은 VS6 프로젝트를 포팅해봤는데 컴파일 오류가 있었지만 다 수정이 가능하고 또 수정을 해야하는 것입니다.
Commented by Joo8111 at 2007/01/05 15:57
오오~ 그렇습니까?
그렇다면 그 부분이 구체적으로 어떠한 것인지 좀 설명해주시면 안될까요?
저도 이제 2005로 넘어가볼까 생각중인데 일단 Project에서 상위 묶음이 하나더 생긴것 부터가 적응이 안되는데..
아하하..
Commented by object at 2007/01/05 16:04
Joo8111님 "그 부분"이 무엇을 가리키는 건지 잘 모르겠네요. 같은 MS 툴이기 때문에 IDE 적응하는 것은 큰 문제가 되지 않습니다. 프로젝트 위에 솔루션이라는 개념이 생겼구요. 이것도 사실 VC6과 다르지는 않습니다. .dsp -> .sln, .dsw -> .vcproj으로 바뀌었다고 보시면 됩니다.
Commented by Joo8111 at 2007/01/11 12:43
그러니까 그동안 VS6에서 잘못 사용되었던 문법적인? 혹은 개념적인 부분이 어떤 것인가요?
Commented by object at 2007/01/11 12:51
흠. 약간 말을 제가 잘 못 했군요. VS6이라고해서 틀린 것은 아닙니다. 다만 C/C++ ISO 표준에 좀 맞지 않는 부분이 조금씩 있었습니다. for 같은 경우에 for (int i = 0; 을 하였을 때 i의 스코프가 VS6에서는 for를 벗어나도 유효하였지요. 그러나 그 이후 버전에서는 gcc처럼 스코프가 for로만 한정이 됩니다. (물론 옵션에서 또 조절이 가능합니다.) 그 외에 template specialization 등에도 약간의 변화가 있어서 VS6에서 짠 템플릿 코드가 상위 버전에서 에러를 종종 내기도 하죠. 물론 여러 방법으로 고칠 수가 있습니다.
Commented by 학주니 at 2007/01/12 11:29
VS6에서 VS2005로 넘어오면서 헤더파일등에 많은 변화가 있었습니다.
그래서 VS6에서 제대로 컴파일되던게 VS2005에서는 제대로 컴파일이 안되는 상황이 벌어졌지요.
제 상황도 꼭 그런 상황입니다.
언젠가는 VS2005로 넘어가야 하지만 그 전에 제대로 컴파일할 수 있도록 소스부터 전면 재수정을 해야하는 상황때문에 도입을 망설이게 하고 있지요(회사 입자에서 봤을때는 정말로 암담하다고 하네요).
Commented by object at 2007/01/12 11:36
흠.. 그런가요? 암담한 상황이나 전면 수정까지는 절대 아닌데요 ^^; 정말 많이 바뀐 부분은 STL 말고는 없다고 봐도 됩니다. 정말 구체적으로 어떠한 상황인지 알고 싶네요. template 소스가 아니라면 정말 고쳐야할 부분이 많지 않았습니다. (제 경험상)

:         :

:

비공개 덧글

<< 이전 페이지 다음 페이지 >>





by 김민장 2008 이글루스 TOP 100
최근 등록된 덧글
개발자 입장에서의 수많은 ..
by Jiyoon at 02/04
저도 아들 돌잔치때 돌잡이 ..
by 박상욱 at 01/18
미국 대학원 원서 작성중에 p..
by 태클사이야 at 01/13
TO: 박PD 로그인 하지 않아..
by 박응용 at 01/10
http://gigglehd.com/zbx..
by dhunter at 12/28
우와.. 좋네요. 태반이 ..
by 윤광배 at 12/17
항상 좋은 글 잘 보고 있습니..
by y2k at 11/23
글이 좋아서 제 블로그에 담..
by 쏭섭 at 11/23
최근 등록된 트랙백
조엘 스폴스키의 강연 (Sta..
by 인덕원칸타타
[Redis] sds.c를 분..
by 조급하지말고 천천히
메뉴릿
이글루 파인더

website counter

Add to Google

rss

skin by 이글루스