2017-01-15 1 views
1

그냥 C에서 속성에 대해 뭔가를 읽고 있었는데 cppreference에 + +. 그들은 아마도 (사실) 속성을 언급했고 지금은 그것이 무엇이 좋은지 궁금합니다. 불행히도 웹에서 더 많은 정보를 찾을 수 없었습니다.아마 (진짜) 속성의 요점은 무엇입니까

프로세서가 실행 중에 사용하는 일종의 분기 예측입니까?

+2

정확히 하드웨어 브랜치 예측을 볼 수 있습니다. – levengli

+0

조건부 브랜치에만 적용되는 속성이 어떤 모습인지 보여주는 예일뿐입니다. 내 지식이있는 한 실제로 존재하지 않습니다.) – Cubbi

+0

나는 당신을 정확하게 이해할 수있을 지 모르겠다. 그러나이 문법으로 약간의 코드를 컴파일했다.'[[아마도 (true)]] if (...) ... else ...'나는하지 않았다. 생성 된 코드를 확인하십시오. 그러나 적어도 컴파일 된 (msc 및 C++ 14 사용) – Timo

답변

5

예. 컴파일러에게 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_falseprobably_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 

.

+0

좋은 답변, 감사합니다!따라서 분기 예측은 항상 현재 실행 된 명령어를 예측 경로로 따라 가고 점프 경로를 실패 경로로 사용하는 인스 턴션을 사용합니까? – Timo

+1

@Timo 앞으로 점프 (정적으로 예측되지 않음)에 대한 x86의 아키텍처 (또는 더 나은 마이크로 아키텍처)에 따라 다르지만 진술은 사실이지만 분기가 처음 나타나는 경우에만 해당됩니다. 처음으로 분기 예측자는 분기의 수행되지 않은 동작 패턴을 감지하려고 시도합니다. 출발점은 [Wikipedia의 관련 기사] (https://en.wikipedia.org/wiki/Branch_predictor)를 참조하십시오. –

+0

아키텍처 가이드의 조언에도 불구하고 현대 x86에서 더 많은 정적 예측 규칙이 없다는 것을 알고 있습니다! _. 즉, 현대 분기 예측자가 설계된 방식은 항상 동적 예측 만있을 것입니다. 분기가 표시되지 않으면 예측은 거기에서 해싱 된 다른 점프에서 예측 테이블에 남아있는 모든 정크에 기반합니다. 또는 아무것도 없을 경우 아마도 기본 (아마 fallthrough-always) 예측 일 것입니다. – BeeOnRope