10강 / 20강
파이프라인 — 세탁기와 건조기를 동시에
명령을 겹쳐 흘리기, 그리고 분기 예측
5강에서 CPU는 인출 → 해독 → 실행 한 바퀴를 돈다고 했습니다. 그런데 인출을 하는 동안 ALU는 놀고, 실행하는 동안 인출 회로는 놉니다. 아깝죠?
그래서 겹쳐서 돌립니다. 빨래방에서 세탁기가 돌아가는 동안 먼저 끝난 빨래를 건조기에 넣는 것과 똑같아요.
겹치면 얼마나 빨라지나
겹치지 않으면 (한 번에 하나씩) 명령1: [인출][해독][실행] 명령2: [인출][해독][실행] 명령3: [인출][해독][실행] → 3개에 9클럭 파이프라인 (겹쳐서) 명령1: [인출][해독][실행] 명령2: [인출][해독][실행] 명령3: [인출][해독][실행] → 3개에 5클럭. 100개면 102클럭!
명령 하나가 걸리는 시간(지연시간)은 그대로 3클럭입니다. 하지만 초당 몇 개를 뽑아내느냐(처리량)가 3배가 돼요. 현대 CPU는 이걸 14~20단계로 쪼갭니다.
파이프라인은 처리량을 늘리지 지연시간을 줄이지 않습니다.
Python
브라우저에서 실행
줄이 끊기는 세 가지 — 해저드
제일 아픈 건 제어 해저드입니다. 6강에서 본 JLE loop 를 떠올려 보세요.
이 명령이 뛸지 말지는 실행 단계에 가야 압니다. 그런데 파이프라인은
그 사이에 이미 다음 명령들을 인출해 놨어요.
만약 뛰는 게 맞았다면? 이미 넣은 명령들을 전부 버려야 합니다. 14단계 파이프라인이면 14클럭이 통째로 날아가요.
분기 예측 실패는 파이프라인 길이만큼 손해입니다.
Python
브라우저에서 실행
예측하기 쉬운 코드 vs 어려운 코드
정렬된 데이터를 훑으면 if (x > 100) 의 답이 한동안 계속 같습니다.
예측기가 신나죠. 무작위 데이터면 매번 찍기라 절반은 틀립니다.
데이터를 정렬해 두는 것만으로 빨라지는 유명한 현상.
Python
브라우저에서 실행
branch-misses 가 2% 넘으면 예측하기 어려운 코드입니다.
bash
브라우저에서 실행
이 CPU가 안고 있는 알려진 취약점들입니다.
bash
브라우저에서 실행
🤔 확인 문제
파이프라인이 14단계인 CPU에서 분기 예측이 빗나가면 대략 얼마를 손해 볼까요?
해설 이미 인출·해독해 둔 명령들이 전부 잘못된 길의 것이라 버려야 합니다. 파이프라인을 처음부터 다시 채우는 데 단계 수만큼 걸려요. 파이프라인을 길게 만들수록 예측 실패의 대가도 커집니다 — 그래서 무작정 길게 만들지 않습니다.
🤔 확인 문제
파이프라인이 늘려 주는 것은?
해설 명령 하나가 인출부터 완료까지 걸리는 시간은 오히려 조금 늘어납니다(단계 사이 저장 때문에). 대신 여러 명령이 겹쳐 흐르니 초당 뽑아내는 개수가 늘어요. 이 구분은 서버 성능을 볼 때도 똑같습니다 — 응답시간(latency)과 처리량(throughput)은 다른 이야기예요.