휴대용 분기 예측 힌트
분기 예측 힌트를 휴대할 수 있는 방법이 있습니까?다음 예를 생각해 보십시오.
if (unlikely_condition) {
/* ..A.. */
} else {
/* ..B.. */
}
이것은 수행하는 것과 다른가요?
if (!unlikely_condition) {
/* ..B.. */
} else {
/* ..A.. */
}
아니면 컴파일러 고유의 힌트를 사용하는 유일한 방법입니까?(예: GCC에 __builtin_expect)
컴파일러가 처리할 수 있습니까?if
조건의 순서에 따라 다른 조건이 있습니까?
은 정분기예수행표는준방법같다다니습음과은하측적입니다.if
되지 않음 모든 (되, 매)if
절실되것아니가 실행됩니다.else
및 및 ), 루프및역향방--goto
s는 찍혔습니다.그러니, 일반적인 경우를 포함하지 마세요.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"가 다중선에 없을 수 있으므로 속도가 느릴 수 있습니다.
결론:
- X가 !X보다 더 가능성이 높은 경우 If(X)를 수행합니다.
- 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
'programing' 카테고리의 다른 글
R 프로세스에 사용할 수 있는 메모리 증가(또는 감소) (0) | 2023.06.11 |
---|---|
명령줄에서 Windows 이벤트 로그 소스를 만드는 방법은 무엇입니까? (0) | 2023.06.11 |
인수 구문:'x'가 있는 경우 'y' 인수가 필요합니다. (0) | 2023.06.11 |
R에서 data.frame의 처음 4개 행을 선택합니다. (0) | 2023.06.11 |
첫 번째 N 키 반환: dict에서 값 쌍 (0) | 2023.06.11 |