본문 바로가기
-----ETC-----/C++ 성능 최적화 및 고급 테크닉 시리즈

[C++ 성능 최적화 및 고급 테크닉] Day 2: 컴파일러 최적화 옵션 이해하기

by cogito21_cpp 2024. 8. 1.
반응형

컴파일러 최적화란?

컴파일러 최적화는 컴파일 과정에서 컴파일러가 코드의 성능을 개선하기 위해 다양한 최적화 기법을 적용하는 과정입니다. 컴파일러 최적화를 통해 실행 속도, 메모리 사용량, 전력 소비 등을 개선할 수 있습니다.

 

컴파일러 최적화 옵션

다양한 컴파일러 최적화 옵션이 있으며, 주요 옵션을 이해하고 적절히 사용하는 것이 중요합니다.

 

1. GCC/G++ 최적화 옵션

GCC/G++ 컴파일러에서 제공하는 주요 최적화 옵션을 살펴보겠습니다.

 

기본 옵션

  • -O0: 최적화를 수행하지 않습니다. 디버깅 목적으로 사용됩니다.
  • -O1: 기본 최적화를 수행합니다. 컴파일 속도와 실행 속도의 균형을 맞춥니다.
  • -O2: 보다 높은 수준의 최적화를 수행합니다. 실행 속도를 향상시키지만 컴파일 시간이 늘어날 수 있습니다.
  • -O3: 가장 높은 수준의 최적화를 수행합니다. 추가적으로 함수 인라인화, 루프 변환 등을 수행합니다.
  • -Os: 코드 크기를 최소화하기 위한 최적화를 수행합니다.
  • -Ofast: -O3에 더해 표준을 준수하지 않는 공격적인 최적화를 수행합니다.

 

특정 최적화 옵션

  • -funroll-loops: 루프 언롤링을 수행합니다.
  • -fstrict-aliasing: 엄격한 별칭 규칙을 적용하여 최적화를 수행합니다.
  • -march=native: 현재 시스템의 아키텍처에 최적화된 코드를 생성합니다.
  • -mtune=native: 현재 시스템의 아키텍처에 최적화된 코드로 튜닝합니다.

 

2. Clang 최적화 옵션

Clang 컴파일러에서도 유사한 최적화 옵션을 제공합니다.

  • -O0: 최적화를 수행하지 않습니다.
  • -O1: 기본 최적화를 수행합니다.
  • -O2: 높은 수준의 최적화를 수행합니다.
  • -O3: 가장 높은 수준의 최적화를 수행합니다.
  • -Os: 코드 크기를 최소화하기 위한 최적화를 수행합니다.
  • -Ofast: 공격적인 최적화를 수행합니다.

 

예제 코드

다음은 다양한 최적화 옵션을 사용하여 컴파일한 예제 코드입니다.

 

비최적화 컴파일

g++ -O0 main.cpp -o main_O0

 

기본 최적화 컴파일

g++ -O1 main.cpp -o main_O1

 

고급 최적화 컴파일

g++ -O2 main.cpp -o main_O2
g++ -O3 main.cpp -o main_O3

 

공격적 최적화 컴파일

g++ -Ofast main.cpp -o main_Ofast

 

코드 크기 최적화 컴파일

g++ -Os main.cpp -o main_Os

 

실습 문제

문제 1: 최적화 옵션 적용하기

다음 코드에서 다양한 최적화 옵션을 적용하고 실행 시간을 비교해보세요.

 

main.cpp

#include <iostream>
#include <vector>
#include <chrono>

int main() {
    const int size = 1000000;
    std::vector<int> data(size);

    auto start = std::chrono::high_resolution_clock::now();

    for (int i = 0; i < size; ++i) {
        data[i] = i * i;
    }

    auto end = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double> elapsed = end - start;

    std::cout << "Elapsed time: " << elapsed.count() << " seconds" << std::endl;

    return 0;
}

 

해답:

다양한 최적화 옵션을 적용하여 컴파일하고 실행 시간을 비교합니다.

g++ -O0 main.cpp -o main_O0
g++ -O1 main.cpp -o main_O1
g++ -O2 main.cpp -o main_O2
g++ -O3 main.cpp -o main_O3
g++ -Ofast main.cpp -o main_Ofast
g++ -Os main.cpp -o main_Os

 

이제 각 실행 파일을 실행하여 결과를 비교합니다.

./main_O0
./main_O1
./main_O2
./main_O3
./main_Ofast
./main_Os

 

각 최적화 옵션이 적용된 실행 파일의 실행 시간을 기록하여 비교해봅니다.

 

최적화 옵션 요약

  • -O0: 최적화 없음. 디버깅에 적합.
  • -O1: 기본 최적화. 성능과 컴파일 시간의 균형.
  • -O2: 고급 최적화. 더 많은 최적화 수행.
  • -O3: 최대 최적화. 추가적인 최적화 수행.
  • -Ofast: 공격적인 최적화. 표준을 벗어난 최적화 포함.
  • -Os: 코드 크기 최적화. 임베디드 시스템에 적합.

 

이제 두 번째 날의 학습을 마쳤습니다. 컴파일러 최적화 옵션의 중요성과 다양한 옵션을 적용하는 방법을 학습하고, 실습 문제를 통해 이해를 높였습니다.

질문이나 피드백이 있으면 언제든지 댓글로 남겨 주세요. 내일은 "코드 프로파일링 및 벤치마킹"에 대해 학습하겠습니다.

반응형