그냥 C에서 속성에 대해 뭔가를 읽고 있었는데 cppreference에 + +. 그들은 아마도 (사실) 속성을 언급했고 지금은 그것이 무엇이 좋은지 궁금합니다. 불행히도 웹에서 더 많은 정보를 찾을 수 없었습니다.아마 (진짜) 속성의 요점은 무엇입니까
프로세서가 실행 중에 사용하는 일종의 분기 예측입니까?
그냥 C에서 속성에 대해 뭔가를 읽고 있었는데 cppreference에 + +. 그들은 아마도 (사실) 속성을 언급했고 지금은 그것이 무엇이 좋은지 궁금합니다. 불행히도 웹에서 더 많은 정보를 찾을 수 없었습니다.아마 (진짜) 속성의 요점은 무엇입니까
프로세서가 실행 중에 사용하는 일종의 분기 예측입니까?
예. 컴파일러에게 if
문에 대한 자세한 정보를 제공하여 대상 마이크로 아키텍처에 따라 최적의 코드를 생성 할 수 있도록합니다.
각 마이크로 아키텍처는 분기의 가능성에 대해 알 수있는 방법이 있지만, 우리는 인텔 최적화 설명서에서 간단한 예를 취할 수
조립/컴파일러 코딩 규칙 3. (M에 미치는 영향, H의 일반성) 과 일치하는 코드를 정렬 정적 분기 예측 알고리즘 다음 fall-을 조건부 분기 다음 코드를 통해 forw가있는 분기의 대상이 될 수 있습니다. 조건부 분기를 따르는 폴스 스루 코드를 역방향 타겟이있는 분기의 대상으로 만들 수 없습니다.
간단히 말해, 앞으로 지점에 대한 정적 예측은 이전 버전과 지점에 대한 (그래서 코드 후를 촬영하는 동안 (이 가능성이 경로를, 그래서 분기 이후 코드가 추론 실행) 이을-촬영하지 않습니다 지점은 추측으로 실행되지 않습니다).
는 GCC이 코드를 살펴 보자 : 나는[[problably(true)]]
을 시뮬레이션하는 내장
__builtin_expect
사용
#define probably_true(x) __builtin_expect(!!(x), 1)
#define probably_false(x) __builtin_expect(!!(x), 0)
int foo(int a, int b, int c)
{
if (probably_true(a==2))
return a + b*c;
else
return a*b + 2*c;
}
.
이
는 당신에게 약간의 어셈블리 코드를 아끼지foo(int, int, int):
cmp edi, 2 ;Compare a and 2
jne .L2 ;If not equals jumps to .L2
;This is the likely path (fall-through of a forward branch)
;return a + b*c;
.L2:
;This is the unlikely path (target of a forward branch)
;return a*b + 2*c;
ret
로 컴파일 얻을. 당신이 probably_false
로 probably_true
를 교체 할 경우
코드가됩니다 : 당신은 with this example at codebolt.org와 함께 재생할 수 있습니다
foo(int, int, int):
cmp edi, 2 ;Compare a and 2
je .L5 ;If equals jumps to .L5
;This is the likely path (fall-through of a forward branch)
;return a*b + 2*c;
.L5:
;This is the unlikely path (target of a forward branch)
;return a + b*c;
ret
.
좋은 답변, 감사합니다!따라서 분기 예측은 항상 현재 실행 된 명령어를 예측 경로로 따라 가고 점프 경로를 실패 경로로 사용하는 인스 턴션을 사용합니까? – Timo
@Timo 앞으로 점프 (정적으로 예측되지 않음)에 대한 x86의 아키텍처 (또는 더 나은 마이크로 아키텍처)에 따라 다르지만 진술은 사실이지만 분기가 처음 나타나는 경우에만 해당됩니다. 처음으로 분기 예측자는 분기의 수행되지 않은 동작 패턴을 감지하려고 시도합니다. 출발점은 [Wikipedia의 관련 기사] (https://en.wikipedia.org/wiki/Branch_predictor)를 참조하십시오. –
아키텍처 가이드의 조언에도 불구하고 현대 x86에서 더 많은 정적 예측 규칙이 없다는 것을 알고 있습니다! _. 즉, 현대 분기 예측자가 설계된 방식은 항상 동적 예측 만있을 것입니다. 분기가 표시되지 않으면 예측은 거기에서 해싱 된 다른 점프에서 예측 테이블에 남아있는 모든 정크에 기반합니다. 또는 아무것도 없을 경우 아마도 기본 (아마 fallthrough-always) 예측 일 것입니다. – BeeOnRope
정확히 하드웨어 브랜치 예측을 볼 수 있습니다. – levengli
조건부 브랜치에만 적용되는 속성이 어떤 모습인지 보여주는 예일뿐입니다. 내 지식이있는 한 실제로 존재하지 않습니다.) – Cubbi
나는 당신을 정확하게 이해할 수있을 지 모르겠다. 그러나이 문법으로 약간의 코드를 컴파일했다.'[[아마도 (true)]] if (...) ... else ...'나는하지 않았다. 생성 된 코드를 확인하십시오. 그러나 적어도 컴파일 된 (msc 및 C++ 14 사용) – Timo