programing

휴대용 분기 예측 힌트

instargram 2023. 6. 11. 10:18
반응형

휴대용 분기 예측 힌트

분기 예측 힌트를 휴대할 수 있는 방법이 있습니까?다음 예를 생각해 보십시오.

  if (unlikely_condition) {
    /* ..A.. */
  } else {
    /* ..B.. */
  }

이것은 수행하는 것과 다른가요?

  if (!unlikely_condition) {
    /* ..B.. */
  } else {
    /* ..A.. */
  }

아니면 컴파일러 고유의 힌트를 사용하는 유일한 방법입니까?(예: GCC에 __builtin_expect)

컴파일러가 처리할 수 있습니까?if조건의 순서에 따라 다른 조건이 있습니까?

은 정분기예수행표는준방법같다다니습음과은하측적입니다.if되지 않음 모든 (되, 매)if절실되것아니가 실행됩니다.else및 및 ), 루프및역향방--gotos는 찍혔습니다.그러니, 일반적인 경우를 포함하지 마세요.else정적 예측이 유의할 것으로 예상되는 경우.잡히지 않는 루프를 피하는 것은 쉽지 않습니다. 저는 시도해 본 적이 없지만 그것을 하는 것은 쉬운 일이라고 생각합니다.else조항은 꽤 잘 작동할 것입니다.

대부분의 컴파일러는 다음과 같은 형태를 지원합니다.#pragma unroll하지만 여전히 어떤 종류의 것으로 그것을 지키는 것이 필요할 것입니다.#if다른 컴파일러를 보호합니다.

분기 예측 힌트는 프로그램의 흐름 제어 그래프를 변환하고 실행 가능한 메모리의 기본 블록을 배열하는 방법에 대한 완전한 설명을 이론적으로 표현할 수 있으므로 표현해야 할 것은 다양하며 대부분은 휴대하기가 쉽지 않습니다.

GNU가 문서에서 권장하는 바와 같이__builtin_expect프로파일 기반 최적화는 힌트보다 우수하고 노력이 덜합니다.

대부분의 경우, 다음 코드는

if (a)
{
   ...
}
else
{
    ...
}

사실은

evaluate(A)

if (!A)
{
   jmp p1
}

... code A

   jmp p2

p1:

... code !A

p2:

A가 참이면 "코드 A"가 이미 파이프라인에 있습니다.프로세서에 "jmp p2" 명령이 표시되고 p2 코드가 파이프라인에 로드됩니다.

만약 A가 거짓이라면, "코드!A"가 다중선에 없을 수 있으므로 속도가 느릴 수 있습니다.

결론:

  1. X가 !X보다 더 가능성이 높은 경우 If(X)를 수행합니다.
  2. CPU가 파이프라인을 동적으로 최적화할 수 있도록 가능한 한 빨리 A을(를) 평가합니다.

:

evaluate(A)

do more stuff

if (A)
   ...

최적화는 본질적으로 컴파일러의 문제이기 때문에 컴파일러 기능을 사용해야 합니다.언어 자체는 최적화에 관심이 없습니다.

따라서 컴파일러별 확장 없이 수 있는 최선의 방법은 컴파일러가 도움 없이 "올바른 작업"을 수행하는 방식으로 코드를 구성하는 것입니다.그러나 확실하게 하려면 컴파일러 확장자를 사용하십시오. (프리프로세서 뒤에서 추상화를 시도할 수 있으므로 코드를 이식 가능한 상태로 유지할 수 있습니다.)

C++20은 가능한 속성과 가능하지 않은 속성을 제공합니다.

컴파일러가 해당 문을 포함한 실행 경로가 해당 문을 포함하지 않은 다른 실행 경로보다 많거나 적을 경우에 최적화할 수 있도록 허용

그냥 당신이 하는 일에 일관성을 가지세요.나는 사용하기를 좋아합니다.

if (!(someExpression))

그러나 컴파일러는 이를 동등하게 취급해야 합니다.

다음을 통해 특정 컴파일러를 확인하는 것이 무엇이 문제입니까?#ifdef그리고 이것들을 사용자 정의 매크로 뒤에 숨기는 것?넌 할 수 있다.#define이러한 최적화 힌트를 지원하는 컴파일러가 없는 경우 일반 식으로 확장할 수 있습니다.저는 최근에 GCC가 본질적인 기능을 통해 지원하는 명시적인 캐시 프리페치와 유사한 것을 했습니다.

언급URL : https://stackoverflow.com/questions/3702903/portable-branch-prediction-hints

반응형