본문 바로가기
Engineer/코드최적화

3. 인텔포트란 최적화 옵션 정리

by _제이빈_ 2020. 3. 12.

본 게시글은 원본1를 따라해 가며 이해한 내용들이 기록되어 있다.

코드 최적화 관련 글 목록

 

 

 인텔포트란 최적화 옵션 목록

 

위에 연결된 링크는 intel developer zone의 Intel® Fortran Compiler 19.1 Developer Guide and Reference(Submitted December 16, 2019)이다. 컴파일러가 계속해서 유지보수가 되고 있는 상태이기 때문에, 계속해서 포트란을 쓰는 사람이라면 업데이트 사항에 관심을 가지고 확인해야한다. (난 왜 아직도 쓰고 있는지...) 어찌됐든, 최적화 옵션은 그렇게 많지 않으니 공부할 맛이 난다. 물론 더 고급 옵션이 있으나, 본 게시물에서는 다루지 않으며, 필요 시 링크를 참고하길 바란다.

 

No

옵션

간단한 설명

1

falias, Oa

ffnalias, Ow

앨리어싱(Aliasing)의 여부를 설정

함수 내에서 앨리어싱을 가정할지 여부를 설정

2

fast

전체 프로그램에서 속도를 최대화

3

foptimize-sibling-calls

컴파일러가 꼬리재귀호출(tail recursive calls)을 반복문으로 최적화하는지 여부를 결정

4

fprotect-parens, Qprotect-parens

부동 소수점 표현식을 평가할 때 옵티마이 저가 괄호를 준수하는지 여부를 결정

5

GF

읽기 전용 문자열 풀링 최적화를 활성화

6

nolib-inline

표준 라이브러리 또는 내장 함수의 인라인 확장을 비활성화

7

O

코드 최적화 옵션을 지정

8

Od

모든 최적화를 비활성화

9

Ofast

응용 프로그램의 속도를 향상시키기 위해 특정 옵션을 설정

10

Os

코드 크기를 늘리지 않는 최적화를 활성화 (O2보다 작은 코드 크기를 생성)

11

Ot

모든 속도 최적화를 활성화

 

간단한 설명만으로는 부족하여 차례대로 설명을 하도록하겠다. 관심있는 옵션을 좀 더 찾아보면 좋을 듯 하다.

 


 

 

  1. 앨리어스(falias, Oa / ffnalias, Ow) 옵션   

 

■ 사용법:

 

-falias (Linux * 및 macOS *) 또는 /Oa- (Windows *)를 지정하면 프로 시저 호출 중 앨리어싱*이 가정되며, 이는 프로그램 성능에 영향을 줄 수 있다. 
-fno-alias 또는 /Oa (기본값)를 지정하면 프로시저 호출 중 앨리어싱이 가정하지 않는다.

 

-ffnalias 또는 , /Ow (Windows *)를 지정하면 함수들 안에서 앨리어싱 가정하도록 한다.

-fno-fnalias (Linux * 및 macOS *) 또는 /Ow- (Windows *)를 설정하면 앨리어싱 가정을 하지 않는다.

 

■ 설명:

 

앨리어스란? 어떤 더미 데이터 객체가 있을 때, 프로시저가 실행되는 동안 더미 변수 명 외의 다른 변수명으로 이 객체에 접근가능하면 이를 앨리어스라고 한다. 여러 상황이 있을 수 있는데 아래와 같은 상황에 보통 발생한다.

 

The Fortran 2003 Handbook: The Complete Syntax, Features and Procedures

 

이 옵션은 이러한 상황을 놔 둘건지, 아닌지! 여부를 결정하고 있는 것이다. 기본설정은 앨리어싱을 막아놓고 있다.

 


 

 

  2. fast 옵션  

 

■ 사용법:

 

-fast (Linux 및 macOS) 또는 /fast (Windows)로 사용가능하고, 기본값은 OFF 상태이다.

 

■ 설명:

 

이 옵션의 간단한 설명은 말그대로 속도를 최상으로 끌어올리는 옵션이다. 즉, 속도를 빠르게 할 수 있는 최적화 옵션 모임(?)이다. 아래와 같이 된다.

macOS* systems

-ipo, -mdynamic-no-pic,-O3, -no-prec-div,-fp-model fast=2, and -xHost 

Linux* systems

-ipo, -O3, -no-prec-div,-static, -fp-model fast=2, and -xHost

Windows* systems

/O3, /Qipo, /Qprec-div-, /fp:fast=2, and /QxHost 

 

fast가 어떻게 최적화 하는지 알려면, 위 옵션들을 하나씩 찾아봐야 하겠다. 그리고 프로세서 별 [Q] x 옵션을 지정하면 기본적으로 지정된 [Q] xHost 옵션 설정을 대체 할 수도 있다. 명령 행에 지정된 마지막 옵션이 우선된다. 예를 들어 다음과 같이 수정해 사용할 수 있다.

 

Linux* systems

-fast -xSSE3 옵션은 -xSSE3 이 활성화 되고, -xSSE3 -fast 옵션은 -xHost가 활성화 된다.

Windows* systems

/fast /QxSSE3 옵션은 /QxSSE3 이 활성화 되고, /QxSSE3 /fast 옵션은 /QxHost가 활성화 된다.

 

 


 

 

  3. foptimize-sibling-calls 옵션  

 

■ 사용법:

 

Linux* systems

macOS* systems

-foptimize-sibling-calls (기본값)

-fno-optimize-sibling-calls

Windows* systems

None

 

■ 설명:

 

이 옵션은 컴파일러가 꼬리재귀호출(tail recursive call)을 최적화할지 여부를 설정한다. 꼬리재귀호출을 반복문으로 최적화 시키게 된다. 꼬리재귀호출이란, 재귀호출이 야기하는 스텍에 오버플로우를 방지하는 기법이다. 꼬리재귀호출에 대한 자세한 사항은 다른 문서들을 찾아보는 것이 좋겠다. 여하튼, 꼬리 재귀 호출을 최적화하지 않으려면 -fno-optimize-sibling-calls를 사용하면 된다. 

 


 

 

  4.  fprotect-parens, Qprotect-parens 옵션  

 

■ 사용법:

 

Linux* systems

macOS* systems

-fprotect-parens

-fno-protect-parens (기본값)

Windows* systems

/Qprotect-parens

/Qprotect-parens-  (기본값)

 

■ 설명:

 

이 옵션은 부동 소수점 표현식 평가 순서를 결정할 때 옵티마이저가 괄호를 따르는지에 대한 여부를 결정한다. 
    옵션 -fprotect-parens (Linux * 및 macOS *) 또는 / Qprotect-parens (Windows *)는 옵티마이저가 코드내 괄호를 준수해 지정된 평가 순서를 유지하고, -fno-protect-parens (Linux * 및 macOS *) 또는 / Qprotect-parens- (Windows *) 옵션을 지정하면 최적화 프로그램이 더 빠른 실행 코드를 생성하는 경우 괄호와 상관없이 부동 소수점 표현식을 재정하게 된다.

 

 


 

 

  5. GF  옵션  

 

■ 사용법:

 

/GF (Windows only)로 사용가능하고, 기본값은 OFF 상태이다.

 

■ 설명:

 

OFF 상태일때, 문자열 풀링(String Pooling

 


 

 

  6. noilb-inline  옵션  

 

■ 사용법:

 

Linux* systems

macOS* systems

-nolib-inline

(기본값 : OFF, 라이브러리 및 내장합수를 인라인한다.)

Windows* systems

none

 

■ 설명:

 

이 옵션은 표준 라이브러리 또는 내장 함수의 인라인 확장을 비활성화한다. 인라인 확장으로 인해 발생할 수있는 예기치 않은 결과를 방지하기 위함이다.

 


 

 

  7. O  옵션  

 

■ 사용법:

 

Linux* systems

macOS* systems

-O[n]

Windows* systems

/O[n]

n : 최적화 단계로 1 ~ 3 값을 가질 수 있으며. Linux나 macOS에서는 0도 가능하다. 기본값으로 n은 2를 갖는데, 자세한 사항은 아래 설명하겠다.

 

■ 설명:

 

Option

Description

O

O2 설정과 같다.

O0

모든 최적화 기법을 비활성화한다. 다른 옵션을 설정할 수도 있다는 말이다. 컴파일러가 사용중인 운영 체제 및 아키텍처에 따라 결정하게 된다. 심지어는 설정된 옵션은 릴리즈마다 다를 수 있다. 
그리고 특정 경고 옵션이 무시됩니다. -debug 옵션을 지정하는 경우 이것이 기본값으로 들어간다(키워드 없음).

O1

속도 최적화를 활성화하는데, 코드 크기를 늘리고 속도에 영향을 주는 일부 최적화를 비활성화한다. 코드 크기를 제한하려면 글로벌 최적화 옵션을 사용하면 된다. 글로벌 최적화 옵션은 데이터 흐름 분석(data-flow analysis), 코드 모션(code motion), 강도 감소 및 테스트 대체(strength reduction and test replacement), 분할 수명 분석(split-lifetime analysis) 및 명령 스케줄링(instruction scheduling)이 포함된다.

이 옵션 또한 다른 옵션을 설정할 수 있으며, 컴파일러가 사용중인 운영 체제 및 아키텍처에 따라 결정하고, 릴리즈마다 다를 수 있다.

코드의 크기가 크고, 브랜치(Branch) 많으며, 및 루프 내의 코드가 실행시간을 관장하지 않는다면, O1 옵션을 통해 성능을 향상시킬 수 있다.

O2

일반적으로 권장되는 최적화이며, O2 이상에서 벡터화(Vectorization)이 활성화된다.

IA-32 아키텍처를 사용하는 시스템 : Distribution, Predicate Opt, Interchange, multi-versioning, and scalar replacements 와 같은 일부 기본 루프 최적화가 수행된다.

이 옵션은 또한 다음을 활성화한다.

 

- 내장 함수의 인라이닝

 

- 파일 내 절차 간 최적화(Intra-file interprocedural optimization) :

    > 인라인

    > 상수 전파(constant propagation)

    > 순방향 대체(forward substitution)

    > 루틴 속성 전파(routine attribute propagation)

    > 가변 주소 분석(variable address-taken analysis)

    > 죽은 정적 함수 제거(dead static function elimination)

    > 참조되지 않은 변수 제거

 

- 성능 향상을 위한 기능 :

    > 상수 전파(constant propagation)

    > 복사 전파(copy propagation)

    > 죽은 코드 제거(dead-code elimination)

    > 글로벌 레지스터 할당(global register allocation)

    > 글로벌 명령 스케줄링 및 제어 추론(global instruction scheduling and control speculation)

    > 언 롤링 루프

    > 최적화 된 코드 선택

    > 부분 중복 제거

    > 강도 감소 / 유도 변수 단순화(strength reduction/induction variable simplification)

    > 변수 이름 바꾸기

    > 예외 처리 최적화

    > 꼬리 재귀

    > 핍홀 최적화(peephole optimizations)

    > 구조 할당 저하 및 최적화

    > 죽은 저장공간 제거

 

이 옵션은 다른 옵션, 특히 코드 속도를 최적화하는 옵션을 설정할 수 있다. 컴파일러가 사용중인 운영 체제 및 아키텍처에 따라 결정하고, 릴리즈마다 다를 수 있다.

Windows * 시스템에서이 옵션은 Ox 옵션과 동일하고다, Linux * 및 macOS * 시스템에서 -g를 지정하면 O2 는 꺼지고 O0가 기본값이며,  -g와 함께 명시적으로 O1~3가 지정해야 활성화 된다. 최적화 (옵션 -O2 이상)로 컴파일하고 디버깅이 활성화(옵션 -g) 된 경우, -debug inline-debug-info 옵션이 기본적으로 활성화된다.

 

인텔 ® 마이크로 프로세서에보다 고도로 최적화되어 있다.

O3

O2 최적화를 수행하고 Fusion, Block-Unroll-and-Jam 및 IF 문 뭉개기(collapsing IF statement)와 같은보다 적극적인 루프 변환을 수행한다.

이 옵션 또한 다른 옵션을 설정할 수 있으며, 컴파일러가 사용중인 운영 체제 및 아키텍처에 따라 결정하고, 릴리즈마다 다를 수 있다.

 

O3을 -ax 또는 -x (Linux) 옵션 또는 / Qax 또는 / Qx 옵션 (Windows)과 함께 사용하면 컴파일러는 O2보다 공격적으로 데이터 종속성 분석을 수행하므로 컴파일 시간이 길어질 수 있다.

루프 및 메모리 액세스 변환( loop and memory access transformations)이 수행되지 않으면 O3 최적화는 더 높은 성능을 유발하지 않을 수도 있다. 어떤 경우에는 되려 O2 최적화보다 느려질 수 있다.

 

O3 옵션은 부동 소수점 계산을 많이 사용하고, 큰 데이터 세트를 다루는 반복문이 있는 프로그램에 적합하다.

 

인텔 ® 마이크로 프로세서에보다 고도로 최적화되어 있다.

 


 

 

  8. Od  옵션  

 

■ 사용법:

 

Linux* systems

macOS* systems

None (위에서 언급한 O0과 같은 역할이므로 존재하지 않음)

Windows* systems

/Od

 

기본 값은 OFF로, 컴파일러는 기본적인 최적화를 수행한다.

 

■ 설명:

 

이 옵션은 모든 최적화를 비활성화한다. / Od 및 / Ob1의 조합과 같이 선택적 최적화로 사용할 수 있다. 또한 특정 / warn 옵션이 무시되며, IA-32 아키텍처에서는 / Oy- 옵션을 설정한다.

 /Od + /Ob1 = 모든 최적화는 비활성화하지만 인라인은 활성화


 

 

  9. Ofast  옵션  

 

■ 사용법:

 

Linux* systems

macOS* systems

-Ofast

Windows* systems

None

 

기본 값은 OFF로,  적극적으로 속도를 향상시키는 최적화가 비활성화된 상태이다.

 

■ 설명:

 

응용 프로그램의 속도를 향상시키며, 옵션 -O3, -no-prec-div 및 -fp-model fast = 2를 활성화한다. Linux * 시스템에서 gcc와의 호환성을 위해 제공되는 설정이다.


 

 

  10. Os  옵션  

 

■ 사용법:

 

Linux* systems

macOS* systems

-Os

Windows* systems

/Os

 

기본 값은 OFF로, 속도를 중심으로 최적화가 수행되며, 만약 O1이 활성화 되면, Os가 기본값이다.

 

■ 설명:

 

코드 크기를 늘리지 않는 최적화를 활성화다. O2보다 작은 코드 크기를 생성하며, 근소하게 속도를 향상시키기 위해 코드의 크기가 늘어나는 일부 최적화를 비활성화한다. 즉, 컴파일러에게 최대 성능을 생성하는 변환보다는, 코드 크기를 줄이는 변환을 선호하도록 지시한다.


 

 

  11. Ot  옵션  

 

■ 사용법:

 

Linux* systems

macOS* systems

None

Windows* systems

/Ot

 

기본 값은 ON으로, 속도를 중심으로 최적화가 수행되며, 위에 언급한 바와 같이 만약 O1이 활성화 되면, Ot가 아닌 Os가 기본값이다.

 

■ 설명:

 

이 옵션은 모든 속도 최적화를 활성화한다.

반응형

'Engineer > 코드최적화' 카테고리의 다른 글

2. 효율적인 반복문(loop) 작성  (0) 2020.03.12
1. 효율적인 배열데이터 참조  (0) 2020.03.12
코드 최적화  (0) 2020.03.12

댓글