최적화를 이용하여 컴파일
성능이 향상된 프로그램을 생성하는 첫 번째 단계는 컴파일러에 빌드된 기본 최적화 기능을 이용하는 것입니다.
최적화를 이용해 컴파일하면 프로그램을 조정해 속도를 높일 수 있으며 일부 조정을 수행할 필요가 없습니다.
권장사항
최적화에 관한 다음 지침을 따르십시오.
- 컴파일하는 모든 프로덕션 레벨의 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 옵션을 사용해 프로그램을 컴파일할 때 프로그램에서 올바르지 않은 결과를 생성하는 경우 프로시저 참조에서 우연히 별명이 지정된 변수가 있는지 프로그램을 검사하십시오.