이 강의는 Pipelining을 통해
CPU가 instruction-level parallelism (ILP)을 활용하는 방식을 설명한다.
명령어 실행을 단계별로 나누고 겹쳐 실행함으로써
throughput을 향상시키는 것이 핵심이다.
Pipelining은 여러 instruction을
overlapped execution 방식으로 처리하는 구현 기법이다.
하나의 instruction을 여러 stage로 분할
서로 다른 instruction이 각기 다른 stage에서 동시에 실행
단일 instruction의 latency는 줄지 않지만, 전체 throughput은 증가
이 방식은 CPU 내부 자원의 활용도를 크게 높인다.
강의자료에서는 RISC 구조를 기준으로
다음과 같은 pipeline stages를 사용한다.
IF (Instruction Fetch)
ID / RF (Instruction Decode / Register Fetch)
EX (Execute)
MEM (Memory Access)
WB (Write Back)
각 stage는 서로 다른 functional unit을 사용하며,
stage 사이에는 pipeline register가 존재한다.
Pipelining의 이상적인 상태에서는:
매 cycle마다 새로운 instruction이 pipeline에 진입
매 cycle마다 하나의 instruction이 완료
Ideal CPI ≈ 1
이는 multi-cycle 구조와 비교했을 때
instruction 처리율이 크게 향상됨을 의미한다.
Pipeline에서는 모든 instruction을 항상 겹쳐 실행할 수는 없다.
이를 방해하는 요인을 hazard라고 한다.
hardware resource conflict로 인해 발생
동일한 functional unit을 동시에 사용하려는 경우
해결 방법: resource duplication 또는 stall
instruction 간 data dependency로 인해 발생
이전 instruction의 결과가 아직 준비되지 않은 경우
대표적인 dependency:
RAW (Read After Write)
해결 방법:
stall
forwarding (bypassing)
branch, jump와 같은 control flow instruction으로 인해 발생
다음 PC 값이 확정되지 않은 상태에서 instruction fetch가 진행됨
해결 방법:
stall
branch prediction
delayed branch
Stall은 pipeline 진행을 일시적으로 멈추는 동작이다.
이때 실행 의미가 없는 cycle을 bubble이라고 부른다.
correctness는 보장되지만
performance는 감소한다
따라서 stall은 가능한 한 최소화하는 것이 목표이다.
Forwarding은 data hazard를 줄이기 위한 hardware 기법이다.
register write를 기다리지 않고
pipeline 내부의 intermediate result를 직접 전달
(회로를 새로 그리는 방법이다)
RAW hazard의 대부분을 제거 가능
단, 모든 Load 명령어 다음에 RAW가 바로 오는 경우만 해결 불가능하다.
강의자료 3은 다음 내용을 다룬다.
Pipelining은 instruction-level parallelism을 활용하는 핵심 기법이다
Pipeline은 여러 stage로 구성되며, throughput 향상이 목적이다
Structural, Data, Control hazard는 pipelining의 주요 제약 조건이다
Stall과 forwarding은 correctness와 performance 사이의 균형을 맞추기 위한 수단이다