본문 바로가기

Programming/C/C++

C/GCC/최적화 및 디버깅 옵션 추가

반응형
# gcc 최적화 옵션
- O : 최적화 전체 수준 제어 , 최적화 레벨이 올라갈 수록 컴파일 실행 시간과 메모리 소비율이 증가합니다.
  • - O0 : 최적화x
  • - O, O1 : 코드 크기와 실행 시간 감소
  • - O2 : 메모리 공간과 속도의 희생을 제외하고 최적화 (loop unrlloing, function inlining에 대한 최적화 수행 x)
  • - O3 : O2 최적화GDB API - 레퍼런스 정리에 인라인 함수와 레지스터에 대한 최적화를 추가로 수행
  • - Os : O2 최적화 기능을 사용하지만, 코드 크기를 증가시키지 않음
  • - Og : (GCC4.8++) 디버깅에 혼란을 주는 최적화 기능을 제거합니다.
  • - Ofast : (GCC4.7++) : -O3, -ffast-math, -no-protect-arens, -fstatck-arrays가 합쳐져있습니다. 최적화 표준 준수율를 깨며, 사용을 권장하지 않습니다.
- march : 컴파일러에 CPU 정보를 알려주어 코드를 만들도록 함.
  • CPU 정보 확인

1
user $cat /proc/cpuinfo

  • 이 정보를 CPU_FLAGS_x86 변수로 바꿔주는 도구를 설치 : app-portage/cpuid2cpuflags : https://github.com/mgorny/cpuid2cpuflags
  • 샘플 예시
  • 1
    2
    3
    4
    5
    root #cpuinfo2cpuflags-x86
    CPU_FLAGS_X86: aes avx avx2 f16c fma3 mmx mmxext popcnt sse sse2 sse3 sse4_1 sse4_2 ssse3
     
    # make.conf파일에 
    root #echo "CPU_FLAGS_X86='aes avx avx2 f16c fma3 mmx mmxext popcnt sse sse2 sse3 sse4_1 sse4_2 ssse3'" >> /etc/portage/make.conf

1
2
user $gcc ---march=native --help=target
user $gcc -### -march=native /usr/include/stdlib.h
- pipe : 컴파일 과정을 빠르게합니다. (메모리 소모율이 증가합니다.)
- formit-frame-pointer: 생성 코드의 크기를 줄입니다. (디버깅의 어려움을 겪을 수 있습니다.)

# 추가 : CFLAG와 CXXFLAGS에서 사용
1
2
CFLAGS="-march=athlon64 -O2 -pipe"
CXXFLAGS="${CFLAGS}"

# gcc 디버깅 옵션
- g : 디버깅 정보(파일명, line number, 변수와 함수 이름들 등을 포함)를 assebly code와 같이 생성.  * 최적화 경우 symbol이 없어지는 것이 발생할 수 있음.
- pg : 프로파일링을 위한 코드 삽입

# gcc 프로파일링 옵션
- p : 수행 시간을 함수 단위나 더 작은 단위로 분석 profiling.

# gcc 비트 지정 옵션
- m32 : 32비트 컴파일
- m64 : 64비트 컴파일

# gcc 심볼 옵션
- M : 심볼 정보를 자세하게 출력

# gcc 라이브러리 지정 옵션
- static : 정적 라이브러리 링크

- shared : 우선적으로 공유 라이브러리와 링크하고 필요한 공유 라이브러리가 존재하지 않으면 정적 라이브러리와 링크


반응형