최적화를 이용하여 컴파일

성능이 향상된 프로그램을 생성하는 첫 번째 단계는 컴파일러에 빌드된 기본 최적화 기능을 이용하는 것입니다.

최적화를 이용해 컴파일하면 프로그램을 조정해 속도를 높일 수 있으며 일부 조정을 수행할 필요가 없습니다.

권장사항

최적화에 관한 다음 지침을 따르십시오.

  • 컴파일하는 모든 프로덕션 레벨의 FORTRAN, C 또는 C++ 프로그램에 -O2 또는 -O3 -qstrict를 사용하십시오. HPF(High Performance FORTRAN) 프로그램의 경우 -qstrict 옵션을 사용하지 마십시오.
  • 핫 스팟이 루프이거나 배열 언어인 프로그램에는 -qhot 옵션을 사용하십시오. HPF 프로그램에는 항상 -qhot 옵션을 사용하십시오.
  • 컴파일 시간이 주요 고려사항이 아닌 경우에는 개발 주기가 끝날 무렵 -qipa 옵션을 사용하십시오.

-qipa 옵션은 프로시저 간 분석이라는 최적화 클래스를 활성화하거나 조정합니다. -qipa 옵션에는 컴파일러 매뉴얼에 자세히 설명되어 있는 몇몇 하위 옵션이 있습니다. 두 가지 방법으로 이들 옵션을 사용할 수 있습니다.

  • 첫 번째는 컴파일 단계와 링크 단계에서 -qipa 옵션을 지정해 컴파일하는 방법입니다. 컴파일 중에 컴파일러는 프로시저 간 분석 정보를 .o 파일에 저장합니다. 링크 중에는 -qipa 옵션으로 인해 전체 애플리케이션을 전체 재컴파일합니다.
  • 두 번째는 -p/-pg 옵션(-qipa 사용 또는 사용 안함)을 지정해 프로파일링하도록 프로그램을 컴파일하고 일반 데이터 세트에 대해 실행하는 방법입니다. -qipa를 사용해 결과 데이터를 후속 컴파일에 공급할 수 있으므로 컴파일러는 가장 자주 사용되는 프로그램의 시간을 최적화하는 데 집중할 수 있습니다.

-O4 사용은 -O3 -qipa를 사용하는 것과 같으며 해당 플랫폼에 이상적인 아키텍처와 조정 옵션을 자동으로 생성합니다. -O5 플래그 사용은 -O4와 유사하고 -qipa= level = 2인 점만 다릅니다.

컴파일러 최적화를 사용하면 다음과 같은 이점이 있습니다.

분기 최적화
분기 논리를 최소화하고 물리적으로 분리된 코드 블록을 결합하도록 프로그램을 재배열합니다.
코드 이동
루프 내에서 계산에 사용된 변수가 루프 내에서 변경되지 않는 경우 루프 외부에서 계산을 수행하고 루프 내에서 결과를 사용할 수 있습니다.
공통 부속식 제거
공통 표현식에서는 동일한 값이 후속 표현식에서 다시 계산됩니다. 이전 값을 사용해 중복 표현식을 제거할 수 있습니다.
상수 전달
표현식에서 사용된 상수는 결합되고 새 상수가 생성됩니다. 정수 유형과 부동 소수점 유형 사이에 일부 내재적 변환이 수행됩니다.
폐기된 코드 제거
도달할 수 없거나 결과가 나중에 사용되지 않는 코드를 제거합니다.
폐기된 저장 제거
저장된 값이 다시 참조되지 않는 저장을 제거합니다. 예를 들어, 같은 위치를 가리키는 두 개의 저장에 개입 로드가 없으면 첫 번째 저장이 불필요하므로 제거됩니다.
글로벌 레지스터 할당
"그래프 채색" 알고리즘을 사용해 사용 가능한 하드웨어 레지스터에 변수와 표현식을 할당합니다.
인라인
함수 호출을 실제 프로그램 코드로 대체합니다.
명령어 스케줄링
실행 시간을 최소화하도록 명령어를 다시 정렬합니다.
프로시저 간 분석
함수 호출의 관계를 밝히고 보다 직접적인 최적화로 제거할 수 없는 로드, 저장, 계산을 제거합니다.
불변 IF 코드 변동(비전환)
다른 최적화 기회를 만들기 위해 루프에서 불변 분기 코드를 제거합니다.
프로파일 중심 피드백
샘플 프로그램 실행 결과를 사용해 조건부 분기 근처와 자주 실행되는 코드 섹션에서 최적화를 개선합니다.
재연관
배열 첨자 표현식에서 계산 순서를 재배열하여 공통 표현식 제거의 추가 후보를 생성합니다.
저장 이동
저장 명령어를 루프 외부로 이동합니다.
강도 감소
덜 효율적인 명령어를 더 효율적인 명령어로 대체합니다. 예를 들어, 배열 첨자화에서는 더하기 명령어가 곱하기 명령어를 대체합니다.
값 번호 매김
상수 전달, 표현식 제거, 여러 명령어를 하나의 명령어로 변환하는 작업을 포함합니다.

최적화를 이용하지 않고 컴파일 하는 경우

-g 옵션 사용 여부에 상관없이 기호 디버거를 사용해 디버깅하려는 프로그램에 -O 옵션을 사용하지 마십시오. 그러나 HPF 프로그램에는 최적화가 매우 중요하므로 디버깅 중에도 -O3 -qhot을 사용하십시오.

최적화 프로그램은 어셈블리어 명령어를 재배열하여 개별 명령어를 소스 코드의 한 행으로 맵핑하기 어렵게 만듭니다. -g 옵션을 사용해 컴파일하는 경우 이러한 재배열로 인해 기호 디버거를 사용할 때 소스 레벨 명령문을 잘못된 순서로 실행되는 것처럼 보입니다.

-O 옵션을 사용해 프로그램을 컴파일할 때 프로그램에서 올바르지 않은 결과를 생성하는 경우 프로시저 참조에서 우연히 별명이 지정된 변수가 있는지 프로그램을 검사하십시오.