두근두근이야기
c 최적화기법 likely, unlikely 본문
분기문 최적화 기법
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 |