10강 / 20강

파이프라인 — 세탁기와 건조기를 동시에

명령을 겹쳐 흘리기, 그리고 분기 예측

파이프라인 — 세탁기와 건조기를 동시에
한 벌이 다 끝나기를 기다리지 않습니다. 세탁이 끝나면 바로 다음 빨래를 넣어요.

5강에서 CPU는 인출 → 해독 → 실행 한 바퀴를 돈다고 했습니다. 그런데 인출을 하는 동안 ALU는 놀고, 실행하는 동안 인출 회로는 놉니다. 아깝죠?

그래서 겹쳐서 돌립니다. 빨래방에서 세탁기가 돌아가는 동안 먼저 끝난 빨래를 건조기에 넣는 것과 똑같아요.

겹치면 얼마나 빨라지나

겹치지 않으면 (한 번에 하나씩)
  명령1: [인출][해독][실행]
  명령2:                   [인출][해독][실행]
  명령3:                                     [인출][해독][실행]
  → 3개에 9클럭

파이프라인 (겹쳐서)
  명령1: [인출][해독][실행]
  명령2:       [인출][해독][실행]
  명령3:             [인출][해독][실행]
  → 3개에 5클럭.  100개면 102클럭!

명령 하나가 걸리는 시간(지연시간)은 그대로 3클럭입니다. 하지만 초당 몇 개를 뽑아내느냐(처리량)가 3배가 돼요. 현대 CPU는 이걸 14~20단계로 쪼갭니다.

파이프라인 실험실 — 단계를 늘려 보고, 해저드를 일으켜 거품(bubble)이 생기는 걸 보세요.
불러오는 중…
파이프라인은 처리량을 늘리지 지연시간을 줄이지 않습니다.
Python 브라우저에서 실행

줄이 끊기는 세 가지 — 해저드

🔗
데이터 해저드
앞 명령의 결과를
바로 다음이 써야 할 때
🔀
제어 해저드
점프할지 말지
아직 모를 때
🚧
구조 해저드
한 부품을
둘이 동시에 원할 때

제일 아픈 건 제어 해저드입니다. 6강에서 본 JLE loop 를 떠올려 보세요. 이 명령이 뛸지 말지는 실행 단계에 가야 압니다. 그런데 파이프라인은 그 사이에 이미 다음 명령들을 인출해 놨어요.

만약 뛰는 게 맞았다면? 이미 넣은 명령들을 전부 버려야 합니다. 14단계 파이프라인이면 14클럭이 통째로 날아가요.

분기 예측 실패는 파이프라인 길이만큼 손해입니다.
Python 브라우저에서 실행

예측하기 쉬운 코드 vs 어려운 코드

정렬된 데이터를 훑으면 if (x > 100) 의 답이 한동안 계속 같습니다. 예측기가 신나죠. 무작위 데이터면 매번 찍기라 절반은 틀립니다.

데이터를 정렬해 두는 것만으로 빨라지는 유명한 현상.
Python 브라우저에서 실행
branch-misses 가 2% 넘으면 예측하기 어려운 코드입니다.
bash 브라우저에서 실행
이 CPU가 안고 있는 알려진 취약점들입니다.
bash 브라우저에서 실행
🤔 확인 문제
파이프라인이 14단계인 CPU에서 분기 예측이 빗나가면 대략 얼마를 손해 볼까요?
🤔 확인 문제
파이프라인이 늘려 주는 것은?