본문 바로가기

Computer Science/Computer Architecture

[Computer Architecture] 파이프라이닝

+ 한국항공대학교 길현영 교수님의 컴퓨터구조론 과목 내용을 정리한 글입니다.

파이프라이닝 개요

세탁 시스템을 통해 쉽게 이해할 수 있다. (or 소화기관)
- 전체 세탁 흐름 = 하나의 프로그램
- 전체 세탁하는데 걸리는 시간 = 프로그램 실행 시간 -> 성능
- 세탁물 1개 = 명령어 1개
 

순차적 방식을 사용한 방식 (위) 와 파이프라이닝을 사용한 방식 (아래)

 
하나의 일을 수행하는데 걸리는 시간이 각각 다를 경우 기다리는 시간이 발생한다.

가장 오래걸리는 건조때문에 기다리는 시간이 발생한다.

 
위 그림에서
 
(기본) 세탁물 수가 4개일 경우, 병행 방식은 순차 방식에 비해 약 1.7배 빠르다.
- (90 × 4) ÷ (90 +40 × 3) = 1.7
- 40 × 3: 첫 세탁을 제외하고, 두 번째부터 가장 길게 걸리는 마지막 일만큼 기다려야하기 때문에 40분이 지날 때마다 세탁 하나가 완료된다.
 
세탁물 수가 10개일 경우, 병행 방식은 순차 방식에 비해 약 2배 빠르다.
- (90 × 10) ÷ (90 +40 × 9) = 2
 
=> 해야할 일이 증가할수록, 성능 개선율이 높아진다.
 
세탁 시스템을 3 -> 5단계로 분리할 경우, 즉 세탁기와 건조기를 두 대로 분할하여 15분, 20분씩 처리할 경우, 병행 방식은 순차 방식에 비해 약 2.4배 빠르다.
- (90 × 4) ÷ (90 + 20 × 3) = 2
 
=> 하나의 일을 수행하는 데 필요한 단계를 분리할수록, 성능 개선율이 높아진다. (depth 증가)
 
세 개의 서브시스템의 지연시간이 동일하게 30분인 경우, 병행 방식은 순차 방식에 비해 약 2배 빠르다.
- (90 × 4) ÷ (90 + 30 × 3) = 2
 
=> 각각의 단계들의 지연시간이 동일하면, 성능 개선율이 높아진다. (pipe의 수행 시간을 일정하게)
(가장 길게 걸리는 시간보다 더 짧게 동일해야한다.)


파이프라이닝 정의

=> 명령어의 데이터 경로를 세분화하고, 각기 다른 세부 단계를 동시에 수행하게 함으로써, 여러 명령어들을 중첩 수행 가능하게하여 성능을 향상시키는 방법이다.
 
파이프 (pipe)
=> 세분화된 각 단계
 
파이프라인의 깊이 (Depth)
=> 세부 단계의 개수 (모든 단계를 동시에 수행하고 있는 순간이 존재한다.)
 

컴퓨터의 파이프라이닝

< 빈 부분이 존재하는 이유 >
레지스터에 접근하는데 걸리는 시간은 다른 일보다 수행 시간이 상대적으로 적게 걸린다
레지스터를 읽는 부분과 쓰는 부분이 동시에 발생할 수 있다.
따라서, 사이클 시간 중 절반을 나눠서 읽는 부분은 두 번째 절반에, 쓰는 부분은 첫 번째 절반에 실행한다.


해저드 (위험)

1. 강력하거나 복합적인 명령어는 데이터 경로의 일부 단계를 두 번 이상 사용한다.
ex) 많이 더러운 세탁물은 세탁 과정을 두 번 이상 수행한다.
 
2. 선행 명령어가 후행 명령어에 종속될 수 있다.
ex) 선행 명령어: c = a + b, 후행 명령어: d = c + e => 선행 명령어를 수행해야 후행 명령어를 수행할 수 있다.
 
3. 분기 명령어에 의해 명령어의 실행 순서가 달라질 수 있다.


순차 vs 병렬 vs 병행

데이터 하나당 T 시간이 걸리는 함수 f(x)로 n개의 데이터를 처리할 때,
- f: 프로세서
- f1: 프로세서 상위 절반
- f2: 프로세서 하위 절반
 
1. 순차 처리
- 실행 시간: n × T
- 추가 비용: X

순차 처리 과정

 
2. 병렬 처리
- 실행 시간: (n × T) ÷ 2
- 추가 비용: 프로세서 및 다른 HW (디멀티플렉서, 토글 스위치 등)
+ 하나의 HW를 추가하기 위해서 다른 요소들이 더 추가되어야한다. (선) 
+ HW에서 공간은 곧 돈이다.

병렬 처리 과정

 
3. 병행 처리 (파이프라이닝)
- 실행 시간: (n × T) ÷ 2
- 추가 비용: 프로세서 및 다른 HW (디멀티플렉서, 토글 스위치 등)
+ 첫 데이터와 마지막 데이터 처리를 제외하면, 모두 2개를 동시에 수행한다. n이 매우 크면 2배 더 빠르다.
+ 병렬 처리와 마찬가지로 추가적인 HW(임시 데이터를 저장할 기억소자 래치)가 더 필요하다.

병행 처리 과정

 
+ HW가 많아질수록 추가적인 시간, 공간, 관리 시스템 등이 소요된다.


파이프라이닝의 성능

관련 요소

1. 클록 주기:T
 
2. 파이프라이닝 깊이(단계 개수): M
 
3. 래치 지연시간: L
+ FlipFlop은 입력 값 + 클락 사이클의 영향을 받아 출력 상태(값)를 변경(기억)한다.
+ 래치는 입력 값의 영향만을 받아 출력 상태(값)을 변경(기억)한다.
 
4. 처리할 데이터(명령어) 수: n

성능 분석

1. 순차 처리 방식
- n개의 데이터 처리시간
=> T × n
 
2. 파이프라이닝 방식
(T ÷ m) + L = 파이프라이닝 한 단계를 처리하는데 걸리는 시간 
 
- 첫 번째 데이터 처리시간 = m × (T ÷ m + L) = T + m × L
= 클락 사이클 T에 파이프라이닝 단계 개수만큼 래치 지연시간이 추가로 소요된다.
 
- 두 번째 ~ n번째까지 데이터 처리시간 = (n - 1) × (T ÷ m + L)
 
=> m × (T ÷ m + L) +  (n - 1) × (T ÷ m + L)

순차 처리에 비한 파이프라인 방식의 속도 향상

 

데이터가 충분히 있을 때 속도향상

 

구현 방식 지연 시간 (첫 번째 데이터 처리) 처리율 (처리할 데이터가 매우 많을 때)
순차 처리 T 1 ÷ (T)
 m단계 파이프라이닝 T + mL 1 ÷ (T ÷ m + L) 

 
래치 지연시간이 무시할 만큼 작다면, (L = 0)

구현 방식 지연 시간 (첫 번째 데이터 처리) 처리율 (처리할 데이터가 매우 많을 때)
순차 처리 T 1 ÷ (T)
 m단계 파이프라이닝 T 1 ÷ (T ÷ m) = m ÷ T

 
=> 처리율이 m배 향상된다.

파이프라이닝 성능 극대화 방법

1. 래치 지연 시간이 파이프 지연 시간에 비해 무시할 정도로 작을 경우
=> L = 0
 
2. 처리할 데이터가 충분할 경우 (첫 번째 데이터 처리시간을 무시할 만큼)
=> n = ∞
 
3. 파이프라인의 각 단계를 균등하게 분할하는 경우
=>  파이프라인의 각 단계의 처리 시간이 T ÷ m + L로 일정
 
4. 하나의 파이프에서 이웃한 파이프들로 데이터를 이동할 때 clock을 사용하여 동기화가 필요하다.
=> Clock Skew 문제 (물리적 전기 신호의 특성으로 발생하는 Clock의 시간 편차)가 발생한다.
+ 이웃한 파이프들간 거리에 따라 데이터 이동 시간이 달라진다.
 
5. 데이터(명령어)의 의존성이 없을 경우
=> 해저드 가능성 X


picoMIPS 아키텍처와 파이프라이닝

구현 방식에 따른 picoMIPS의 성능

< 가정 >
- 명령어 인출 단계 소요 시간: 2ns
- 명령어 해독 및 레지스터 읽기 단계: 1ns
- ALU 연산 단계: 2ns
- 메모리 접근 단계: 2ns
- 레지스터 쓰기 단계: 1ns
- 래치 시간: 0ns
 

구현 방식 클록 시간 CPI
단일 사이클 2ns + 1ns + 2ns + 2ns + 1ns + 0ns = 8ns 1
다중 사이클 max(2+0ns, 1+0ns, 2+0ns, 2+0ns, 1+0ns) = 2ns 3 ~ 5 (명령어마다 다름)
파이프라이닝 max(2+0ns, 1+0ns, 2+0ns, 2+0ns, 1+0ns) = 2ns 1 (n = ∞, 한 단계만 실행)