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 || || [wiki:GccOptionOmitFramePointer 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 || || [wiki:GccOptionForceMem 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 Prescott||prescott|| ||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하는 프로그램을 여러 가지 최적화 옵션을 써서 컴파일한 후, 실행 시간을 재 본 것입니다. [http://www.cinsk.org/~cinsk/kldp/benchmark-gcc-opt.pdf Benchmark Data Sheet] attachment:benchmark-gcc-opt.pdf == References == 이 글의 대부분은 [http://www.linuxjournal.com/ Linux Journal]의 2005년 3월판에 나온, M. Tim Jones씨가 쓴 "[http://interactive.linuxjournal.com/article/7269 Optimization in GCC]"를 토대로 만든 것입니다. 원문을 보시면 더 좋을 것 같습니다. GCC Info Manual을 보시면 최신의 정보를 얻을 수 있습니다. 또는 [http://www.gnu.org/software/gcc/onlinedocs/ GCC Online Documentation]을 참고하기 바랍니다. [http://portal.acm.org/ft_gateway.cfm?id=979948&type=pdf Strength Reduction for Loop-Invariant Types] by Phung Hua Nguyen and Jingling Xue (가입하시고 login하시면 볼 수 있습니다.) [http://portal.acm.org/citation.cfm?id=808480 Global Common Subexpression Elimination] by John Cocke ---- [http://wiki.kldp.org/wiki.php/CodeFest/20050218 KLDP Codefest 2005-02-18]에서 썼음 -- [http://www.cinsk.org/ 신성국] 2006-08-28 GCC 3.4.6 내용 추가 -- [http://www.cinsk.org/ 신성국] ---- CategoryCompilation