Study Hub

Microarchitecture / High

Pipeline Hazards

Pipeline Hazards는 5-stage RISC-V pipeline에서 data/control dependency를 보고 Forwarding, Stall, Flush를 timing grid에 정확히 표시하는 단원입니다.

Why This Matters

RO 시험에서 pipeline 문제는 암기보다 표 작성 능력을 봅니다. instruction sequence가 주어지면 IF, ID, EX, MEM, WB를 cycle별로 놓고, RAW data hazard가 forwarding으로 해결되는지 또는 stall이 필요한지 판단해야 합니다.

Pipeline은 single instruction latency를 무조건 줄이는 기술이 아니라 Durchsatz를 높이는 기술입니다. 이 차이를 모르면 n개의 instruction이 왜 n+4 cycle 근처에서 끝나는지, 그리고 hazard가 왜 추가 cycle을 만드는지 이해하기 어렵습니다.

German course terms인 Stufe, Datenhazard, Kontrollhazard, Forwarding, Stall, Flush를 보존해서 익히면 Vorlesung과 Uebung 문제 문장을 더 빠르게 읽을 수 있습니다.

Beginner Story

Pipeline을 세탁 공정처럼 생각해 보세요. 한 벌의 옷은 세탁, 헹굼, 탈수, 건조를 모두 거쳐야 하므로 latency는 여전히 여러 단계입니다. 하지만 여러 벌의 옷을 겹쳐 넣으면 매 시간마다 한 벌씩 끝낼 수 있어 throughput이 좋아집니다.

RISC-V 5-stage pipeline도 비슷합니다. IF는 instruction을 가져오고, ID는 decode와 register read를 하며, EX는 ALU 계산이나 branch 비교를 합니다. MEM은 load/store의 data memory 단계이고 WB는 rd에 결과를 씁니다.

Hazard는 이 공정이 그냥 흘러가면 틀린 결과가 날 수 있는 상황입니다. 앞 instruction이 아직 값을 만들지 않았는데 뒤 instruction이 그 값을 쓰려 하거나, branch 결과가 나오기 전에 틀린 PC에서 instruction을 가져오면 hazard입니다.

해결책 이름을 정확히 나누는 것이 중요합니다. Forwarding은 준비된 값을 register file을 기다리지 않고 옆길로 보내는 것입니다. Stall은 맞는 instruction을 잠깐 붙잡아 두는 것입니다. Flush는 wrong-path instruction을 없애는 것입니다.

시험에서는 말로만 설명하지 말고 timing grid에 화살표, bubble, X 표시를 남겨야 합니다. 표를 보면 producer가 언제 값을 만들고 consumer가 언제 값을 필요로 하는지 한눈에 보입니다.

Glossary / Key Terms

  • Pipelineinstruction 실행을 여러 Stufe로 나누고 서로 다른 instruction을 겹쳐 실행하는 Mikroarchitektur입니다. Exam tip: Pipeline이 latency가 아니라 주로 Durchsatz를 개선한다는 말을 함께 적으면 좋습니다.
  • IFInstruction Fetch 단계입니다. PC로 instruction memory에서 instruction을 가져옵니다. Exam tip: timing grid의 첫 칸은 대부분 IF입니다.
  • IDDecode와 register read 단계입니다. opcode, rs1, rs2, rd 등을 해석합니다. Exam tip: stall이 걸리면 IF/ID가 hold되는 모양으로 표시되는 경우가 많습니다.
  • EXALU 계산, effective address 계산, branch comparison이 일어나는 단계입니다. Exam tip: ALU result는 EX 끝에 준비되어 forwarding 판단의 기준이 됩니다.
  • MEMload/store가 data memory에 접근하는 단계입니다. Exam tip: load data는 MEM 뒤에 준비되므로 load-use hazard의 핵심입니다.
  • WB계산 결과나 loaded data를 register file의 rd에 쓰는 단계입니다. Exam tip: forwarding이 있으면 WB까지 기다리지 않아도 되는 경우가 많습니다.
  • RAW hazardolder instruction이 쓸 register를 younger instruction이 읽으려는 Read After Write dependency입니다. Exam tip: 기본 5-stage in-order 문제에서는 RAW를 먼저 찾고 WAR/WAW는 보통 중심이 아닙니다.
  • ForwardingEX/MEM 또는 MEM/WB 같은 pipeline register의 값을 consumer EX 입력으로 직접 보내는 방법입니다. Exam tip: producer stage와 consumer EX cycle을 비교해서 화살표로 표시하세요.
  • Stall값이 아직 늦어서 pipeline 일부를 hold하고 bubble을 넣는 동작입니다. Exam tip: load-use에서는 보통 1-cycle stall을 먼저 의심합니다.
  • Flushbranch/jump 때문에 잘못 가져온 younger instruction을 무효화하는 동작입니다. Exam tip: stall과 혼동하지 말고 wrong path에는 X 또는 FLUSH를 표시하세요.

Step-by-Step Method

  1. 1. 기본 timing grid를 그리기행에는 instruction을, 열에는 C1, C2처럼 cycle을 놓습니다. 첫 instruction은 IF ID EX MEM WB로 쓰고 다음 instruction은 한 cycle 오른쪽에서 시작합니다.
  2. 2. producer와 consumer 찾기rd에 값을 쓰는 older instruction을 producer로 표시하고, 그 register를 rs1/rs2로 읽는 younger instruction을 consumer로 표시합니다. x0는 항상 0이므로 의미 있는 producer가 아닙니다.
  3. 3. 값이 준비되는 stage 확인ALU instruction의 결과는 EX 끝에 준비되고, load의 loaded data는 MEM 끝에 준비됩니다. 이 차이가 ALU forwarding과 load-use stall을 가릅니다.
  4. 4. consumer가 값을 쓰는 stage 확인ALU operand는 EX 시작에 필요합니다. branch comparison이 EX에서 일어나는 모델이면 branch도 EX에서 operand가 필요합니다.
  5. 5. Forwarding, Stall, Flush 결정값이 제때 옆길로 올 수 있으면 Forwarding, 너무 늦으면 Stall, PC가 틀려 wrong-path instruction이 들어왔으면 Flush입니다.
  6. 6. cycle 수와 execution time 계산마지막 instruction의 완료 cycle을 세고, 문제에서 Taktperiode가 주어지면 Takte x Taktperiode로 Ausfuehrungszeit를 계산합니다.

Visual Model

C1C2C3C4C5C6C7 lw x5,0(x1)IFIDEX addrMEM dataWB add x6,x5,x7IFID holdstall bubbleEX use x5MEMWB sub x8,x6,x9IF holdstallIDEX use x6MEM

Load-use hazard: lw data is ready after MEM, so the consumer is held one cycle and then MEM/WB -> EX forwarding supplies x5.

C1C2C3C4C5C6C7 add x5,x1,x2IFIDEX resultMEMWB sub x6,x5,x3IFIDEX fwd x5MEMWB beq x6,x0,LIFIDEX decide takenMEMWB wrong pathIFflush X L: targetIFIDEX

Forward, stall, flush are different annotations: forward passes a ready value, stall waits for a late value, flush removes wrong-path instructions after a taken branch.

Forwarding grid

ALU result가 EX/MEM에서 consumer EX로 전달되는 grid입니다.

producer EX, consumer EX, ForwardAE/ForwardBE

Load-use stall grid

lw data가 MEM 뒤에 나오기 때문에 IF/ID hold와 bubble이 들어가는 grid입니다.

ID hold, bubble, MEM/WB -> EX

Branch flush grid

taken branch가 EX에서 결정된 뒤 younger wrong-path instruction을 X로 표시합니다.

taken branch, FlushD/FlushE, target IF

Interactive Visual

Pipeline Hazard Grid

forwarding/stall/flush를 켜고 끄며 pipeline timing grid를 비교하세요.

ready

JavaScript가 켜져 있으면 이 영역이 조작 가능한 visual lab으로 바뀝니다.

Worked Examples

ALU-to-ALU Forwarding

Problem: `add t0,t1,t2; sub t3,t0,t4; or t5,t3,t6`에서 stall 수를 구하세요. Forwarding은 있다고 가정합니다.

  1. `add`는 t0를 쓰고 `sub`는 t0를 읽으므로 RAW hazard입니다.
  2. `sub`는 t3를 쓰고 `or`는 t3를 읽으므로 두 번째 RAW hazard입니다.
  3. `add`의 EX는 C3이고 `sub`의 EX는 C4입니다. ALU result는 C3 끝에 준비되어 C4 EX로 forwarding됩니다.
  4. `sub`의 EX는 C4이고 `or`의 EX는 C5입니다. 이것도 forwarding으로 해결됩니다.
  5. 따라서 bubble은 0개이고 마지막 WB는 C7입니다.

RAW가 있다는 사실과 stall이 필요하다는 결론은 다릅니다. producer가 ALU인지 load인지 확인하세요.

Load-Use Hazard

Problem: `lw t0,0(sp); add t1,t0,t2; sub t3,t1,t4`에서 필요한 stall을 표시하세요.

  1. `lw -> add`는 t0에 대한 RAW dependency입니다.
  2. `lw`의 EX 결과는 address이고 loaded data는 MEM 끝에 나옵니다.
  3. 바로 다음 `add`가 C4 EX에서 t0를 쓰려면 값이 너무 늦습니다.
  4. IF/ID를 한 cycle hold하고 EX에 bubble을 넣어 `add`의 EX를 C5로 미룹니다.
  5. 그 뒤 `add -> sub`는 ALU forwarding으로 해결됩니다.

load-use에서는 보통 1 stall 후 MEM/WB -> EX forwarding이라고 설명하면 됩니다.

Taken Branch Flush

Problem: `beq s0,t0,done; addi s1,s1,1; addi s2,s2,1; done: add s3,s3,s0`에서 branch가 EX에서 taken으로 결정되면 무엇을 flush하나요?

  1. `beq`는 C3 EX에서 taken 여부를 결정한다고 둡니다.
  2. 그 시점에 `addi s1`은 ID, `addi s2`는 IF에 있을 수 있습니다.
  3. taken이면 두 instruction은 sequential wrong path입니다.
  4. 이 instruction들이 register를 바꾸지 못하도록 control을 무효화하고 flush합니다.

branch 자신이 아니라 branch보다 younger인 wrong-path instruction이 flush 대상입니다.

Common Mistakes

  • RAW dependency가 보이면 무조건 stall한다고 생각함producer가 ALU이면 forwarding으로 해결되는지 먼저 확인합니다.
  • `lw`의 EX 결과를 loaded data로 착각함EX는 address 계산이고 data는 MEM 뒤에 준비된다고 적습니다.
  • stall과 flush를 같은 bubble로 표시함stall은 기다림, flush는 wrong-path 제거라고 원인을 분리합니다.
  • x0 write를 hazard로 계산함RISC-V x0는 항상 0이므로 rd가 x0이면 dependency를 무시합니다.
  • branch penalty를 항상 같은 숫자로 외움branch decision stage와 문제의 pipeline diagram을 확인합니다.

Active Recall

  • 5-stage pipeline의 순서를 말해 보세요.Hint: Fetch부터 Writeback까지입니다.
    정답 확인

    IF, ID, EX, MEM, WB.

  • ALU-to-ALU RAW가 forwarding으로 해결되는 이유는?Hint: ALU result가 언제 준비되는지 생각하세요.
    정답 확인

    ALU result가 EX 끝에 준비되어 다음 cycle의 EX 입력으로 전달될 수 있기 때문입니다.

  • load-use hazard에서 stall이 필요한 이유는?Hint: `lw`의 EX 결과와 MEM 결과를 구별하세요.
    정답 확인

    loaded data가 MEM 끝에 준비되어 바로 다음 instruction의 EX 시작에는 늦기 때문입니다.

  • Flush는 어떤 상황에서 쓰나요?Hint: 값이 늦은 문제가 아니라 PC가 틀린 문제입니다.
    정답 확인

    taken branch/jump 등으로 wrong-path younger instruction이 들어왔을 때 제거합니다.

  • Forwarding 조건에서 rd != x0를 확인하는 이유는?Hint: x0의 architectural 의미를 떠올리세요.
    정답 확인

    x0는 항상 0이고 write가 의미 없으므로 forwarding할 실제 결과가 없기 때문입니다.

Exam Connection

Uebung 9 유형에서는 instruction sequence를 주고 nops, Reordering, Forwarding, Stall, Flush를 비교하게 합니다. 표를 먼저 그려야 cycle 수 실수를 줄일 수 있습니다.

Performance 문제와 결합되면 마지막 완료 cycle을 세고 Taktperiode를 곱합니다. Pipeline speedup은 hazard penalty를 포함한 실제 Takte로 비교해야 합니다.

서술형에서는 Forwarding/Stall/Flush의 원인을 정확히 분리해야 합니다. Data hazard는 register value timing 문제이고, control hazard는 PC 경로 문제입니다.

Source Grounding

Grounding entries are course-file and source-window hints for study. When a problem needs an exact page number, branch penalty, address, or formula convention, verify the cited PDF window before finalizing the answer.

Full beginner lecture

Pipeline Hazards

목표

Pipeline Hazards는 "여러 RISC-V instruction을 겹쳐 실행할 때 언제 기다리고, 언제 값을 전달하고, 언제 잘못 가져온 instruction을 버리는가"를 판단하는 단원입니다. 시험에서는 긴 설명보다 pipeline timing grid를 정확히 그리는 능력이 중요합니다. German term은 Pipeline, Stufe, Forwarding, Stall, Flush, Datenhazard, Kontrollhazard처럼 그대로 익혀 두면 문제 문장을 빠르게 읽을 수 있습니다.

직관

5-stage pipeline은 한 instruction을 IF, ID, EX, MEM, WB로 나눕니다. IF는 instruction fetch, ID는 decode와 register read, EX는 ALU 계산 또는 branch 비교, MEM은 data memory 접근, WB는 register writeback입니다. 한 instruction의 latency가 마법처럼 1 cycle로 줄어드는 것이 아니라, 여러 instruction이 서로 다른 Stufe에 동시에 들어가 Durchsatz가 좋아지는 구조입니다.

문제는 instruction들이 독립적이지 않다는 점입니다. add t0, t1, t2 바로 뒤의 sub t3, t0, t4t0를 필요로 합니다. 앞 instruction이 값을 만들기 전에 뒤 instruction이 그 값을 쓰려고 하면 RAW data hazard가 생깁니다. branch는 다음 PC가 아직 확정되지 않은 상태에서 이미 다음 instruction을 가져오기 때문에 control hazard가 생깁니다.

핵심 규칙

  1. 먼저 표를 그립니다. 행은 instruction, 열은 cycle입니다. 기본은 IF ID EX MEM WB가 cycle마다 한 칸씩 오른쪽으로 이동합니다.
  2. producer와 consumer를 찾습니다. producer는 rd에 값을 쓰는 older instruction이고, consumer는 그 register를 rs1 또는 rs2로 읽는 younger instruction입니다.
  3. ALU 결과는 EX 끝에서 준비됩니다. 다음 instruction의 EX 입력으로 forwarding할 수 있으면 stall이 필요 없습니다.
  4. lw의 loaded data는 MEM 끝에서 준비됩니다. 바로 다음 instruction이 그 값을 EX에서 쓰면 보통 1-cycle stall이 필요합니다.
  5. taken branch에서 이미 가져온 younger wrong-path instruction은 stall이 아니라 flush입니다.

Visual Block: Forwarding, Stall, Flush

ALU -> ALU forwarding, no stall

Cycle:          C1   C2   C3        C4        C5   C6
add t0,t1,t2    IF   ID   EX result MEM       WB
sub t3,t0,t4         IF   ID        EX uses t0 MEM  WB
                              ^-------- Forward EX/MEM -> EX

결론: RAW dependency는 있지만 ALUResult가 제때 forwarding되므로 bubble은 0개입니다.
Load-use hazard, one stall

Cycle:          C1   C2   C3       C4          C5        C6   C7
lw  t0,0(sp)    IF   ID   EX addr  MEM data    WB
add t1,t0,t2         IF   ID hold  stall       EX uses t0 MEM  WB
sub t3,t1,t4              IF hold  stall       ID        EX   MEM
                                      ^ bubble       ^ MEM/WB -> EX

결론: `lw`의 EX 결과는 address일 뿐이고, 실제 loaded data는 MEM 뒤에 준비됩니다.
Taken branch, flush wrong path

Cycle:             C1   C2   C3              C4   C5
beq s0,t0,done     IF   ID   EX decide taken
addi s1,s1,1            IF   ID -> FLUSH
addi s2,s2,1                 IF -> FLUSH
done: add s3,s3,s0              IF             ID   EX

결론: PC 경로가 틀렸기 때문에 기다리는 것이 아니라 wrong-path instruction을 제거합니다.

Worked Example 1: ALU Forwarding

문제:

add t0, t1, t2
sub t3, t0, t4
or  t5, t3, t6

풀이:

  1. addt0를 쓰고 subt0를 읽습니다. add -> sub RAW hazard입니다.
  2. subt3를 쓰고 ort3를 읽습니다. sub -> or RAW hazard입니다.
  3. 기본 timing grid를 그리면 add의 EX는 C3, sub의 EX는 C4, or의 EX는 C5입니다.
  4. ALU 결과는 EX 끝에 준비되므로 C4의 sub EX로 add 결과를 forwarding할 수 있습니다.
  5. 같은 이유로 C5의 or EX로 sub 결과를 forwarding할 수 있습니다.
정답·검산 확인

RAW hazard는 2개이지만 stall은 0개입니다. 마지막 WB는 C7입니다.

Worked Example 2: Load-Use Stall

문제:

lw  t0, 0(sp)
add t1, t0, t2
sub t3, t1, t4

풀이:

  1. lw -> addt0에 대한 RAW hazard입니다.
  2. 이 hazard는 load-use입니다. lw의 EX는 address를 만들고, loaded data는 MEM 끝에 나옵니다.
  3. add가 바로 C4 EX에 들어가면 너무 이릅니다. 그래서 IF/ID를 hold하고 EX에 bubble을 넣습니다.
  4. add의 EX를 C5로 미루면 lw data를 MEM/WB에서 EX로 forwarding할 수 있습니다.
  5. add -> sub는 ALU forwarding으로 해결됩니다.
정답·검산 확인

1-cycle stall이 필요하고 마지막 WB는 C8입니다.

Worked Example 3: Branch Flush

문제:

beq s0, t0, done
addi s1, s1, 1
addi s2, s2, 1
done:
add s3, s3, s0

branch decision이 EX에서 나고 branch가 taken이라고 가정합니다.

풀이:

  1. beq가 C3 EX에서 taken 여부를 확정합니다.
  2. 그때 addi s1은 ID에 있고 addi s2는 IF에 있습니다.
  3. taken이면 두 instruction은 wrong path입니다.
  4. register state를 바꾸면 안 되므로 control을 무효화하고 flush로 표시합니다.
정답·검산 확인

addi s1, addi s2가 flush 대상입니다. beq 자체를 flush하는 것이 아닙니다.

Branch Prediction: 맞을 경로를 먼저 가져오기

입문 설명

Branch instruction이 EX 같은 뒤쪽 Stufe에 도착할 때까지 기다렸다가 다음 instruction을 fetch하면 Pipeline이 자주 비게 됩니다. Sprungvorhersage(Branch Prediction)는 branch 결과가 아직 확정되지 않았을 때 다음 PC를 먼저 추측합니다. 예측이 맞으면 이미 가져온 instruction을 계속 쓰고, 틀리면 wrong-path instruction을 Flush하고 올바른 PC에서 다시 시작합니다. 즉 prediction은 branch를 없애는 기술이 아니라 misprediction으로 인한 flush 횟수를 줄이는 기술입니다.

정확히 몇 instruction을 flush하는지는 branch decision이 어느 Stufe에서 나오는지에 따라 달라집니다. 이 강의 파일의 기존 5-stage 그림에서는 EX decision 예를 썼지만, 다른 문제에서는 반드시 주어진 Pipeline diagram을 우선합니다.

Worked Trace: forward beq의 실제 결과

현행 Übung 10의 다음 핵심 loop를 봅니다.

addi s0, zero, 0
addi t0, zero, 3
loop:
    beq  s0, t0, done
    addi s0, s0, 1
    j    loop
done:

beq는 forward branch이므로 강의의 정적 규칙은 매번 N(not taken)을 예측합니다.

beq 실행비교 전 s0실제 결과정적 예측판정
10NNcorrect
21NNcorrect
32NNcorrect
43TNmisprediction
정답·검산 확인

beq4회 실행, 실제 taken은 1회, 이 forward-not-taken 정적 규칙의 misprediction은 1회입니다. 검산은 s0=0,1,2,3 네 비교를 모두 적는 것입니다.

같은 N,N,N,T 결과에서 1-bit predictor의 초기 예측을 N이라고 명시하면 첫 세 번은 맞고 마지막 T에서 틀린 뒤 상태가 T로 바뀝니다. 같은 loop가 다시 시작되어 첫 결과가 N이면 직전 T 때문에 한 번 더 틀립니다. 2-bit predictor가 loop에서 보통 더 나은 이유가 이 단일 exit에 대한 hysteresis입니다.

변형 문제

addi t0, zero, 3
loop:
    addi t0, t0, -1
    bne  t0, zero, loop

강의의 backward-taken 정적 규칙을 적용할 때 bne의 실제 결과와 misprediction 수를 구하세요.

정답·검산 확인

t0는 비교 시 2,1,0이므로 실제 결과는 T,T,N입니다. 예측은 세 번 모두 T라서 앞의 두 번은 맞고 exit의 N에서 한 번 틀립니다. 따라서 bne 실행 3회, taken 2회, misprediction 1회입니다.

Active Recall

Q1. Prediction과 Flush의 관계는 무엇인가요?

정답 확인

결과 확정 전에 다음 PC를 예측하고, 예측이 틀렸을 때만 이미 들어온 wrong-path instruction을 flush합니다.

Q2. 정적 예측과 동적 예측의 핵심 차이는 무엇인가요?

정답 확인

정적 예측은 고정 규칙을, 동적 예측은 해당 branch의 과거 실행 이력을 사용합니다.

Q3. 왜 2-bit predictor가 loop에서 1-bit보다 보통 안정적인가요?

정답 확인

loop exit의 한 번 다른 결과만으로 즉시 장기 예측 방향을 뒤집지 않기 때문입니다.

근거: current:Vorlesung\Rechnerorganisation - Teil 2.pdf, pages 103-105와 112-117; current:Uebung\Lösung 10.pdf, pages 4-5.

RAW, WAR, WAW와 Out-of-Order dependency

입문 설명

기본적인 in-order 5-stage 문제에서는 instruction이 program order로 움직이므로 주로 RAW(Read After Write)를 찾습니다. 그러나 Out-of-Order Mikroarchitektur는 준비된 younger instruction을 먼저 시작할 수 있으므로 register 이름을 둘러싼 세 종류의 순서를 모두 지켜야 합니다.

RAW는 실제 데이터 흐름입니다. WAR와 WAW는 같은 architectural register 이름을 재사용해서 생기는 name dependency입니다. 강의의 Registerumbenennung(register renaming)은 WAR/WAW 제약을 줄일 수 있지만, producer 값이 실제로 필요한 RAW를 제거하지는 않습니다. Out-of-Order는 “마음대로 순서를 바꿈”이 아니라, dependency를 위반하지 않는 준비된 instruction만 먼저 실행하는 방식입니다.

Worked Trace: dependency graph 만들기

강의의 Out-of-Order 예를 번호로 표시합니다.

I1: lw  s8, 40(s0)
I2: add s9, s8, t1
I3: sub s8, t2, t3
I4: and s10, s4, s8
I5: or  s11, t5, t6
I6: sw  s7, 80(s11)
관계종류이유
I1 → I2RAW on s8I2는 I1이 load한 옛 s8 값을 읽어야 함
I1 → I3WAW on s8두 instruction이 모두 s8에 쓰므로 architectural write 순서를 유지해야 함
I2 → I3WAR on s8I2가 I1의 s8를 읽기 전에 I3가 새 s8를 쓰면 안 됨
I3 → I4RAW on s8I4는 I3가 계산한 새 s8를 읽어야 함
I5 → I6RAW on s11I6의 store address base가 I5의 결과임

따라서 I1–I4에는 dependency chain이 있지만 I5는 그 chain과 독립적으로 먼저 시작할 후보입니다. I6은 I5의 s11이 준비된 뒤에만 시작할 수 있습니다. 정확한 동시 실행 cycle은 issue width와 functional-unit 조건이 주어져야 정할 수 있으므로 여기서는 dependency graph까지만 닫힌 답으로 삼습니다.

검산법은 각 instruction 옆에 R={읽는 register}, W={쓰는 register}를 적고, program order의 두 instruction에 대해 older.W ∩ younger.R=RAW, older.R ∩ younger.W=WAR, older.W ∩ younger.W=WAW를 적용하는 것입니다.

변형 문제

다음 세 instruction의 모든 dependency를 분류하세요.

I1: add  t0, t1, t2
I2: sub  t1, t3, t4
I3: addi t0, t0, 1
정답·검산 확인
  • I1 → I2: I1이 old t1을 읽고 I2가 t1을 쓰므로 **WAR on t1**.
  • I1 → I3: I1이 t0을 쓰고 I3가 읽으므로 **RAW on t0**.
  • I1 → I3: 둘 다 t0을 쓰므로 동시에 **WAW on t0**.
  • I2와 I3 사이에는 공통 read/write register가 없으므로 이 세 분류의 dependency가 없습니다.

검산: I1 R={t1,t2}, W={t0}; I2 R={t3,t4}, W={t1}; I3 R={t0}, W={t0}.

Active Recall

Q1. RAW가 true dependency인 이유는 무엇인가요?

정답 확인

younger instruction이 필요로 하는 값 자체를 older instruction이 생산하기 때문입니다.

Q2. WAR에서 반드시 먼저 일어나야 하는 동작은 무엇인가요?

정답 확인

older instruction의 read가 younger instruction의 write보다 먼저 일어나야 합니다.

Q3. Register renaming이 줄일 수 있는 두 dependency는 무엇인가요?

정답 확인

register 이름 재사용 때문에 생기는 WAR와 WAW입니다. RAW 데이터 흐름은 남습니다.

Q4. Out-of-Order processor가 dependency가 없는 I5를 먼저 실행할 수 있다는 말은 program 결과 순서도 무시한다는 뜻인가요?

정답 확인

아닙니다. 실행 시작 순서는 바꿀 수 있어도 architectural dependency와 관찰 가능한 결과의 correctness는 유지해야 합니다.

근거: current:Vorlesung\Rechnerorganisation - Teil 2.pdf, pages 121-124; current:Uebung\Übung 11.pdfcurrent:Uebung\Lösung 11.pdf, pages 1-3.

자주 틀리는 점

Active Recall

Q1. 5-stage pipeline의 Stufe를 순서대로 말해 보세요.

정답 확인

IF, ID, EX, MEM, WB입니다.

Q2. add 바로 뒤의 subadd.rd를 읽으면 왜 stall이 보통 필요 없나요?

정답 확인

ALU 결과가 EX 끝에 준비되고 다음 cycle의 EX 입력으로 forwarding할 수 있기 때문입니다.

Q3. load-use hazard에서 왜 1-cycle stall이 필요한가요?

정답 확인

lw가 실제 loaded data를 MEM 끝에 얻기 때문에 바로 다음 instruction의 EX 시작에는 값이 아직 늦습니다.

Q4. taken branch에서 flush 대상은 누구인가요?

정답 확인

branch보다 younger이고 이미 잘못 가져온 sequential-path instruction입니다.

Source Grounding