GCC 최적화 레벨은 몇 개입니까?
GCC 최적화 레벨은 몇 개입니까?
gcc - O1, gcc - O2, gcc - O3, gcc - O4를 시험했습니다.
너무 많이 쓰면 안 돼요.
하지만, 나는 시도했다.
gcc -O100
정리했습니다.
최적화 레벨은 몇 개입니까?
gcc에 부여할 수 있는 유효한 -O 옵션은 8가지가 있지만 같은 의미도 있습니다.
GCC를 추가했습니다.-Og
를 8로
man 페이지부터:
-O
)와 )-O1
-O0
를 수행하지 되지 않은 (최적화 레벨이 지정되지 않은 경우).최적화 레벨이 지정되지 않은 경우 기본값)-O1
-O2
(자세히)-O3
많이 (더 많이)-Ofast
준수를 공격적으로 (표준 준수를 어길 정도로 공격적으로 대응합니다.)-Og
을 사용법-Og는 디버깅을 방해하지 않는 최적화를 활성화합니다.이는 표준 편집-컴파일-디버깅 사이클에 대한 최적화 수준이어야 하며 고속 컴파일과 양호한 디버깅 경험을 유지하면서 적절한 수준의 최적화를 제공해야 합니다.)-Os
을 사용법-Os
all을-O2
일반적으로 코드 크기를 늘리지 않는 최적화.또한 코드 크기를 줄이도록 설계된 추가 최적화도 수행합니다.-Os
는, 플래그를 합니다.-falign-functions -falign-jumps -falign-loops -falign-labels -freorder-blocks -freorder-blocks-and-partition -fprefetch-loop-arrays -ftree-vect-loop-version
)
도 있을 수 pauldoo에 따르면 OS X에는 @pauldoo가 .-Oz
GCC 5.1의 소스코드를 해석해 봅시다.
이번에는 어떤 하겠습니다.-O100
pageman 에서는
우리는 다음과 같이 결론짓는다.
- 그
-O3
지까지INT_MAX
is is is is is와-O3
하지만 그것은 미래에 쉽게 바뀔 수 있으니, 그것에 의존하지 마세요. - 5.큰5.1은 되지 않은 합니다.
INT_MAX
. - 이치노이치노 ㄴ, ㄴ다, ㄴ다와 같은 됩니다.
-O-1
서브프로그램에 집중
는 GCC의 이라는 점에 해 주십시오.cpp
,as
,cc1
,collect2
»./XXX --help
만 있다collect2
★★★★★★★★★★★★★★★★★」cc1
-O
집중해서 살펴봅시다.
그리고:
gcc -v -O100 main.c |& grep 100
다음과 같은 기능이 있습니다.
COLLECT_GCC_OPTIONS='-O100' '-v' '-mtune=generic' '-march=x86-64'
/usr/local/libexec/gcc/x86_64-unknown-linux-gnu/5.1.0/cc1 [[noise]] hello_world.c -O100 -o /tmp/ccetECB5.
-O
되었습니다.cc1
★★★★★★★★★★★★★★★★★」collect2
.
O공통.opt
common.opt는 GCC 고유의 CLI 옵션 설명 포맷으로 내부 매뉴얼에 기재되어 있으며 opth-gen.awk 및 optc-gen.awk에 의해 C로 변환됩니다.
다음 행이 포함되어 있습니다.
O
Common JoinedOrMissing Optimization
-O<number> Set optimization level to <number>
Os
Common Optimization
Optimize for space rather than speed
Ofast
Common Optimization
Optimize for speed disregarding exact standards compliance
Og
Common Optimization
Optimize for debugging experience rather than speed or size
명령어는 모든 ""를 합니다.O
★★★★★★★★★★★★★★★★★★★★★★★:-O<n>
와 별가Os
,Ofast
★★★★★★★★★★★★★★★★★」Og
.
시 "" " " " " " " 가 됩니다.options.h
다음과 같이 합니다.
OPT_O = 139, /* -O */
OPT_Ofast = 140, /* -Ofast */
OPT_Og = 141, /* -Og */
OPT_Os = 142, /* -Os */
,스,,,,를 그리핑하고 있습니다.\bO\n
에 inside inside inside common.opt
다음 행에 주목합니다.
-optimize
Common Alias(O)
은 을 준다--optimize
)-optimize
.opt
file은 file의 되어 있지 않은 입니다.-O
'이렇게 하다'라고 쓸 수 요.--optimize=3
!
OPT_O가 사용되는 경우
이제 GREP:
git grep -E '\bOPT_O\b'
두 가지 파일이 있습니다.
그럼 먼저 찾아볼까요?opts.c
opts.c: default_default_optimization
★★★★★opts.c
안에서 :default_options_optimization
.
이 함수를 호출하는 사람이 누구인지 확인하기 위해 백트래킹을 실시합니다.또, 코드 패스는 다음과 같습니다.
main.c:main
toplev.c:toplev::main
opts-global.c:decode_opts
opts.c:default_options_optimization
★★★★★★★★★★★★★★★★★」main.c
의 시작점입니다.cc1
좋!!
이 기능의 첫 번째 부분:
integral_argument
명령어를 호출합니다.atoi
「」에 로,OPT_O
- 、 stores stores stores stores stores stores stores stores stores stores stores에 값을 합니다.
opts->x_optimize
서 ''는opts
는 입니다.struct gcc_opts
.
구조 gcc_opts
헛되이 된후 이 " " " " " " " " " " " "이러다"는 "이러다"는 "이러다"는 "이러다"는 "이러다"는 "이러다"라는 을 알 수 있습니다.struct
에도 생성됩니다.options.h
:
struct gcc_options {
int x_optimize;
[...]
}
어디에x_optimize
회선으로부터 발신됩니다.
Variable
int optimize
에 나타나다.common.opt
, 그리고 그거options.c
:
struct gcc_options global_options;
설정 글로벌 상태 전체가 여기에 포함되어 있을 것으로 생각됩니다.int x_optimize
는 최적화 값입니다.
255는 내부 최대값입니다.
에opts.c:integral_argument
,atoi
input 인수에 적용됩니다.INT_MAX
는 상한입니다.그리고 더 큰 값을 지정하면 GCC는 C의 정의되지 않은 동작을 실행하는 것으로 보입니다.아이구?
integral_argument
또한 얇게 싸다atoi
숫자가 아닌 문자가 있는 경우 인수를 거부합니다.그래서 음의 값은 우아하게 실패한다.
로 되돌아가다opts.c:default_options_optimization
다음과 같은 행이 표시됩니다.
if ((unsigned int) opts->x_optimize > 255)
opts->x_optimize = 255;
최적화 레벨이 로 잘려나가도록 합니다.255
책을 읽으면서opth-gen.awk
나는 다음과 같은 것을 알았다.
# All of the optimization switches gathered together so they can be saved and restored.
# This will allow attribute((cold)) to turn on space optimization.
및 생성된options.h
:
struct GTY(()) cl_optimization
{
unsigned char x_optimize;
그 때문에, 잘라내는 이유:옵션도 로 전송 할 필요가 있습니다.cl_optimization
를 사용합니다.char
공간을 절약합니다.255는 실제로는 내부 최대값입니다.
opts.c: maybe_default_module
로 되돌아가다opts.c:default_options_optimization
, 우리는 마주친다.maybe_default_options
재밌을 것 같네요입력하고 나서maybe_default_option
큰 스위치에 도달합니다.
switch (default_opt->levels)
{
[...]
case OPT_LEVELS_1_PLUS:
enabled = (level >= 1);
break;
[...]
case OPT_LEVELS_3_PLUS:
enabled = (level >= 3);
break;
없다>= 4
체크, 즉3
가능한 한 큰 것입니다.
그런 다음 의 정의를 검색합니다.OPT_LEVELS_3_PLUS
에common-target.h
:
enum opt_levels
{
OPT_LEVELS_NONE, /* No levels (mark end of array). */
OPT_LEVELS_ALL, /* All levels (used by targets to disable options
enabled in target-independent code). */
OPT_LEVELS_0_ONLY, /* -O0 only. */
OPT_LEVELS_1_PLUS, /* -O1 and above, including -Os and -Og. */
OPT_LEVELS_1_PLUS_SPEED_ONLY, /* -O1 and above, but not -Os or -Og. */
OPT_LEVELS_1_PLUS_NOT_DEBUG, /* -O1 and above, but not -Og. */
OPT_LEVELS_2_PLUS, /* -O2 and above, including -Os. */
OPT_LEVELS_2_PLUS_SPEED_ONLY, /* -O2 and above, but not -Os or -Og. */
OPT_LEVELS_3_PLUS, /* -O3 and above. */
OPT_LEVELS_3_PLUS_AND_SIZE, /* -O3 and above and -Os. */
OPT_LEVELS_SIZE, /* -Os only. */
OPT_LEVELS_FAST /* -Ofast only. */
};
하! 이건 3단계밖에 없다는 강력한 표시야.
opts.c: default_default_table
opt_levels
너무 재밌어서 우리는 Grep을 한다.OPT_LEVELS_3_PLUS
, 그리고 마주치게 됩니다.opts.c:default_options_table
:
static const struct default_options default_options_table[] = {
/* -O1 optimizations. */
{ OPT_LEVELS_1_PLUS, OPT_fdefer_pop, NULL, 1 },
[...]
/* -O3 optimizations. */
{ OPT_LEVELS_3_PLUS, OPT_ftree_loop_distribute_patterns, NULL, 1 },
[...]
}
그래서 여기서부터-On
documents에 기재되어 있는 특정 최적화 매핑에 대해 부호화됩니다.멋있어
x_optimize를 더 이상 사용하지 않도록 합니다.
의 주요 용도x_optimize
다음과 같은 다른 특정 최적화 옵션을 설정하는 것입니다.-fdefer_pop
man 페이지에 기재되어 있습니다.더 있나요?
우리가grep
, 그리고 몇 가지 더 찾아보세요.그 수는 적습니다.수동 검사 결과 모든 사용방법은 최대 1개의 사용방법만 있는 것을 알 수 있는 것은x_optimize >= 3
그래서 우리의 결론은 유효하다.
lto-brack.c
이제 두 번째 발생을 살펴보겠습니다.OPT_O
에 포함되어 있습니다.lto-wrapper.c
.
LTO는 Link Time Optimization(링크 시간 최적화)을 의미하며 이름에서 알 수 있듯이-O
옵션과 링크됩니다.collec2
(이것은 기본적으로 링커입니다).
사실, 첫 번째 행은lto-wrapper.c
다음과 같이 말합니다.
/* Wrapper to call lto. Used by collect2 and the linker plugin.
이 파일에서는OPT_O
발생은 가치를 정상화하는 데 그치고 있는 것 같다O
전달해야 하니까 괜찮을 거야
7가지 다른 레벨:
-O0
(기본값):최적화는 없습니다.-O
또는-O1
(동일):최적화. 단, 너무 많은 시간을 소비하지 마십시오.-O2
: 보다 적극적으로 최적화-O3
: 가장 적극적으로 최적화-Ofast
: 동등.-O3 -ffast-math
.-ffast-math
비호환 부동소수점 최적화를 트리거합니다.이를 통해 컴파일러는 부동소수점 숫자가 무한정 정밀하고, 그 위에 있는 대수가 실수 대수의 표준 규칙을 따른다고 가정할 수 있습니다.또한 컴파일러는 하드웨어에 데노멀을 0으로 플러시하고 데노멀을 0으로 처리하도록 지시합니다.적어도 x86이나 x86-64를 포함한 일부 프로세서에서는 데노멀을 0으로 처리하도록 지시합니다.데노말(denormal)은 많은 FPU에서 느린 경로를 트리거하므로 0으로 처리하면(느린 경로를 트리거하지 않음) 큰 성능 향상을 가져올 수 있습니다.-Os
: : : : : : : : : : : : : : 。따라서 I-캐시의 동작이 개선되어 실제로 속도가 향상될 수 있습니다.-Og
하지만 디버깅에는 하지 않습니다 최적화하지만 디버깅을 방해하지 않습니다.되며, 이는 " "를 대체하는 합니다.-O0
디버깅 빌드의 경우.
또한 이들 중 어느 것에도 의해 활성화되지 않은 다른 옵션도 있으며 개별적으로 활성화해야 합니다.최적화 옵션을 사용할 수도 있지만 이 최적화에 의해 활성화된 특정 플래그를 비활성화할 수도 있습니다.
상세한 것에 대하여는, GCC 의 Web 사이트를 참조해 주세요.
4(0-3):GCC 4.4.2 매뉴얼을 참조해 주세요.더 높은 값은 -O3일 뿐이지만, 어느 시점에서는 가변 크기 제한이 오버플로우됩니다.
언급URL : https://stackoverflow.com/questions/1778538/how-many-gcc-optimization-levels-are-there
'programing' 카테고리의 다른 글
봄 - @Transactional - 배경에서 무슨 일이 일어나나요? (0) | 2022.07.28 |
---|---|
v-slot 프로펠러를 사용하는 경우 템플릿 조건 (0) | 2022.07.28 |
Array Lists 어레이 작성 방법 (0) | 2022.07.27 |
sscanf("123456789123456789123456789123456789", "%d", &n")는 동작을 정의했습니까? (0) | 2022.07.27 |
vuejs에서 다른 모달 표시 후 모달은 자동으로 숨깁니다. (0) | 2022.07.27 |