컴파일러 최적화. 향상된 성능.

3119 단어

소개



Performance ≠ time.



컴파일러 최적화는 원래 입력 코드와 동일한 결과를 달성하지만 향상된 성능을 얻기 위해 컴파일러가 코드를 변경하는 것입니다. 이는 코드 크기 감소, 실행 크기 감소 또는 실행 속도 향상을 의미할 수 있습니다. 종종 이러한 목표는 상충되며 하나(예: 속도)를 최적화하려면 다른 하나(예: 코드 크기)를 희생해야 합니다.

대부분의 고급 컴파일러는 일정 수준의 최적화를 수행하며, 컴파일을 위해 선택한 옵션은 메모리 사용량, 실행 속도, 실행 파일 크기, 전력 소비 및 디버깅 가능성에 영향을 미침으로써 컴파일러가 만든 트레이드오프에 상당한 영향을 미칠 수 있습니다.

한 영역의 성능을 다른 영역과 절충하는 것이 종종 가능합니다. 예를 들어 룩업 테이블을 사용하면 일부 알고리즘에서 CPU 사용률을 줄이고 배터리 수명을 늘릴 수 있지만 메모리 소비는 증가합니다.

GCC 최적화 옵션



GCC는 많은 최적화 옵션을 제공하며 대부분은 -O 플래그를 사용하여 조합하여 제어할 수 있습니다. 이 옵션은 0(최적화 없음)에서 3(가장 높은 최적화), s(크기에 최적화), fast(속도에만 최적화) 또는 g(디버깅 경험에 최적화 - 디버깅을 복잡하게 만드는 최적화 방지) 사이의 값을 허용합니다.

-O는 실제로 일련의 기능을 선택합니다. 이러한 기능은 -f 플래그와 기능 이름을 사용하여 개별적으로 선택할 수도 있습니다. 예를 들어, -funroll_loops는 루프의 언롤링을 활성화합니다(참고: 다른 기능도 루프 언롤링에 영향을 미침). 기능을 비활성화하려면 -f 플래그 다음에 no- 및 기능 이름을 사용하십시오. 예를 들어 -fno-unroll-loops는 루프 풀기를 끕니다.

특정 -O 플래그 또는 -O와 기능 플래그의 조합으로 활성화된 개별 기능을 보려면 최적화 기능 목록을 쿼리하는 -Q --help=optimizers 플래그를 사용하십시오. 예를 들어 -O2에서 활성화/비활성화된 모든 최적화를 보려면 다음 명령을 사용하십시오.

gcc -O2 -Q --help=optimizers


GCC 문서(맨 페이지와 온라인 설명서 모두)에는 GCC 컴파일러의 200개 이상의 최적화 기능에 대한 좋은 정보가 있습니다.

일반적인 최적화의 예



다음은 몇 가지 일반적인 C 최적화입니다. 각 최적화에 대해 입력 코드 스니펫이 해당 최적화를 보여주는 코드와 함께 표시됩니다.

메모:
  • 다른 많은 종류의 최적화가 있으며 그 중 일부는 개체 코드 수준에서 작동합니다.
  • 코드에 부작용이 있는 경우 이러한 최적화 중 많은 부분을 수행할 수 없습니다. 예를 들어 루프에 계산만 포함된 경우 루프의 방향을 영향 없이 되돌릴 수 있지만 루프에 I/O가 포함된 경우에는 되돌릴 수 없습니다. 작업(예: printf()). 이러한 조건을 추적하는 것은 복잡해질 수 있습니다!

  • 코드 재작성 최적화



    이러한 최적화에는 성능 또는 공간을 위한 코드 재작성이 포함됩니다. 이러한 예제는 재작성된 소스 코드를 사용하여 표시되지만 대부분의 경우 최적화는 원래 소스와 거의 유사하지 않은 프로그램의 중간 표현에 적용됩니다.

    - Strength Reduction
    - Hoisting
    - Hoisting I - Loop-Invariant Variable
    - Hoisting II - Loop-Invariant Expression
    - Hoisting III - Loop-Invariant Expression in Loop Condition
    - Pre-calculation of Constants
    - Loop Unswitching
    - Loop Unswitching I - Inner/Outer Swap
    - Loop Unswitching II - Inner/Outer Swap with Code Repetition
    - Loop Splitting
    - Loop Interchange
    - Loop Unrolling
    - Loop Unrolling I - Guaranteed-Multiple Iterations
    - Loop Unrolling II - Pairs-of-Iterations plus a Conditional Extra Iteration
    - Loop Unrolling III - Large Number of Iterations
    - Inlining
    - Common Subexpression Elimination
    - Jump Threading 
    


    이 목록은 훨씬 더 오래 계속될 수 있으며 이 글을 미친듯이 길게 읽은 블로그 게시물로 만들고 싶지 않습니다. 이 주제에 대해 더 자세히 알고 싶다면. 오픈 소스 학습을 위해 저희 웹 사이트를 방문하십시오 @ Seneca .

    결론



    ⚠️ 향후 첫 번째 작업을 위한 레포:

    ⚠️ 이 블로그 참조: here

    연결



    🖇 팔로우GitHub

    🖇 팔로우

    p.s 이 게시물은 SPO 수업인 2월 블로그 게시물/lab4를 위해 작성되었습니다.

    좋은 웹페이지 즐겨찾기