2016-07-13 4 views
0

possible()/unlikely() 매크로가 작동하는 방식을 이해했으며 분기 예측에 대해서도 알고 있습니다. 불행히도, 높은 수준의 프로그래밍의 맥락에서 분기 예측을 배우지 못했습니다.세그먼테이션 결함이있는 Linux 커널의 likely()/unlikely() 매크로

가능성있는/가능성이 낮은 매크로 내에서 평가하면 세분화 오류가 발생하며 그 결과가 분기 예측 내역 또는 현재 결과/파이프 라인에 어떤 영향을 주는지 알고 싶습니다.

예측의 유효성 검사가 완료되지 않은 경우 성공 또는 실패 여부를 어떻게 알 수 있습니까?

+0

내가이의 시작을 생각을 발견 할 것이다 당신이 실제로 묻는 것을 방해하는 질문은 추측 적으로 실행 된 브랜치가 플러시되는 경우 브랜치 예측이 어떻게 작동하는지 알고 싶기 때문에 그렇습니까? – harold

+0

아닙니다. 플러시할지 여부에 대한 결정은 평가에 따라 달라 지겠지만, 정확하지 않습니까? 내 질문은 평가가 완료 될 수없는 경우입니다. 이 경우 시스템의 상태는 무엇입니까? – user3224083

+0

예, 그것이 제가 의미했던 것입니다. 전체 브랜치가 플러시 된 후에는 코드가 플러시되지 않습니다. 그것은 가능성이 높거나있을 법하지도 않으며 예외적 인 경우도 아닙니다 (예측 인자를 손상시킬 수 있습니다. 예외는 너무 많아서 BP 정확도에 영향을주지 않습니다.) 과거의 여러 가지를 추측하고 첫 번째 예측을 잘못 예측했습니다. 이를위한 몇 가지 해결책이 있습니다. – harold

답변

3

__builtin_expect (the definition of the likely/unlikely macros에서 사용됨)은 해당 인수 중 하나를 평가하기위한 실제 코드를 생성하지 않습니다. 모든 것은 컴파일러에게 어떤 결과가 일지를 알려주고이라면 평가됩니다.

*(int*)NULL이 보통 13이라고 말하면 옵티 마이저가 혼동을 일으킬 수 있지만 (컴파일러 버그는 제외) 컴파일러를 분리 시키거나 실행시 segfaults 코드를 생성하지는 않습니다.

Another answer on the old question은 실제로 매크로가 있는지 여부에 관계없이 gcc가 코드를 레이아웃하는 방법에 영향을 미친다는 것을 보여줍니다 (예 : 그럴 가능성이있는 경우는 그만 두는 경우와 그렇지 않은 경우의 가능성있는 경우). 명령어 캐시 미스가 덜 발생하는 조건부 분기).


이는 likely()/unlikely() macros in the Linux kernel - how do they work? What's their benefit? 꽤 중복되지 않습니다,하지만 당신은 훨씬 더 이러한 매크로가 작동하는 방법에 대한 정보를 어떤 그 효과가 Q & A.에

관련 문제