문제

GCC의 다양한 최적화 수준 간의 차이점은 무엇입니까?디버그 후크를 갖고 싶지 않다고 가정하면, 사용 가능한 가장 높은 수준의 최적화를 사용하지 않는 이유는 무엇입니까?반드시 더 높은 수준의 최적화를 수행합니다(예:아마도) 더 빠른 프로그램을 생성하시겠습니까?

도움이 되었습니까?

해결책

예, 더 높은 수준은 때때로 더 나은 성능의 프로그램을 의미할 수 있습니다.그러나 코드에 따라 문제가 발생할 수 있습니다.예를 들어, 분기 예측(-O1 이상에서 활성화됨)은 경쟁 조건을 유발하여 잘못 작성된 멀티 스레딩 프로그램을 중단시킬 수 있습니다.최적화는 실제로 귀하가 작성한 것보다 더 나은 것을 결정하지만 어떤 경우에는 작동하지 않을 수도 있습니다.

때로는 더 높은 최적화(-O3)가 합리적인 이점을 추가하지 않지만 추가 크기가 많이 추가되는 경우도 있습니다.자체 테스트를 통해 이러한 크기 절충이 시스템에 합리적인 성능 향상을 가져오는지 확인할 수 있습니다.

마지막으로 GNU 프로젝트는 모든 프로그램을 다음 위치에서 컴파일합니다. -O2는 기본적으로, -O2는 다른 곳에서는 상당히 일반적입니다.

다른 팁

일반적으로 다음보다 높은 최적화 수준 -O2 (단지 -O3 gcc의 경우, 다른 컴파일러는 더 높은 버전을 갖고 있음) 코드 크기를 늘릴 수 있는 최적화를 포함합니다.여기에는 루프 언롤링, 많은 인라인, 크기에 관계없이 정렬을 위한 패딩 등이 포함됩니다.다른 컴파일러는 다음보다 높은 수준에서 벡터화 및 절차 간 최적화를 제공합니다. -O3, 정확성을 희생하면서 속도를 크게 향상시킬 수 있는 특정 최적화(예: 더 빠르고 덜 정확한 수학 루틴 사용).이러한 것들을 사용하기 전에 문서를 확인하십시오.

성능에 관해서는 절충안입니다.일반적으로 컴파일러 디자이너는 코드 성능을 저하시키지 않도록 이러한 사항을 조정하려고 합니다. -O3 일반적으로 (적어도 내 경험으로는) 도움이 되지만 마일리지는 다를 수 있습니다.매우 공격적인 크기 변경 최적화가 항상 성능을 향상시키는 것은 아닙니다(예:정말 공격적인 인라인은 캐시 오염을 가져올 수 있습니다.

나는 찾았다 웹 페이지 다양한 최적화 수준에 대한 일부 정보가 포함되어 있습니다.어디선가 들었던 기억 중 하나는 최적화가 실제로 프로그램을 망가뜨릴 수 있고 그것이 문제가 될 수 있다는 것입니다.그러나 더 이상 문제가 얼마나 되는지는 잘 모르겠습니다.아마도 오늘날의 컴파일러는 이러한 문제를 처리할 만큼 똑똑할 것입니다.

참고:

전역 변수에 의해 어떤 플래그가 켜져 있는지 정확하게 예측하는 것은 매우 어렵습니다. -O 다양한 버전과 플랫폼에 대한 gcc 명령줄의 지시문과 GCC 사이트의 모든 문서는 빨리 구식이 되거나 컴파일러 내부를 충분히 자세히 다루지 않을 수 있습니다.

다음 중 하나를 사용할 때 특정 설정에서 어떤 일이 발생하는지 정확하게 확인하는 쉬운 방법은 다음과 같습니다. -O 플래그 및 기타 -f 플래그 및/또는 이들의 조합:

  1. 어딘가에 빈 소스 파일을 만듭니다.
    touch dummy.c
  2. 평소와 같이 컴파일러가 통과하더라도 실행하십시오. -O, -f 및/또는 -m 일반적으로 사용하는 플래그이지만 추가 -Q -v 명령줄에:
    gcc -c -Q -v dummy.c
  3. 생성된 출력을 검사하고 다른 실행을 위해 저장할 수도 있습니다.
  4. 원하는 대로 명령줄을 변경하고 다음을 통해 생성된 개체 파일을 제거합니다. rm -f dummy.o 그리고 다시 실행하세요.

또한 순수주의적 관점에서 볼 때 대부분의 사소한 최적화는 "깨진" 코드(깨진 코드는 특수한 경우에 최적의 경로에서 벗어나는 것으로 정의됨)를 생성한다는 점을 항상 명심하십시오. 일련의 최적화 메커니즘은 때때로 컴파일러 출력의 정확성 수준을 선택하는 것으로 귀결됩니다.모든 컴파일러의 최적화 프로그램에는 항상 버그가 있습니다(현재도 그렇습니다). GCC 메일링 리스트와 Bugzilla에서 일부 샘플을 확인하세요.컴파일러 최적화는 실제로 측정을 수행한 후에만 사용해야 합니다.

  • 더 나은 알고리즘을 사용하여 얻을 수 있는 이득은 컴파일러 최적화로 얻을 수 있는 이득보다 작습니다.
  • 파란 달에 한 번씩 실행되는 코드를 최적화하는 것은 의미가 없습니다.
  • 최적화 프로그램에서 버그가 발생하면 코드가 얼마나 빨리 실행되는지는 중요하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top