재밌는 컴파일러 키워드 __builtin_expect
gcc에서만 일단 사용이 가능하지만 한가지 흥미있는 키워드를 발견했다. __builtin_expect 라는 키워드다 다음과 같이 사용할 수 있다.
void* p = malloc(100);

// if (p == NULL)
// error();

if (__builtin_expect(p == NULL, 0))
error();
위와 같은 경우는 아주 많이 접할 것이다. 그런데 사실 포인터 p가 NULL인 경우는 잘 없다. 99.99%는 항상 p != NULL가 될 것이다. 이럴 경우 __builtin_expect는 매우 유용하게 사용할 수 있다.

이 키워드는 p == NULL의 값이 *대부분* false가 될 것이라고 컴파일러에게 알려준다. 그래서 CPU가 좀 더 효율적으로 명령어를 fetch할 수 있도록 한다. 물론 그렇다고해서 프로그램의 정확성, 즉 p가 NULL이면 error가 실행되라는 것까지 해치지는 않는다. 단순히 프로그램의 성능 향상을 위한 키워드이다.

이 상황을 정확하게 이해하려면 branch prediction을 알아야 한다. 예전 포스팅을 참고하면 도움이 될 것이다. 간략하게 설명하자면, 최근의 CPU는 명령어 수십개를 미리 내다보면서, 병렬적으로 수행될 수 있는 녀석들을 찾아서 실행하는 구조이다. 그런데 중간에 분기문(if, for, call 등)이 있다면 어느 방향으로 프로그램이 흘러갈지 모르니 정확한 명령어를 가져올 수 없다. 그래서 일단 *찍는다*. 분기문의 결과를 미리 예측한 뒤, 거기에 맞게 명령어를 쭉 가져와서 실행을 미리 하는 것이다. 그러다가 만약 찍은 결과가 틀리면 그 동안 실행한 것들을 다 취소한다.

만약, CPU가 위의 코드를 실행할 때, p가 NULL이라는 가정을 해버리고 error 관련된 코드를 쭉 가져와서 실행 해놓았다고 하자. 그런데 나중에 p 결과를 확인해보니 NULL이 아니었다. 그러면 error 쪽으로 진행된 코드를 취소하고 올바른 방향으로 다시 수행을 해야한다. 당연히 수행 시간에 저해가 있을 것이다. 이 때, __builtin_expect 키워드를 사용한다면, CPU는 p가 NULL인 경우는 극히 드물다는 정보를 이용하여 p != NULL인 경우의 코드를 미리 가져와서 처리 할 것이다. 그리고 이것은 대부분의 경우 성능 향상으로 이어진다.


많은 예외 처리를 해야할 때 __builtin_expect 사용은 분명 효과가 있을 것이다. 정확하게 몇 %나 빨라진다~ 라는 것은 나도 돌려보지 않아서 잘 모르겠지만... gcc 유저라면 참고가 되었으면 좋겠다.

Visual Studio에서는 __assume이라는 키워드가 있는 것 같다. 그런데 이것과 정확하게 1:1 매치가 되는 키워드는 아닌 것 같다. MSVC에도 얼릉 이런 최적화 키워드가 생겼으면 좋겠다.
by object | 2006/11/17 10:07 | 컴퓨터 | 트랙백 | 핑백(2) | 덧글(3)
트랙백 주소 : http://minjang.egloos.com/tb/561972
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Linked at art.oriented : C.. at 2007/07/21 12:22

... (7.0) 부터 지원된 기능들이다. 안타깝게도 gcc에서는 아래 기능들이 지원이 안 되는 것 같다. 그러나 반대로 MSVC에서 지원하지 않는 gcc의 재밌는 키워드 __builtin_expect도 있다. 1. __super 이름에서 말하듯이 자신의 base-class를 가리키는 키워드이다. 예를 들어, overriding한 method에서 상위 클래스 ... more

Linked at 참머루의 이글루 : likel.. at 2008/05/23 09:46

... 00-04/msg00129.html http://blog.naver.com/aeromarine?Redirect=Log&logNo=10004984310 http://minjang.egloos.com/561972 ... more

Commented by 알까기명인 at 2006/11/17 23:43
좋은 정보 감사합니다.
Commented by Ego君 at 2006/11/23 05:01
신기한 기능이 있군요 +_+ 이번 방학때 gcc를 제대로 배워보고 싶네요.
Commented by object at 2006/11/23 07:17
gcc는 사실 별로 배울 건 없고 (배우기 보다는 에러 메세지에 익숙해져야..-_-) 사실 makefile이랑 emacs 같은걸 배워야할텐데 ㅠㅠ 저도 리눅스와 안 친해서 정말 X고생이라는.. 시간 되시면 리눅스에서 gdb로 자유자재로 디버깅하는 방법을 배워놓으세요. 그리고 요즘은 gcc가 c 컴파일러가 아니라 gnu compiler collection이라고 불리더라구요 ㅋㅋ

:         :

:

비공개 덧글

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





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 이글루스