System/Common

GCC Optimization Options

linuxism 2012. 10. 28. 17:02


GCC Optimization Options 


gcc version 3.2.2 기준.

gcc version 3.4.6 기준.

Option Details 

gcc는 기본적으로 아무런 옵션을 지정하지 않으면, 만들어지는 코드를 최적화(optimization)시키지 않습니다. 최적화를 위해, 여러가지 옵션을 제공하는데 (아래 표 참고), 이들 옵션을 일일히 선택하기 보다는 이들 옵션을 세트로 묶어 제공하는 '-O', '-O1', '-O2', '-O3' 등을 일반적으로 씁니다. (참고로 '-O0'는 전혀 최적화하지 말라는, default 옵션입니다.)

'-O' 또는 '-O1'의 경우, 만들어지는 오브젝트, 또는 실행 파일을 가능한 작게 하면서, 컴파일 시간이 오래걸리지 않는 범위에서 최적화를 수행합니다.

'-O2'의 경우, 만들어지는 코드가 가능한 빠르게 수행되도록 하지만, 코드의 크기가 너무 커지지 않도록 하는 범위에서 최적화를 수행합니다.

'-Os'의 경우, '-O2'에서 제공하는 모든 최적화 기능을 다 쓰지만, 코드의 크기를 증가시키는 최적화 기능은 빼고 나서 최적화를 수행합니다.

'-O3'의 경우, 코드의 크기는 전혀 신경 쓰지 않고, 오직 빠른 코드를 만들어 내기 위해 최적화를 수행합니다. 그러나, 꼭 생각해 두어야 할 점은, '-O3'로 만들어낸 코드가 반드시 '-O2'를 써서 만들어낸 코드보다 빠르다는 보장은 없다는 것입니다. 왜냐하면, 보통 CPU가 기계어를 수행할 때, 일정한 분량만큼 먼저 CPU 내부의 cache(캐시)에 불러와서 수행하는데, '-O3'를 써서 만든 코드는 대개 크기가 커서, 이 cache에 들어갈 수 있는 명령의 양이 상대적으로 적어지기 때문에, 오히려 느려질 가능성도 있습니다.

Included in Level
Optimization-O1-O2-Os-O3
defer-popOOOO
thread-jumpsOOOO
branch-probabilitiesOOOO
cprop-registersOOOO
guess-branch-probabilityOOOO
omit-frame-pointerOOOO
merge-constantsOOOO
loop-optimizeOOOO
if-conversionOOOO
if-conversion2OOOO
align-loopsXOXO
align-jumpsXOXO
align-labelsXOXO
align-functionsXOXO
crossjumpingXOOO
prefetch-loop-array??X?
optimize-sibling-callsXOOO
cse-follow-jumpsXOOO
cse-skip-blocksXOOO
gcseXOOO
gcse-lmXOOO
gcse-smXOOO
gcse-lasXOOO
expensive-optimizationsXOOO
strength-reduceXOOO
rerun-cse-after-loopXOOO
rerun-loop-optXOOO
caller-savesXOOO
force-memXOOO
peephole2XOOO
regmoveXOOO
strict-aliasingXOOO
delete-null-pointer-checksXOOO
reorder-blocksXOOO
reorder-functionsXOOO
unit-at-a-timeXO?O
schedule-insnsXOOO
schedule-insns2XXXO
schedule-interblockXO?O
sched-specXO?O
inline-functionsXXXO
rename-registersXXXO
webXXXO
unswitch-loopsXX?O

'-On' (n=1, 2, 3) 꼴의 옵션과 더불어 위 표의 왼편 옵션을 섞어 쓸 수도 있습니다. 예를 들어, 위 표에 따르면 '-O2'를 쓸 경우, 'inline-function' 최적화는 적용되지 않습니다. 따라서 다음과 같이 '-O2'에 해당하는 모든 최적화 기법들과 '-inline-functions'을 함께 쓸 수 있습니다:
$ gcc -O2 -finline-funtions hello.c

물론, 특정 옵션 기능을 빼는 것도 가능합니다. 아래는 '-O3'가 제공하는 모든 최적화 기법을 적용하지만 'inline-functions' 최적화만 빼고 컴파일하는 것을 보여줍니다.

$ gcc -O3 -fno-inline-functions hello.c

즉, 위 표의 왼편 부분의 옵션을 적용시키려면(on) "-f옵션이름"을 쓰고, 끄려면(off), "-fno-옵션이름" 꼴을 씁니다.



Target CPU Types-march= Type
i386
i486
i486
pentium
pentium-mmx
i686, pentiumpro
pentium2
pentium2
pentium3
Pentium IIIMpentium3m
Pentium Mpentium-m
pentium4
Pemtium 4Mpentium4m
Pentium 4 Prescottprescott
Pentium 4 Xeon, Noconanocona
c3
winchip2
winchip-c6
i586
k6
k6-2
k6-3
athlon
athlon-4
athlon-xp
AMD Athlon MPathlon-mp
athlon
athlon-tbird
AMD K8k8
AMD Opteronopteron
AMD Athlon 64athlon64
AMD Athlon FXathlon-fx
IDT Winchip C6winchip-c6
IDT Winchip2winchip2
Via C3c3
Via C3-2c3-2

아래 PDF는 간단한 XML tree를 memory에 build하는 프로그램을 여러 가지 최적화 옵션을 써서 컴파일한 후, 실행 시간을 재 본 것입니다.



References 

이 글의 대부분은 [http]Linux Journal의 2005년 3월판에 나온, M. Tim Jones씨가 쓴 "[http]Optimization in GCC"를 토대로 만든 것입니다. 원문을 보시면 더 좋을 것 같습니다.

GCC Info Manual을 보시면 최신의 정보를 얻을 수 있습니다. 또는 [http]GCC Online Documentation을 참고하기 바랍니다.


[http]Strength Reduction for Loop-Invariant Types by Phung Hua Nguyen and Jingling Xue
(가입하시고 login하시면 볼 수 있습니다.) 

[http]Global Common Subexpression Elimination by John Cocke


[http]KLDP Codefest 2005-02-18에서 썼음 -- [http]신성국 2006-08-28 GCC 3.4.6 내용 추가 -- [http]신성국


출처 - http://wiki.kldp.org/wiki.php/GccOptimizationOptions