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 | |
i486 | |
i486 | |
pentium | |
pentium-mmx | |
i686, pentiumpro | |
pentium2 | |
pentium2 | |
pentium3 | |
Pentium IIIM | pentium3m |
Pentium M | pentium-m |
pentium4 | |
Pemtium 4M | pentium4m |
Pentium 4 Prescott | prescott |
Pentium 4 Xeon, Nocona | nocona |
c3 | |
winchip2 | |
winchip-c6 | |
i586 | |
k6 | |
k6-2 | |
k6-3 | |
athlon | |
athlon-4 | |
athlon-xp | |
AMD Athlon MP | athlon-mp |
athlon | |
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
이 글의 대부분은 Linux Journal의 2005년 3월판에 나온, M. Tim Jones씨가 쓴 "Optimization in GCC"를 토대로 만든 것입니다. 원문을 보시면 더 좋을 것 같습니다.
GCC Info Manual을 보시면 최신의 정보를 얻을 수 있습니다. 또는 GCC Online Documentation을 참고하기 바랍니다.
Strength Reduction for Loop-Invariant Types by Phung Hua Nguyen and Jingling Xue
(가입하시고 login하시면 볼 수 있습니다.)
Global Common Subexpression Elimination by John Cocke출처 - http://wiki.kldp.org/wiki.php/GccOptimizationOptions
'System > Common' 카테고리의 다른 글
X Window System, X11, X (0) | 2014.04.09 |
---|---|
grep - 특정 단어 빼고 출력 (0) | 2013.03.08 |
FUSE(Filesystem in USEerspace) (0) | 2012.10.28 |
TCP Offload Engine(TOE)에 대한 이해 (0) | 2012.10.28 |
scale-up vs scale-out (0) | 2012.10.28 |