컴퓨터 구조

분기 예측

파이프라인 CPU는 분기 명령어의 결과가 나오기 전에 다음 명령어를 미리 가져와야 합니다. 그래서 "이번에도 분기할 것"인지 짐작해서 그쪽 명령어를 가져오고, 틀리면 가져온 명령어를 버립니다. 짐작을 잘할수록 버리는 일이 줄어듭니다.

항상 분기, 1비트, 2비트 예측기가 같은 분기 결과를 얼마나 맞히는지 비교하는 시뮬레이터

1. 분기 결과 패턴을 고르세요 (T = 분기함, N = 분기 안 함)

2. 분기를 하나씩 실행하세요

표의 맨 윗줄이 실제 분기 결과이고, 아래 세 줄이 각 예측기가 미리 짐작한 값입니다. 초록색은 맞힌 것, 빨간색은 틀린 것입니다. 오른쪽 상태도는 2비트 예측기의 현재 상태입니다.

틀렸을 때파이프라인 비움
1비트지난번 결과 그대로
2비트두 번 틀려야 바뀜
최신 CPU95% 이상 적중

1비트 예측기는 반복문 끝에서 두 번 틀립니다

1비트 예측기는 지난번 결과를 그대로 다음 예측으로 씁니다. 반복문은 대부분 T이다가 마지막에 한 번 N이 나오는데, 1비트는 그 N에서 한 번 틀리고, 다음 반복문의 첫 T에서 "지난번이 N이었으니 N"이라고 또 틀립니다.

2비트 예측기는 한 번의 예외에 흔들리지 않습니다

2비트 예측기는 상태를 네 개 둡니다. "강하게 분기함" 상태에서 N이 한 번 나와도 "약하게 분기함"으로 한 칸 내려갈 뿐 예측은 여전히 T입니다. 같은 방향으로 두 번 연속 틀려야 예측이 바뀌므로, 반복문의 마지막 N 한 번에는 한 번만 틀립니다. 반대로 TNTN처럼 매번 바뀌는 패턴에는 1비트, 2비트 모두 약합니다.

코드에서 체감하는 분기 예측

정렬된 배열에서 if (x >= 128)를 반복하면 결과가 N…N T…T로 뭉쳐 있어 예측이 거의 다 맞지만, 무작위 순서면 절반 가까이 틀려 같은 코드가 몇 배 느려집니다. 성능이 중요한 반복문에서는 분기를 줄이거나 결과가 한쪽으로 몰리게 데이터를 배치합니다. 틀릴 때마다 잃는 클럭은 파이프라인 깊이에 비례하므로, 단계가 많은 최신 CPU일수록 예측이 중요합니다.