파이프라인 시스템의 일반적인 특징과 원리에 대한 간단한 예시
1. 파이프라인 시스템에서 수행해야 할 일은 여러 개의 일련의 단계들로 나누어진다.
- 식당 : 에피타이저 -> 메인 음식 -> 디저트 -> 음료
- 세차장 : 물 -> 비누 -> 닦기 -> 왁스 -> 건조
2. 하나의 일이 다 끝날 때까지 전체 시스템 공정을 차지하지 않는다.
- 세차장 : 이전의 차가 비누 단계에서 닦기 단계로 이동하면, 다음 차가 분사 단계로 바로 진행한다.
, 하지만 일반적으로 충돌을 피하기 위해 같은 속도로 시스템을 통과해야 한다.
* 결과적으로 주요 특징은 시스템 처리량을 증가시킨다는 점이다. 그러나 지연시간도 증가시킨다.
- 식당 : 디저트만 원하는 고객이라도 파이프라인 시스템에서는 모든 메뉴를 거쳐야한다.
계산용 파이프라인
(a)는 간단한 비파이프라인 하드웨어 시스템의 예이다. 계산을 수행하고, 계산 결과를 저장 하는 레지스터가 있다.
(b)는 파이프라인 다이어그램이다.
이 구현에서 다음 인스트럭션을 시작하기 전에 실행되고있는 인스트럭션을 마무리해야한다. 그래서 겹치지 않는다.
지연시간 (Latency): 한 개의 인스트럭션을 시작부터 끝까지 실행하는 데 걸리는 시간
회로의 지연시간 단위 ps (피코-초)
처리량 (Throughput, GIPS (Giga-Instruction Per Second))
: 이 시스템에서 지연시간은 320 ps다. (처리량의 역수)
수행하는 단계를 세 단계로 나눈다면 위와 같이 된다. 각 단계는 100ps씩 걸린다고 치자.
I1 이 단계 A에서 B로 이동하는 즉시 I2 가 A단계에 진입한다.
하나의 인스트럭션이 떠나고 매 클럭마다 새 인스트럭션이 진입한다.
클럭 신호 : 규칙적인 시간 간격으로 레지스터에 로딩되는 것을 제어한다.
클럭을 매 100+20 ps로 반복시켜서 처리량은 다음과 같다.
한 개의 인스트럭션을 처리하는데 3클럭 사이클이 필요하므로, 이 파이프라인의 지연시 간은 3 * 120 = 360(ps)이다.
3단계 파이프라인 시스템을 도입하여 시스템의 처리량을 2.67배 개선하였으나, 지연시간도 1.12배 증가했다.
이는 파이프라인 레지스터에 의한 오버헤드 때문에 발생한 것이다.
파이프라인 연산의 상세한 고찰
파이프라인 단계들 간에 인스트럭션의 이동은 위의 사진과 같이 클럭 신호에 의해 제어된다.
매 120ps마다 이 신호는 0에서 1로 올라가며 다음 파이프라인 단계의 계산들을 시작한다.
- 지점 1: 시간 240에 클럭이 상승하기 직전, 각 단계를 완료한 상태로 레지스터의 입력에 도달했다.
- 지점 2: 클럭이 상승하면 이 입력들은 레지스터에 적재되어 레지스터의 출력이 된다.
- 지점 3: 각 단계에서 조합로직을 통과하는 중이다.
- 지점 4: 시간 360 전에 결과 값들은 레지스터의 입력에 도달한다. -반복-
이를 통해 알 수 있는 점은 다음과 같다.
1. 클럭이 상승하기 전까지 레지스터의 상태는 전혀 바뀌지 않는다.
2. 클럭을 사용하는 레지스터들을 조합로직 블록 사이에 배치하는 간단한 방식을 사용해 파이프라인에서 인스트럭션들의 흐름을 충분히 잘 제어할 수 있다.
파이프라이닝의 한계
파이프라인의 효과를 축소시키는 여러 요소들이 종종 발생한다
비균일 분리 (Nonuniform Partitioning)
똑같이 3단계 시스템이지만, 각 단계에서 발생하는 지연시간은 50 ~ 150 ps까지 변화한다.
클럭의 속도는 가장 늦은 단계의 지연시간 값에 의해 결정된다.
A는 50ps 만에 일을 끝내고 다음 클럭이 상승하기까지 100ps를 idle 상태에 있는다.
C는 100ps 만에 일을 끝내고 50ps를 idle 상태에 있는다.
지연시간의 총 합은 300ps지만, 늦어진 클럭 주기 탓에 510ps로 늘어나게 된다.
이처럼 실제 시스템 설계에서는 균형을 맞추어 타이밍을 최적화하는 것이 중요하다
줄어드는 깊은 파이프라이닝 효과
해당 시스템은 6단계로 나누어 각각 50ps를 소모한다. 처리량은 14.29 GIPS로 1.71배 증가시켰다.
각 계산 블록에서 소요되는 시간은 줄였지만, 레지스터 통과의 시간 지연으로 인해 원하는 효율 증가를 얻지 못했다.
(레지스터 통과 지연시간이 전체 주기의 28.6%나 차지)
최신 프로세서들은 클럭속도를 최대로 올리기 위해서 매우 깊은 (15이상) 파이프라인을 사용한다.
따라서 지연시간을 최소화하기 위해 파이프라인 레지스터 설계와 클럭 분산 네트워크 설계를 조심스럽게 해야한다.
피드백을 갖는 파이프라인 시스템
지금까지는 파이프라인을 통해 인스트럭션이 완전히 서로 독립적인 경우만을 고려해왔으나,
기계어 프로그램을 실행하는 시스템에서는 인스트럭션끼리 잠재적인 의존성이 있다.
예시 1
3개의 인스트럭션에서 원으로 표시한 레지스터들은 데이터 의존성이 존재한다.
( irmovq 결과를 %rax 에 저장하고, 그 이후 addq 에 의해 읽혀야 한다.
그리고 그 결과를 %rbx 에 저장하고 mrmovq 에 의해 읽혀져야 한다.)
예시 2
(line 3) jne 는 조건부 테스트가 실행할 다음 인스트럭션이 (line 4) irmovq 일지 (line7) hart 일지 결정한다.
파이프라인을 프로세서에 구현하기 위해서는 피드백 효과에 대해 적절히 다뤄야 한다.
하지만 어떤 방법으로든 결과가 ISA에서 정의한 모델과 일치해야한다.
『Computer Systems: A Programmer's Perspective』 책을 읽고 정리한 글입니다.
검색을 허용하지 않고, 수익을 창출하지 않습니다.