현대 CPU에서 분기 예측의 정확도는 전체 성능을 좌우하는 중요한 요소입니다. 이때 핵심적으로 사용되는 두 가지 구조가 바로 BTB(Branch Target Buffer)와 BHT(Branch History Table)입니다. 이 두 구조는 모두 분기 명령어의 흐름을 예측하는 데 사용되지만, 작동 방식과 역할에는 명확한 차이가 있습니다. 본 글에서는 BTB와 BHT의 차이를 비교 분석하고, 이들이 어떻게 함께 활용되어 CPU의 분기 예측 능력을 강화하는지 구체적으로 설명합니다.
Branch Target Buffer(BTB)의 개념과 역할
BTB는 분기 명령어가 실행되었을 때, 그 목적지 주소(Target Address)를 기억하는 캐시 메모리 구조입니다. CPU는 명령어를 Fetch 단계에서 가져올 때, 해당 명령어가 분기 명령어일 가능성이 있다면 BTB를 먼저 조회합니다. 만약 해당 명령어의 기록이 BTB에 존재한다면, 예측된 분기 주소를 즉시 제공하여 Fetch 단계를 멈추지 않고 이어갈 수 있게 합니다.
BTB는 다음과 같은 구조로 구성됩니다:
- 분기 명령어 주소(PC): BTB에서의 인덱싱 기준
- 목적지 주소(Target PC): 예측된 분기 실행 위치
- 상태 비트: 이 명령어가 실제 분기 명령인지 여부를 판단
BTB는 주로 분기 목표 예측(Target Prediction)을 담당하며, 실제 분기가 발생했는지를 따지는 정보는 포함하지 않습니다. 이 구조는 특히 간접 분기(Indirect Branch)나 함수 호출/복귀(Call/Return) 등에서 큰 효과를 발휘합니다. 빠른 목적지 결정은 파이프라인 낭비를 줄이고, CPU가 분기 명령어를 처리하는 시간을 단축하는 데 기여합니다.
Branch History Table(BHT)의 개념과 역할
BHT는 BTB와는 달리, 분기 명령어의 이전 실행 결과를 기반으로 "분기할지 여부"를 예측하는 구조입니다. 일반적으로 각 분기 명령어에 대해 1비트 또는 2비트로 구성된 상태 비트를 유지하며, 과거의 행동을 분석해 미래의 행동을 예측합니다.
예를 들어, 2비트 포화 카운터 방식에서는 다음 네 가지 상태를 가집니다:
- Strongly Not Taken
- Weakly Not Taken
- Weakly Taken
- Strongly Taken
이 상태들은 분기 결과에 따라 상하로 이동하며, 특정 분기 명령어가 Taken/Not Taken 될 가능성을 동적으로 예측합니다. BHT는 주로 분기 방향 예측(Direction Prediction)에 사용되며, BTB가 제공한 목적지로 이동할지 말지를 결정하는 데 핵심적인 역할을 합니다.
또한 고급 BHT 설계에서는 Global History Register(GHR) 및 Pattern History Table(PHT)과 같은 구조를 통해 전체 프로그램 흐름 기반의 예측도 함께 수행됩니다. 이로 인해 반복적인 루프, 조건문, 분기 패턴 등 다양한 실행 흐름을 효율적으로 캐치할 수 있습니다.
BTB와 BHT의 차이 및 통합 활용 방식
BTB와 BHT는 분기 예측에서 서로 다른 역할을 수행하지만, 실질적으로는 함께 작동하며 높은 예측 정확도를 달성합니다. 아래는 이 두 구조의 핵심 차이점입니다:
구분 | BTB | BHT |
---|---|---|
예측 대상 | 분기 목표 주소 (Target) | 분기 여부 (Taken / Not Taken) |
기능 | 어디로 갈지를 예측 | 갈지 말지를 예측 |
저장 정보 | 분기 명령어 주소 → 목적지 주소 | 분기 명령어 주소 → 예측 상태 비트 |
활용 시점 | 명령어 Fetch 단계 | 분기 조건 판단 전 |
현대 CPU에서는 BTB와 BHT가 통합되어, 분기 명령어가 들어오면 BTB에서 목적지를 가져오고, 동시에 BHT에서 분기 여부를 예측합니다. 두 정보가 모두 긍정적인 경우, 해당 분기 명령어를 추측 실행 경로에 포함시켜 파이프라인을 계속 유지합니다.
추가로, 일부 고급 CPU는 Return Address Stack (RAS)과 Indirect Target Predictors 같은 구조를 함께 활용하여, 함수 복귀나 다중 경로 분기에서도 높은 정확도를 유지합니다.
결론적으로 BTB와 BHT는 분기 예측 구조에서 서로 보완적인 역할을 수행하며, 정밀하고 고속의 명령어 흐름 관리를 가능하게 합니다. 이를 통해 CPU는 더욱 빠르고 예측 가능한 연산 흐름을 유지할 수 있으며, 전반적인 시스템 응답성과 성능을 향상시키는 데 기여합니다.