|
gcc에서만 일단 사용이 가능하지만 한가지 흥미있는 키워드를 발견했다. __builtin_expect 라는 키워드다 다음과 같이 사용할 수 있다.
void* p = malloc(100);위와 같은 경우는 아주 많이 접할 것이다. 그런데 사실 포인터 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 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 최근 등록된 트랙백
메뉴릿
이글루 파인더
|