자막
음성

Lec 8 part2 · Lec 9 · data forwarding·load-use stall 과 control hazard 도입

정밀 정리 · 검증 2026-09-24 16:46

1개요

1.1Lec 8 후반: RAW stall 의 성능 손실(IPC=N/(N+S))을 data forwarding(register bypassing)과 forwarding unit 으로 제거.
1.2load-use 는 forwarding 으로도 1 stall → hazard detection unit, MIPS load delay slot, compiler code scheduling 으로 대응.
1.3superpipelining 은 clock 을 올리지만 의존 instruction 사이 bubble 이 늘어 2x speedup 불가.
1.4Lec 9 시작: control dependence = PC 에 대한 data dependence, stall 하면 성능 절반 → PC+4 예측(~86% 정확).

2섹션별 정리 상황·문제 → 원인 → 해결

2.10:30–7:00복습: RAW hazard 와 stall 조건
상황·문제younger instruction 이 older instruction 이 쓸 register 를 ID 에서 읽는데 값은 WB 에서야 RF 에 들어간다.
원인use(ID)와 produce(WB) 사이 거리 3. dist(I_OLD, I_YOUNG) ≤ 3 이면 RAW hazard.
해결stall 조건: rs1/rs2_ID == rd_{EX,MEM,WB} && use_rs(IR_ID) && RegWrite. use_rs 는 rs != x0 확인. ID·IF 는 멈추고 EX·MEM·WB 는 drain.
  • x0 는 항상 0 이라 비교에서 제외
  • stall 시 뒤 3 stage 는 계속 실행(draining)
p.8
2.1.1 · p.8 · 3:26
p.17
2.1.2 · p.17 · 4:56
2.1.r.1Hazard (computer architecture) (Wikipedia) ↗ · data·control hazard 와 stall·forwarding 해결 개요
2.27:00–11:30stall 이 성능에 주는 영향
상황·문제sample assembly(for loop)에 RAW dependence 가 많아 stall 이 계속 들어간다.
원인stall cycle 하나당 1 cycle 손실. N instructions, S stall cycles 이면 IPC = N/(N+S).
해결S 는 RAW hazard 빈도, hazard 사이 거리, hazard 간 overlap 에 의존. I0 에 I1~I3 가 모두 의존하면 I1 앞 bubble 로 나머지도 해결.
  • ideal IPC = 1
  • 이렇게 stall 이 많으면 성능이 나빠 → 피할 방법 필요
p.18
2.2.1 · p.18 · 7:10 · align 은 p31 로 잡았으나 frame 확인 결과 p18
p.19
2.2.2 · p.19 · 8:08
2.2.r.1Pipeline stall (Wikipedia) ↗ · load 결과를 MEM 뒤에야 쓸 수 있어 bubble 이 필요한 예
2.311:30–18:30data forwarding(=register bypassing) 개념
상황·문제sub x2 뒤 and·or·add·sd 가 x2 를 쓰는데 RF 기준으로는 stall 필요.
원인x2 값은 WB 가 아니라 EX 끝(CC 3)에 이미 계산되어 pipeline register 에 있다.
해결EX 결과를 다음 instruction 의 ALU 입력으로 직접 forward. WB 와 같은 cycle 에 읽는 add 는 RF 내부 forwarding. 결과 architectural state 는 stall 과 동일.
  • RF 는 '올바른 data flow' 로 생각: add rx ry rz = ry·rz 를 마지막으로 정의한 instruction 결과를 가져와 rx 에 둔다
  • dataflow 만 지키면 실행 방식은 무관
p.20
2.3.1 · p.20 · 11:03
p.21
2.3.2 · p.21 · 13:00
p.22
2.3.3 · p.22 · 17:15
2.3.r.1Operand forwarding (Wikipedia) ↗ · 결과를 register file 을 거치지 않고 다음 instruction 에 넘기는 forwarding
2.418:30–24:00forwarding path 구현
상황·문제RAW hazard 시 필요한 operand 가 아직 RF 에 없다.
원인dist 1 은 EX/MEM, dist 2 는 MEM/WB pipeline register 에 값이 있다. 여러 값이 대기 중이면 가장 young 한 정의가 맞는 값.
해결ALU 두 입력 앞에 3-입력 MUX(RF·EX/MEM·MEM/WB). dist 3 은 RF 내부 forwarding 이라 diagram 에 안 보임.
  • retrieve operand from datapath, from the youngest definition
  • 중간에 Zoom 지연 문의: 문제 있으면 이메일·채팅으로 알리면 출석 면제
p.23
2.4.1 · p.23 · 18:35
p.24
2.4.2 · p.24 · 20:31
2.4.r.1Classic RISC pipeline (Wikipedia) ↗ · 5-stage pipeline 의 bypassing, load interlock, branch delay slot
2.524:00–27:00forwarding logic (ForwardA/B)
상황·문제MUX select 를 정하는 forwarding unit 이 필요하다.
원인EX 의 rs1/rs2 와 MEM·WB stage 의 rd, RegWrite 를 비교해야 한다.
해결rs1_EX!=0 && rs1_EX==rd_MEM && RegWrite_MEM 이면 MEM 에서(dist 1), 아니면 WB 조건이면 WB 에서(dist 2), 아니면 RF. rs2 도 동일.
  • ordering 중요: 더 young 한 MEM match 를 먼저 확인
  • forwarding logic 에는 use_rs1 helper 가 없다
p.25
2.5.1 · p.25 · 25:20
2.5.r.1Operand forwarding (Wikipedia) ↗ · 결과를 register file 을 거치지 않고 다음 instruction 에 넘기는 forwarding
2.627:00–30:30load-use hazard: forwarding 으로도 stall
상황·문제ld x2 바로 뒤 and 가 x2 를 사용.
원인load 값은 MEM 끝(CC 5)에 준비되는데 and 는 CC 4 EX 에서 필요 → 시간을 거슬러 forward 불가.
해결and 를 bubble(nop)로 1 cycle stall, 뒤 instruction 도 1 cycle 지연. or 는 forward, add 는 RF 내부 forwarding.
  • No backward arrow (can't go back in time)
p.26
2.6.1 · p.26 · 27:12
p.27
2.6.2 · p.27 · 30:07
2.6.r.1Pipeline stall (Wikipedia) ↗ · load 결과를 MEM 뒤에야 쓸 수 있어 bubble 이 필요한 예
2.730:30–34:40forwarding 후 data hazard 표와 hazard detection unit
상황·문제forwarding 이후 어느 instruction 이 어느 stage 에서 값을 use/produce 하는지 다시 정리.
원인R/I-type 은 EX 에서 use·produce, LD 는 EX use·MEM produce(MEM 에서 produce 하는 유일한 instruction).
해결Stall = [(rs1_ID==rd_EX && use_rs1) || (rs2_ID==rd_EX && use_rs2)] && MemRead_EX. hazard detection unit 이 PC·IF/ID write 를 막고 control 을 0 으로.
  • RAW hazard 가 없으면 여전히 ID 에서 RF read, WB 에서 write
  • hazard detection unit + forwarding unit 을 갖춘 pipeline 완성
p.28
2.7.1 · p.28 · 30:32
p.29
2.7.2 · p.29 · 33:26
2.7.r.1Classic RISC pipeline (Wikipedia) ↗ · 5-stage pipeline 의 bypassing, load interlock, branch delay slot
2.834:40–43:30질의응답: forwarding logic 에 use_rs 가 없는 이유
상황·문제use_rs1(IR_ID) 가 forwarding logic 에 왜 없는지 질문.
원인forwarding logic 은 ALU 입력 MUX 선택만 정한다. 해당 operand 를 안 쓰면(예: load 의 두 번째 operand 는 immediate) 무엇을 고르든 무관.
해결stall 조건에서는 안 쓰는 rs2 match 로 불필요한 stall 이 나면 안 되므로 helper 필요. 강의자가 설명이 복잡해졌다며 다음 강의에 슬라이드로 다시 설명 예정. load 관련 추가 질문은 Teams 로.
  • 실제 control 은 forwarding logic 외에 immediate 선택 등 다른 control 도 관여(단순화된 diagram)
p.24
2.8.1 · p.24 · 35:27
p.29
2.8.2 · p.29 · 37:23
2.943:30–50:00MIPS load delay slot
상황·문제MIPS(RISC-V 아님)는 load 바로 뒤 instruction 을 ISA 로 정의해 stall 을 없앤다.
원인R2000 은 load 의 architectural latency 를 1 instruction 으로 정의 → delay slot instruction 은 옛 register 값을 보는 것이 올바른 실행.
해결유용한 instruction 을 slot 에 넣으면 bubble 제거. 단 5-stage microarchitecture 를 ISA 에 노출: 더 깊은 pipeline·out-of-order 에선 무의미, 못 채우면 nop 로 program 만 커짐.
  • sample assembly 에서 lw 뒤 slt 는 1 stall 또는 1 nop(MIPS)
  • nop 삽입보다 pipeline 안에서 dynamic 하게 bubble 생성이 낫다
p.30
2.9.1 · p.30 · 43:41
p.31
2.9.2 · p.31 · 49:21
2.9.r.1Delay slot (Wikipedia) ↗ · MIPS 의 branch delay slot·load delay slot
2.1050:00–52:30code scheduling 으로 stall 회피
상황·문제a = b + e; c = b + f; 를 그대로 번역하면 load 직후 사용으로 stall 2개.
원인ld 뒤 바로 add 가 그 값을 사용(distance 1).
해결ld x4 를 위로 옮겨 load 와 사용 사이 distance 를 2 이상으로: 13 cycles → 11 cycles. compiler 나 assembly programmer 가 수행.
  • instruction 은 같고 순서만 변경
p.32
2.10.1 · p.32 · 50:05
2.10.r.1Instruction scheduling (Wikipedia) ↗ · compiler 가 instruction 순서를 바꿔 stall 을 피하는 최적화
2.1152:30–58:40superpipelining 과 그 한계
상황·문제5-stage pipeline 도 register 사이 combinational delay 가 커서 stage 를 더 쪼개면 clock 을 높일 수 있다.
원인10-stage(각 stage 2개로 분할)에서 r1 결과는 E_b 끝에 나오는데 의존 instruction 은 E_a 에서 필요 → 5-stage 에 없던 bubble 추가.
해결2x 깊이로 2x speedup 은 못 얻음. 예: P4 는 32-bit add 를 16-bit add 2 stage 로. 쪼갤 수 없으면 자원을 더 둔다(건조기 2대) — RAW 해결책은 아님.
  • latch delay 대비 combinational delay 비율이 클수록 stage 추가가 이득
p.34
2.11.1 · p.34 · 52:36
p.35
2.11.2 · p.35 · 57:02
p.36
2.11.3 · p.36 · 57:38
2.11.r.1Instruction pipelining (Wikipedia) ↗ · pipeline 을 깊게 할수록 clock 은 빨라지나 hazard 에 취약
2.11.r.2NetBurst (Wikipedia) ↗ · Intel P4 의 깊은 pipeline(20-stage)과 double-pumped ALU
2.1258:40–1:01:10질의응답: code scheduling 은 누가 하나
상황·문제compiler 가 어떤 CPU 에서 돌지 모르지만 널리 쓰이는 microarchitecture 를 가정해 rescheduling 할 수 있다. CPU 안에서 dynamic 하게 하는 것이 out-of-order core(이후 강의).
p.37
2.12.1 · p.37 · 58:45 · align 은 csed_L09 p25 로 잡았으나 frame 은 L08 p37(Ch 4.8)
2.131:01:10–1:05:30control hazard 도입: PC 를 통한 dependence
상황·문제data hazard 는 register 를 통한 dependence. programmer visible state 중 memory 는 load·store 가 같은 stage 라 문제없고 PC 는 아직 안 다룸.
원인모든 instruction 이 PC 를 읽고 수정(PC+4 또는 branch 의 PC+imm). 즉 control dependence 는 PC 에 대한 data dependence.
해결C 의 if-else 는 basic block 을 node 로 하는 control flow graph 가 되고, block 안은 PC+4, block 사이는 bxx·JAL·JALR 로 이동.
  • RISC-V reference card(교재 끝)에서 각 instruction 의 PC 갱신 확인
  • RAW·WAR·WAW 복습
p.2
2.13.1 · p.2 · 1:01:32
p.3
2.13.2 · p.3 · 1:02:22
p.4
2.13.3 · p.4 · 1:03:15
p.5
2.13.4 · p.5 · 1:05:03
2.13.r.1Basic block (Wikipedia) ↗ · 진입은 처음, 분기는 끝에만 있는 straight-line code
2.13.r.2Control-flow graph (Wikipedia) ↗ · basic block 을 node 로 하는 control flow graph
2.141:05:30–1:12:00PC hazard 분석과 stall 시 성능 절반
상황·문제모든 instruction 은 IF 에서 PC 를 use, next PC 는 ID(R/I, LD, SD) 또는 MEM(Bxx, JAL, JALR)에서 produce.
원인현재 instruction 을 decode 하기 전엔 PC+4 인지 PC+imm 인지 모른다 → PC hazard distance ≥ 1.
해결stall 로 해결하면 non-control-flow instruction 도 2 cycle 에 하나씩 fetch → 성능 절반. branch 는 더 많은 cycle 낭비.
  • data hazard 표와 혼동 금지: 이 표는 operand 가 아닌 PC
p.6
2.14.1 · p.6 · 1:05:52
p.7
2.14.2 · p.7 · 1:09:30 · align 은 4294 부터 잡음, frame 확인 결과 4170 부근부터 p7
2.14.r.1Hazard (computer architecture) (Wikipedia) ↗ · data·control hazard 와 stall·forwarding 해결 개요
2.151:12:00–1:17:50가장 단순한 branch prediction: next PC = PC+4
상황·문제next PC 를 모르는 동안 fetch 를 계속하려면 예측해야 한다.
원인control flow 는 약 20%, forward 50%·backward(loop) 90% taken → 전체 약 70% taken. 0.2×0.7 = 14% 는 PC+4 가 틀림.
해결PC+4(not-taken)로 예측해 매 cycle fetch, 약 86% 맞음. 틀리면 잘못 fetch 한 instruction 을 flush. 성능 영향 분석은 다음 강의.
  • [Lee and Smith, 1984] 통계
  • 출석 체크 없음
p.8
2.15.1 · p.8 · 1:13:01
p.9
2.15.2 · p.9 · 1:13:29
2.15.r.1Branch predictor (Wikipedia) ↗ · static prediction(항상 not-taken 등)과 misprediction 시 flush

3핵심 개념

3.1data forwarding(데이터 포워딩) = register bypassing
EX/MEM·MEM/WB pipeline register 의 결과를 RF 를 거치지 않고 ALU 입력으로 넘겨 RAW stall 을 제거.
3.1.r.1Operand forwarding (Wikipedia) ↗ · 결과를 register file 을 거치지 않고 다음 instruction 에 넘기는 forwarding
3.2internal forwarding(RF 내부 포워딩)
같은 cycle 에 RF 에 write 하는 값을 read 하는 instruction 이 바로 받음(dist 3).
3.3forwarding unit(포워딩 유닛)
rs1/rs2_EX 와 rd_MEM·rd_WB, RegWrite 를 비교해 ForwardA/B MUX select 생성. MEM match 우선.
3.4load-use hazard(로드-사용 해저드)
load 값은 MEM 끝에 준비, 바로 다음 instruction 은 EX 에서 필요 → forwarding 으로도 1 cycle stall.
3.4.r.1Pipeline stall (Wikipedia) ↗ · load 결과를 MEM 뒤에야 쓸 수 있어 bubble 이 필요한 예
3.5hazard detection unit(해저드 탐지 유닛)
MemRead_EX && rd_EX 가 rs1/rs2_ID 와 같으면 PC·IF/ID write 금지, control 0 으로 bubble.
3.6load delay slot(로드 지연 슬롯)
MIPS R2000 은 load 의 architectural latency 를 1 instruction 으로 정의, 바로 뒤 instruction 은 옛 값을 봄.
3.6.r.1Delay slot (Wikipedia) ↗ · MIPS 의 branch delay slot·load delay slot
3.7code scheduling(코드 스케줄링)
compiler 가 instruction 순서를 바꿔 load 와 사용 사이 거리를 늘려 stall 제거 (13 → 11 cycles).
3.7.r.1Instruction scheduling (Wikipedia) ↗ · compiler 가 instruction 순서를 바꿔 stall 을 피하는 최적화
3.8superpipelining(슈퍼파이프라이닝)
ALU·RF·memory 같은 기본 연산도 여러 stage 로 쪼개 clock 을 높임. 의존 instruction 사이 bubble 증가.
3.8.r.1Instruction pipelining (Wikipedia) ↗ · pipeline 을 깊게 할수록 clock 은 빨라지나 hazard 에 취약
3.9control dependence(제어 의존성)
모든 instruction 이 PC 를 use·set 하므로 PC 에 대한 data dependence.
3.10basic block(기본 블록)
중간에 branch 도 branch target 도 없는 instruction 열. control flow graph 의 node.
3.10.r.1Basic block (Wikipedia) ↗ · 진입은 처음, 분기는 끝에만 있는 straight-line code
3.11PC hazard distance(PC 해저드 거리)
decode 전엔 next PC 를 모르므로 최소 1.
3.12branch prediction(분기 예측): PC+4
not-taken 으로 가정하고 계속 fetch. 약 86% 맞고 틀리면 flush.
3.12.r.1Branch predictor (Wikipedia) ↗ · static prediction(항상 not-taken 등)과 misprediction 시 flush

4스스로 확인

4.1forwarding 이 있을 때 dist 1, 2, 3 의 operand 는 각각 어디서 오나?
답
dist 1 은 EX/MEM(MEM stage), dist 2 는 MEM/WB(WB stage), dist 3 은 RF 내부 forwarding.
4.2forwarding logic 에서 MEM match 를 WB match 보다 먼저 확인하는 이유는?
답
MEM 에 있는 instruction 이 더 young 한 정의이므로 그 값이 최신.
4.3ld x2 바로 뒤 and 가 x2 를 쓰면 왜 stall 이 필요한가?
답
load 값은 CC 5(MEM 끝)에 준비되는데 and 는 CC 4 EX 에서 필요, 시간을 거슬러 forward 불가.
4.4load delay slot 을 ISA 에 두는 것의 단점은?
답
5-stage microarchitecture 를 노출. 깊은 pipeline·out-of-order 에선 무의미하고, 채울 instruction 이 없으면 nop 로 program 만 커짐.
4.5PC+4 예측이 맞는 비율 86% 는 어떻게 나오나?
답
control flow 20% 중 70% taken → 14% 만 틀림. 나머지 80% non-control + 6% not-taken 은 PC+4 가 맞음.

5참고 자료

5.1Computer Organization and Design RISC-V Edition (Elsevier) ↗ · 교재 P&H RISC-V ed. (읽기: Ch 4.8, 4.9)
5.2Hazard (computer architecture) (Wikipedia) ↗ · data·control hazard 와 stall·forwarding 해결 개요
5.3Classic RISC pipeline (Wikipedia) ↗ · 5-stage pipeline 의 bypassing, load interlock, branch delay slot
5.4Operand forwarding (Wikipedia) ↗ · 결과를 register file 을 거치지 않고 다음 instruction 에 넘기는 forwarding
5.5Branch predictor (Wikipedia) ↗ · static prediction(항상 not-taken 등)과 misprediction 시 flush

7한국어판 강의자료

단축키
Ctrl K · s자료 검색
[ ]이전·다음 강의
Space영상 재생·정지
j k다음·이전 section
n p다음·이전 slide
b강의 목록 접기·펴기
t맨 위
/강의 검색
Esc닫기