leehyeon-dv 님의 블로그
4.5 An Overview of Pipelining 본문
🔑Table of Contents
- Pipeling Analogy
- MIPS Pipeline
- Pipeline 성능
- Pipeline Speedup
- Pipelining and ISA Design
- Hazards
- Structure Hazards (구조적 해저드)
- Data Hazards(데이터 해저드)
- Data Hazards -- Forwarding (aka Bypassing(전방전달))
- Data Hazards -- Fowarding --- Load-Usw Data Hazard
- Code Scheduling to Avoid Stalls
- Control Hazards
- Control Hazards -- Stall on Branch
- control Hazards --- Branch Prediction
- control Hazards --- MIPS with Predict Not Taken
- control Hazards --- More-Realistic Branch Prediction
- Pipeline Summary
📌 Pipeling Analogy
유추
- 파이프화된 빨래 : 겹치는 실행
- 병렬처리는 성능을 향상시켜준다
- 4번의 연속된 작업 = 속도향상 =기존실행시간/개선된시간
- = 8/3.5 = 2.3배 속도향상됨
- 파이프라인 작업에서 속도향상
- = 비 파이프라인 처리시간/ 파이프라인 처리시간
- (작업수:n, 작업에 걸리는시간(예시) :2)
- (파이프라인이 채워질 때까지의 초기시간 : 1.5, 단계마다 걸리는시간 : 0.5)
- 2n / (1.5 + 0.5n) ≒ 4 (파이프라인 단계 수가 4로 가정되어있기에 이론적으로 최대 4배의 성능향상이 가능함)
- = 비 파이프라인 처리시간/ 파이프라인 처리시간
📌 MIPS Pipeline
- 5개의 stage. stage마다 하나의 단계를 수행함
- IF : 메모리로부터 명령어를 불러옴 (Instruction Fetch)
- ID : 명령어해석, 레지스터 read (Instruction Decode & register read)
- EX : EXcute operation(작업실행) 혹은 calculate address(주소계산)
- MEM : access MEMory operand (메모리에 접근)
- WB : Write result Back to register(레지스터에 결과기록)
📌 Pipeline 성능
각 stage별 시간을 측정하면 register read나 write에는 100 p(=10^-12) second 소요
다른 stage들은 200ps
instruction | instr fetch |
Register read |
ALUop | Memmory access |
Register write |
Total time |
lw | 200ps | 100ps | 200ps | 200ps | 100ps | 800ps |
sw | 200ps | 100ps | 200ps | 200ps | 700ps | |
R-format | 200ps | 100ps | 200ps | 100ps | 600ps | |
beq | 200ps | 100ps | 200ps | 500ps |
- 파이프라인화된 데이터경로와 single사이클의 데이터경로를 비교해보면
- single사이클에서는 총 소요시간이 800ps
- 파이프라인에서는 가장 긴 소요시간이 200ps
📌 Pipeline Speedup
- 만약 모든 stage들이 비슷한처리시간을 가지면 ( = 같은시간이라면)
- (stage의 수)배의 성능향상효과
파이프라인 명령어 간 시간 = 비파이프라인 명령어 간 시간 / stage
- 모든 stage가 균등하지 않으면 속도향상의 효과는 더 적을것이다
- 가장 느린 stage에 맞춰지므로
- 속도향상은 처리량을 늘려서 얻은 결과이다
- 병렬식으로 동시에 여러 명령어를 실행시킴으로써
- 지연시간(각 명령어 하나 실행에 걸리는 시간) 자체는 줄어들지 않음
📌 Pipelining and ISA Design
- MIPS ISA는 파이프라인에 적합한구조임
- 모든 명령어는 32비트 ( 한 사이클안에 fetch(명령어 가져오기)와 decode(명령어해석)가능
- 적은 종류의 규격화된 명령어 format (R형식, i 형식)
- 한번에 decode하고 레지스터를 read가능
- Load/Store addressing
- 주소 계산은 3번째 stage에서 , 메모리접근은 4번째 stage에서 이루어짐
- 즉, stage별로 다른 작업수행가능
- memory operand의 정렬
- memory access는 한 싸이클 안에 이뤄짐
※여기서 한 사이클이란 파이프라인에서 하나의 단계(IF, ID,EX,MEM,WB) 중 하나
📌 Hazards
- 다음 싸이클에서 다음 명령이 실행되는 것을 막아버리는 상황이 발생 할 수 있다
- 구조적 해저드 (필요한 하드웨어 자원이 이미사용중)
- 데이터 해저드 (다른 명령어가 데이터를 read/write하고있다면 완료까지 기다려야함) → 해결 : 전방전달, 코드 구조변환
- 제어 해저드 (어떤 명령어를 수행하기 위해 다른 명령어 결과에 의존하는경우) → 해결 : 브랜치에서 stall, 분기예측(무조건 아니라고 가정), 더 실제적인 분기예측)
📌 Structure Hazards (구조적 해저드)
- 하드웨어 자원을 이용하는 것에서 충돌
- single메모리를 사용하는 MIPS 파이프라인에서
- lw/sw명령은 data접근을 위해 메모리에 접근한다
- instruction fetch도 명령어를 가져오기 위해 메모리에 접근한다
- 서로 동시에 진행할 수 없어 한 쪽이 대기하고, 해당 사이클을 지연시킨다 (파이프라인에 버블을 야기함)
- 파이프라인화된 데이터패스는 instruction memory와 data memory가 분리되어야한다
- 대부분 구조적 해저드는 자원의 부족으로 발생하며, 자원을 추가하면 해결되는 경우가 많음
📌 Data Hazards(데이터 해저드)
명령어는 다른 명령어가 데이터에 접근하는 것이 완전히 끝나는 것에 의존한다
(해당 대이터가 사용중이라면 대기)
add $s0, $t0, $t1
sub $t2, $s0, $t3
2stall, 2 사이클 공백발생
📌 Data Hazards -- Forwarding (aka Bypassing(전방전달))
계산 직후의 결과 바로 사용 (레지스터에 저장되기전 바로)
- 레지스터에 write되는것을 기다리지 않음
- datapath에 추가 연결 필요
📌 Data Hazards -- Fowarding --- Load-Use Data Hazard
항상 forwarding으로 모든 stall을 피할 수는 없을 수도 있다
- 결과가 필요한 순간에 아직 계산이 완료되지 않으면
- 제 값을 끌어올 수도 없이 존재하지도 않으면 활용불가
- forwarding으로 해결이 불가능한 이유
- forwarding은 ALU출력값을 바로 다음 명령어에 전달하는 방식
- 하지만 Load-Use Data Hazard의 경우 값이 아직 메모리에서 읽히고 있어 ALU에도 값이 존재하지 않음
- forwarding은 ALU출력값을 바로 다음 명령어에 전달하는 방식
📝예제
lw $s0, 20($t1)
add $t2, $s0, $t3
- lw
- EX: 20 + $t1주소 계산 (ALU에서 사용)
- MEM : 계산된 주소를 메모리에서 읽음
- WB : 읽은 값을 $s0에 저장
- add
- ID 단계 : $s0 값을 읽으려하지만 MEM단계가 끝나지 않아 $s0값이 준비되지않음
📌 Code Scheduling to Avoid Stalls
코드의 순서를 바꿔 다음 명령어에 필요한 결과값 load과정에서 발생할 stall 회피
예 ) A = B + E; C = B + F;
WB 단계에서 준비되므로 각각 stall 1사이클 발생 → 2개의 stall발생해 파이프라인 효율이 저하됨
stall 2 → stall 0
파이프라인 실행 사이클 수 ( 13 → 11)
📌 Control Hazards
- 제어신호로 인해 프로그램의 flow가 바뀔 수 있는 상황 (flow가 바뀔지도 모르기 때문에 직후 명령어 들이 바로 실행되지 못하는 해저드)
- 분기(branch)는 control의 흐름을 결정한다
- instruction fetch는 분기 결과에 의존적이다 (PC +4일지, beq의 1로 다음 주소결과를 PC에 담을지)
- 파이프라인은 항상 올바른 명령어를 가져오지 않을 수도 있다 (branch의 ID가 작업중일때)
- MIPS 파이프라인에서
- 브랜치 명령어의 레지스터값을 비교하는 것과 점프주소 계산을 미리해야한다
📌 Control Hazards -- Stall on Branch
브랜치에서 stall
- add 문제없이 실행
- beq 명령어가 ID단계에서 비교작업을 수행
- ID에서 미리 비교하고 주소를 계산하더라도 ID가 끝나야 알수 있으므로 1 사이클 stall
📌 control Hazards --- Branch Prediction
분기예측 (분기명령어의 결과가 확정되기 전에 결과를 미리 예측해 실행하는 방법)
- 긴 파이프라인에서는 분기 결과가 확정될 때까지 여러 사이클의 Stall이 발생할 수있음
- 브랜치 결과 예측 (예측이 틀린경우만 stall발생)
- MIPS 파이프라인에서 브랜치 결과를 일어나지 않은것으로 예측(가정)할 수 있다
- 브랜치 명령 이후에 명령어 fetch를 지연없이 가능하다
📌control Hazards --- MIPS with Predict Not Taken
beq가 아니라면을 가정해, 연속된 (PC+4) 명령어를 바로 가져옴
branch결과가 맞으면 맞는 명령어를 새로 가져옴
📌control Hazards --- More-Realistic Branch Prediction
실제로 사용하는 것에 더 가까운 방식(위에서는 무조건 아닐것이라고 예측)
- Static branch prediction
- 전형적인 분기동작을 기반으로함
- 하드웨어 자원이 거의 필요하지 않다
- Backward Branch는 항상 발생한다고 가정
- loops에서 자주 나타나는 분기
- 프로그램의 흐름이 위쪽으로 이동
- 반복문 종료 전까지 항상 Backward Branch 발생
- Forward Branch는 발생하지 않는다고 가정
- 조건문(if)에서 자주 발생
- Dynamic Branch Prediction
- 실제 분기 동작을 기반으로 함
- 이전 분기 히스토리를 저장하고 이를 기반으로 미래의 분기 결과를 예측(틀릴경우 :stall → refetching)
- 프로그램 실행 중 계속 학습하며 성능을 최적화
특징 | 정적분기예측 | 동적분기예측 |
기본원리 | 고정된 규칙을 기반으로 예측 | 실행된 프로그램의 분기 결과를 추적하여 예측 |
예측방법 | backward분기는 taken(발생), forward분기는 not taken(발생하지 않음) | 분기 결과의 히스토리를 추적하여 예측 |
정확도 | 예측 정확도가 낮을수있음 | 실행 패턴에 따라 예측 정확도가 높음 |
자원소모 | 적은 자원소모 | 많은 자원 소모(히스토리 저장 및 관리 필요) |
성능저하 | 예측 실패 시 성능저하 없음 (하지만 비효율적) | 예측 실패시 스톨발생, 성능저하 |
적용 예시 | 고정된 패턴(루프(반복문),if(조건문)) | 동적인 분기 패턴에 적합(다양한 조건문) |
📌 Pipeline Summary
- pipelining은 CPU에서 명령어를 병렬적으로 처리해 처리량을 증가시키는 기법
- 한 명령어의 실행속도가 아니라 동시에 여러 명령을 가능케하는 양을 늘림
- 각 명령어는 같은 latency(지연시간)을 갖는다
- 명령어 set의 설계방식(ISA)는 pipeline 구현의 복잡도에 영향을 준다
- ISA가 간단하면 pipeline 구현도 쉬워진다
'컴퓨터구조 및 설계 > 4장. The Processor' 카테고리의 다른 글
4.8 Control Hazards (0) | 2024.12.11 |
---|---|
4.6 Pipelined Datapath and Control (0) | 2024.12.11 |
4.4 A Simple Implementation Scheme (0) | 2024.12.10 |
4.3 Building a Datapath (0) | 2024.11.21 |
4.2 Logic Design Conventions (0) | 2024.11.21 |