두근두근이야기

c 최적화기법 likely, unlikely 본문

IT/IT ::Linux

c 최적화기법 likely, unlikely

골든 2013. 9. 5. 12:12

분기문 최적화 기법

likely, unlikely. 먼저 코드를 봐보자!

커널소스 < /include/linux/compiler.h >에 정의되어 있다.

 리눅스 커널 코드를 보면, likely와 unlikey란 함수를 발견할 수 있다.

 이게 무엇이냐 하면 컴파일러와 관련된 함수로서 작성된 코드를 최적화하기 위해 컴파일러에게 정보를 주어 수동 분기예측을 하는 것이다.

 if 분기문에서 likely를 주면 컴파일러에게 해당 분기문에서 참인 경우가 더 많을 것이라는 정보를 주고, 반대로 if 분기문 안에 unlikely를 주면 거짓인 경우가 더 많을 것이라는 정보를 준다.

 이와 같이 컴파일러에게 정보를 주게 됨으로서 성능을 향상시키는 것이다. 즉, 컴파일러는 작성된 함수와 코드들을 받아 최적화 작업을 하여 성능을 향상시킨다.

 이 다음 내용은 아래의 블로그에서 퍼왔습니다.

http://blog.naver.com/PostView.nhn?blogId=ryutuna&logNo=100176137644

 likely/unlikely 매크로는 수동 분기예측을 하는 것인데, likely일 것 같은 코드를 분기문의 바로 다음에 위치하도록 해서 CPU의 파이프라이닝이 계속 유효한 상태가 되도록 만들어주어 성능 향상을 도모한다. ( 프로세서는 성능을 높이기 위해서 파이프라인으로 동작하게 되는데 코드의 실행 중 브랜치를 만나게 되면 미리 fetch해온 코드를 flush하기 때문에 파이프 라인이 깨져서 성능이 떨어지게 된다 )

 따라서 가능하면 브랜치를 하지 않도록 코드를 작성하는 것이 성능을 높이는데 도움이 된다. 이를 위해서 조건문이 true일 가능성이 높은지 false일 가능성이 높은지를 컴파일러에게 알려주기 위해서 likely, unlikely 와 같은 매크로를 사용하는 것이다.


참고로 c 코드에서 사용하고 싶다면

likeㅣy, unlikely가 아닌

__builtin_expect(!!(x), 1).. 이걸로 사용하면 된다

'IT > IT ::Linux' 카테고리의 다른 글

YAFFS와 MTD  (0) 2013.09.05
Thread, fork 차이  (0) 2013.09.05
임베디드 시스템 엔지니어를 위한 리눅스 커널 분석  (0) 2013.09.04
우분투 터미널에서 이미지 변경하기  (0) 2013.09.04
fbmem.c  (0) 2013.09.04