[컴퓨터구조론] 동적 브랜치 예측

티라노·2025년 5월 11일

컴퓨터구조론

목록 보기
12/18

Dynamic branch prediction

런타임에 동적으로 브랜치 결과를 예측하는 것을 말한다.

1-bit predictor

특정 브랜치가 지난 번에 take되었는지 아닌지 1비트 메모리에 저장한다.
저장하는 1비트 메모리를 prediction bit 라고 한다.
만약 지난 번에 take되었다면 다음 번에도 take될 것이라고 예측한다.

branch의 지난 동작이 다음 번에 그대로 이어질 것이라고 예측

만약 예측이 틀린다면 pipeline을 flush하고, 지난 번 prediction bit를 뒤집는다.

예를 들어 루프인 상황을 살펴보자.
처음 루프를 진입할 때는 아직 명령어가 활성화된 적 없으므로 not taken 으로 예측할 것이다. 하지만 실제로는 take된다.

이후 루프를 진행하면서 take로 예측하고 실제로도 take하는 상황이 반복되다가, 탈출 시 예측과 다르게 not take가 발생한다.

따라서 1-bit predictor 사용 시 반복문에서는 진입과 탈출을 제외한 상황에서 올바른 예측이 가능하다.

만약 루프가 여러 개라면 각 루프마다 별개의 branch predictor를 가진다.

Loop가 짧을수록 miss 가능성이 커서 비효율적이다.

2-bit predictor

두 번 연속해서 틀렸을 때 예측 결과를 바꾼다. 1-bit predictor의 단점을 개선하기 위해 만들어졌다.

1-bit predictor보다 맞을 확률이 조금 더 높지만 100% 정확성을 갖는 것은 아니다.

기타 예측 방법

Correlating predictor
각 브랜치 별 예측기뿐만 아니라 global predictor를 두는 방법이다.

Tournament branch predictor
여러 가지 predictor를 전부 구현한 다음 특정 프로그램마다 성공률이 가장 높은 predictor를 관찰하여 잘 맞는 것을 배정하는 방법이다.


예외와 인터럽트

Exception
CPU 내부에서 벌어진 특이한 상황을 말한다.
예를 들어 시스템 콜, 정의되지 않은 opcode, segmentation fault 등이 있다.

예외가 발생하면 ①발생한 명령어의 PC값을 SEPC에 저장하고 ②문제가 왜 발생했는지를 SCAUSE에 저장한다.

Interrupt
컴퓨터 외부에서 벌어지는 이벤트를 말한다. 예를 들어 I/O 컨트롤러에서 데이터 처리 완료 후 CPU에 인터럽트를 발생시킬 수 있다.

인터럽트는 Interrupt Vector 를 활용하여 처리한다.
각 인터럽트마다 처리할 주소가 미리 벡터에 저장되어있다.

이벤트 처리

이벤트 처리 handler로 이동하고 나면 명령어의 재시작 가능 여부에 따라 이후 처리가 달라진다.

만약 재시작이 가능하다면 적절한 행동을 취하고 원래 위치로 돌아가면 되지만, 재시작 불가능한 심각한 문제가 발생했다면 프로그램을 종료하고 문제를 리포트한다.

문제가 발생하면 해당 명령어의 뒤에 이어지는 명령어를 flush하고 발생 내역을 handler에 전송한다.
이후 PC를 exception handler가 있던 주소로 변경한다.

Imprecise Exception
문제가 생기면 pipeline을 멈추고 handler가 처리하도록 예외와 관련된 정보만 넘겨준다.
이런 식으로 구현하면 하드웨어는 간략해지지만, handler의 기능이 복잡해진다.

0개의 댓글