· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
Gcc Optimization Options

GccOptimizationOptions입니다.

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-pop O O O O
thread-jumps O O O O
branch-probabilities O O O O
cprop-registers O O O O
guess-branch-probability O O O O
omit-frame-pointer O O O O
merge-constants O O O O
loop-optimize O O O O
if-conversion O O O O
if-conversion2 O O O O
align-loops X O X O
align-jumps X O X O
align-labels X O X O
align-functions X O X O
crossjumping X O O O
prefetch-loop-array ? ? X ?
optimize-sibling-calls X O O O
cse-follow-jumps X O O O
cse-skip-blocks X O O O
gcse X O O O
gcse-lm X O O O
gcse-sm X O O O
gcse-las X O O O
expensive-optimizations X O O O
strength-reduce X O O O
rerun-cse-after-loop X O O O
rerun-loop-opt X O O O
caller-saves X O O O
force-mem X O O O
peephole2 X O O O
regmove X O O O
strict-aliasing X O O O
delete-null-pointer-checks X O O O
reorder-blocks X O O O
reorder-functions X O O O
unit-at-a-time X O ? O
schedule-insns X O O O
schedule-insns2 X X X O
schedule-interblock X O ? O
sched-spec X O ? O
inline-functions X X X O
rename-registers X X X O
web X X X O
unswitch-loops X X ? 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 DX/SX/CX/EX/SL i386
i486 DX/SX/DX2/SL/SX2/DX4 i486
487 i486
Pentium pentium
Pentium MMX pentium-mmx
Pentium Pro i686, pentiumpro
Pentium II pentium2
Celeron pentium2
Pentium III pentium3
Pentium IIIM pentium3m
Pentium M pentium-m
Pentium 4 pentium4
Pemtium 4M pentium4m
Pentium 4 Prescottprescott
Pentium 4 Xeon, Nocona nocona
Via C3 c3
Winchip 2 winchip2
Winchip C6-2 winchip-c6
AMD K5 i586
AMD K6 k6
AMD K6 II k6-2
AMD K6 III k6-3
AMD Athlon athlon
AMD Athlon 4 athlon-4
AMD Athlon XP athlon-xp
AMD Athlon MP athlon-mp
AMD Duron athlon
AMD Tbird athlon-tbird
AMD K8 k8
AMD Opteron opteron
AMD Athlon 64 athlon64
AMD Athlon FX athlon-fx
IDT Winchip C6 winchip-c6
IDT Winchip2 winchip2
Via C3 c3
Via C3-2 c3-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]신성국


ID
Password
Join
It's a poor workman who blames his tools.


sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2006-08-29 08:31:05
Processing time 0.0098 sec