교재처럼 순서대로 읽는 본문
이 글은 요약 카드가 아닙니다. 처음 보는 용어의 뜻부터 시작해, 왜 그런 규칙이 생겼는지와 문제에서 어떻게 사용하는지를 한 흐름으로 설명합니다.
이 장을 공부하는 이유
Pipeline 문제는 머릿속으로 움직이면 jump의 flush와 data dependency가 섞입니다. 가로축을 cycle, 세로축을 instruction으로 둔 표에 매 cycle 한 칸씩 오른쪽으로 이동시키면 눈으로 오류를 찾을 수 있습니다.
읽고 나면 할 수 있어야 하는 것
- IF·ID·EX·MEM·WB의 위치를 특정 cycle에서 복원한다.
- jump의 wrong-path instruction을 nop으로 flush한다.
- RAW data hazard와 x0의 가짜 dependency를 구분한다.
먼저 비유로 머릿속 구조 만들기
세차장의 다섯 구역처럼 여러 차가 동시에 서로 다른 구역에 있습니다. 출구를 잘못 안내한 jump가 발견되면 뒤따라 잘못 들어온 차 두 대를 빼내는 것이 flush입니다. 앞차가 만든 부품을 뒷차가 바로 필요로 하면 forwarding이나 대기(stall)가 필요합니다.
그림은 왼쪽에서 오른쪽으로 읽습니다. 각 화살표는 앞 단계의 결과가 다음 단계의 입력이 된다는 뜻입니다. 흐름도만 크게 열기
용어를 평범한 문장으로 바꾸기
독일어와 영어 용어를 소리만 외우지 말고, 아래 설명을 자신의 말로 다시 말해 보세요.
- IF/ID/EX/MEM/WB
- fetch, decode/read, execute, memory, writeback의 5 stages
- RAW hazard
- 뒤 instruction이 앞 instruction의 아직 준비되지 않은 결과를 읽는 위험
- forwarding
- writeback까지 기다리지 않고 중간 결과를 consumer 입력으로 전달
- stall
- 필요한 값이 올 때까지 일부 stage를 멈추고 bubble을 삽입
- flush
- 잘못 fetch한 instruction을 nop으로 무효화
개념을 처음부터 연결하기
1. 특정 시점 복원
그 cycle의 IF instruction을 먼저 놓고, 한 cycle 앞에 fetch된 instruction을 ID, 두 cycle 앞은 EX처럼 역으로 채웁니다. jump가 있으면 control-flow target과 flush 시점을 먼저 반영합니다.
2. Cycle 계산
hazard 없는 5-stage pipeline의 N개 instruction은 N+4 cycle입니다. 여기에 실제 jump flush penalty와 stall을 더합니다. Eintakt와 Mehrtakt는 같은 식을 쓰지 않습니다.
3. Dependency 찾기
앞 instruction의 rd와 뒤 instruction의 rs1/rs2를 비교합니다. rd=x0이면 write가 버려지므로 producer가 아닙니다. 같은 이름이 보여도 read-after-write인지 먼저 확인합니다.
이 챕터에서 계속 사용할 손풀이 표
아래 표는 정답표가 아니라 작업 기억을 외부에 꺼내 놓는 worksheet입니다. 소문제를 풀 때마다 빈 칸을 직접 채우세요.
| 표시 | 질문 | 기록 |
|---|---|---|
| Control flow | 실제로 다음에 실행되는 line은? | target 포함 목록 |
| Stage | 현재 cycle의 5칸은? | IF·ID·EX·MEM·WB |
| RAW | 앞 rd를 뒤 rs가 읽는가? | producer→consumer |
| Control hazard | wrong path가 들어왔는가? | flush된 instruction |
| Cycle | fill·stall·flush는? | N+4+penalty |
수식은 위아래 구조로 읽기
평문으로 제곱과 분수를 이어 쓰면 구조를 놓치기 쉽습니다. 아래 수식은 브라우저의 MathML로 렌더되며, 지수·아래첨자·분수를 실제 수학 표기처럼 보여 줍니다.
이상적인 5-stage Pipeline cycle 수
N은 실제로 실행되는 유효 instruction 수입니다. bubble과 flush는 별도 penalty입니다.
이번 문제의 Pipeline 계산
실행 instruction 10개, fill/drain 4 cycle, jump 두 번에 각각 2-cycle flush를 반영합니다.
작은 숫자로 한 번 직접 해보기
`add t0,t1,t2` 바로 뒤 `sub t3,t0,t4`는 t0 RAW입니다. 반면 `add x0,t1,t2` 뒤 `sub t3,x0,t4`에서 x0는 항상 0이므로 앞 결과를 기다리지 않습니다.
이 예제에서 중요한 것은 숫자 자체가 아니라, 어떤 값을 먼저 구하고 그 결과를 다음 계산에 넣는지입니다. 종이에 중간값을 생략하지 않고 적어 보세요.
초보자가 자주 멈추는 지점
instruction 번호와 소스 line 번호는 같은가요?
아닙니다. jump가 있으면 실행 순서는 line 번호 순서와 달라집니다. 먼저 실제 control-flow sequence를 적은 뒤 몇 번째 instruction인지 셉니다.
nop도 실제 instruction 수에 항상 더하나요?
flush로 생긴 nop은 유효한 program instruction은 아니지만 pipeline cycle은 차지합니다. N에는 유효 instruction만, penalty에는 bubble/flush를 더합니다.
같은 register 이름이 보이면 모두 hazard인가요?
producer가 실제로 write하고 consumer가 그 값을 준비되기 전에 read해야 RAW입니다. x0 write는 버려지고, read-read 관계는 RAW가 아닙니다.
시험지에서 손으로 쓰는 순서
- 실제 control-flow로 실행되는 instruction 목록을 먼저 씁니다.
- cycle×stage 표를 그리고 IF부터 한 칸씩 이동합니다.
- jump마다 잘못 들어온 instruction을 nop으로 표시합니다.
- 각 instruction의 rd와 뒤 rs를 연결해 RAW를 찾습니다.
- N+4+flush+stall 식과 표의 마지막 WB cycle이 같은지 대조합니다.
이 순서를 외우는 목적은 답을 암기하는 것이 아닙니다. 중간 과정을 답안지에 남겨 부분점수를 얻고, 어디에서 잘못됐는지 스스로 찾기 위한 체크포인트입니다.
5개 소문제로 개념 적용하기
각 소문제에는 이 장의 설명을 다시 포함한 독립 수업 페이지가 있습니다. 따라서 링크로 바로 들어가도 선행지식 없이 읽을 수 있습니다.
- 7a-1네 번째 instruction fetch 시점독립 수업 열기 →
첫 jump 이후 IF/ID/EX/MEM/WB를 채우세요. · 4 micro-work
- 7a-2일곱 번째 instruction fetch 시점독립 수업 열기 →
두 번째 jump 이후 pipeline을 채우세요. · 4 micro-work
- 7b세 processor의 총 cycle독립 수업 열기 →
line20부터 line26까지 실제 control-flow path의 cycle을 계산하세요. · 4 micro-work
- 7c-1가짜 dependency 제거: x0독립 수업 열기 →
`addi x0,...` 두 줄이 hazard를 만드는지 판단하세요. · 3 micro-work
- 7c-2첫 실제 hazard: t2→bne독립 수업 열기 →
`sub t2,t1,x0`와 `bne t2,zero,odd` 사이 hazard를 찾으세요. · 5 micro-work
출처
Source: Probeklausur.pdf / Probeklausur Musterlösung und Hinweise.pdf · 시험 p14–15 · 공식 해설 p39–40. 공식 답의 숫자와 course-specific datapath/FSM 가정은 변경하지 않았습니다.