파이프라이닝 (Pipelining)
쉽게 풀면
세탁소에서 옷을 "세탁 → 건조 → 다림질" 순서로 처리한다고 해봅시다. 한 벌씩 세탁이 끝나야 다음 옷의 세탁을 시작한다면 매우 느립니다. 대신 첫 번째 옷이 건조기로 넘어가는 순간 두 번째 옷을 세탁기에 넣고, 첫 번째 옷이 다림질대로 넘어가는 순간 두 번째 옷을 건조기에 넣으면 전체 작업 속도가 훨씬 빨라집니다.
CPU도 마찬가지로 명령어를 "가져오기(Fetch) → 해석(Decode) → 실행(Execute)" 같은 단계로 나누고, 한 명령어가 해석 단계에 있을 때 다음 명령어는 이미 가져오기 단계를 진행하는 식으로 여러 명령어를 겹쳐 처리합니다.
이렇게 하면 명령어 하나하나의 처리 시간은 그대로지만, 단위 시간당 처리되는 명령어의 개수(처리량)는 크게 늘어납니다.
왜 중요한가
파이프라이닝은 트랜지스터 속도 향상만으로는 성능 개선이 한계에 다다른 상황에서 처리량을 늘리는 대표적인 방법이라, 컴퓨터 구조 및 프로세서 설계 논문에서 빠지지 않고 등장합니다. CPU뿐 아니라 GPU, 신경망 가속기, 네트워크 라우터 등 데이터를 연속적으로 처리하는 거의 모든 하드웨어 설계에 같은 원리가 응용되기 때문에, 고성능 컴퓨팅과 반도체 설계 전반을 이해하는 데 기초가 되는 개념입니다.
핵심 정리
- 파이프라이닝은 명령어 실행을 여러 단계(예: 인출, 해독, 실행, 메모리 접근, 쓰기의 5단계)로 나누고, 각 단계가 서로 다른 명령어를 동시에 처리하게 하는 방식입니다.
- 이상적인 경우 한 명령어가 단계를 지나는 데 걸리는 시간(지연시간)은 거의 그대로(단계 사이 레지스터 때문에 오히려 약간 늘기도 함)이지만, 클록마다 한 명령어가 끝나므로 처리량이 단계 수에 가깝게 늘어납니다.
- 단계 수가 k이고 명령어가 n개면, 순차 실행은
n·k클록, 이상적 파이프라인은k + n − 1클록입니다. - 이상에서 벗어나는 이유는 위험(hazard)입니다. 구조적 위험(자원 충돌), 데이터 위험(앞 명령어 결과를 기다림), 제어 위험(분기 결과를 모름) 때문에 파이프라인이 멈추거나(stall) 비워집니다. 포워딩, 분기 예측, 명령어 재배치 같은 기법이 이를 줄입니다.
- 성능은 CPI(명령어당 클록 수)로 표현합니다. 이상적으로 CPI = 1이고, 정체가 있으면 CPI = 1 + 명령어당 평균 정체 클록 수입니다.
예시로 보기
5단계 파이프라인에서 명령어 n개를 처리하는 데 필요한 클록 수를 코드로 계산했습니다(정체 없음, 가상의 이상적 경우).
| 명령어 수 n | 순차 실행(n·5) | 파이프라인(5 + n − 1) | 속도 향상 |
|---|---|---|---|
| 10 | 50 | 14 | 3.57배 |
| 100 | 500 | 104 | 4.81배 |
| 1000 | 5000 | 1004 | 4.98배 |
n이 커질수록 향상 폭이 단계 수 5에 다가갑니다. 이제 분기 명령이 전체의 20%이고 분기마다 2클록이 낭비된다고 가정해 보면, CPI = 1 + 0.2 × 2 = 1.4가 되어 n = 1000일 때 속도 향상은 이상적인 4.98배에서 약 3.56배로 줄어듭니다. 위험을 얼마나 잘 처리하느냐가 성능을 좌우합니다.
자주 하는 오해
| 오해 | 바로잡기 |
|---|---|
| 명령어 하나가 빨라진다. | 빨라지는 것은 단위 시간당 완료되는 명령어 수(처리량)입니다. 한 명령어의 지연시간은 줄지 않습니다. |
| 단계를 많이 쪼갤수록 항상 좋다. | 단계가 늘면 클록을 높일 수 있지만 위험으로 인한 손실과 단계 사이 레지스터 지연이 커져 효과가 줄고, 소비 전력도 늘어납니다. |
| 파이프라이닝과 병렬 처리는 같다. | 파이프라이닝은 한 명령어 흐름을 겹쳐 실행하는 명령어 수준 병렬성의 한 형태입니다. 여러 실행 장치를 두어 한 클록에 여러 명령어를 시작하는 슈퍼스칼라, 여러 코어에서의 병렬 처리와는 별개의 개념입니다. |
| CPU에만 쓰인다. | GPU, 신경망 가속기, 네트워크 장비 등 연속 처리 하드웨어에도 같은 원리가 쓰입니다. |
논문에서는 이렇게 쓰입니다
실제 논문에서
이 용어를 직접 쓴 국내 논문 문장을 아직 수집하지 못했습니다. 수집되는 대로 출처와 함께 싣겠습니다.
예시 문장
아래는 용어의 쓰임을 보여 주려고 만든 예시로, 실제 논문에서 가져온 문장이 아닙니다.
이 문장은 명령어 실행 과정을 여러 단계로 나누어 겹쳐 처리함으로써, 프로세서가 초당 처리할 수 있는 명령어 수가 늘어났다는 뜻입니다.
하드웨어 가속기 설계 논문에서 연산 자원의 활용률을 높이는 기법을 설명할 때 쓰이는 표현입니다.
네트워크 시스템 설계 분야에서 패킷 처리 지연을 줄이는 구조를 설명할 때 사용되는 문장입니다.
조금 더 깊게 보면
파이프라인 단계가 늘어날수록 이론적인 처리량은 높아지지만, 데이터 위험(data hazard), 제어 위험(control hazard), 구조적 위험(structural hazard) 같은 문제로 인해 실제 성능 향상 폭은 제한됩니다. 이를 완화하기 위해 포워딩(forwarding), 분기 예측(branch prediction), 명령어 재정렬 같은 보조 기법이 함께 쓰이며, 논문에서 파이프라인 성능을 평가할 때는 이상적인 처리량뿐 아니라 정체(stall)로 인한 손실 사이클(CPI 증가분)을 함께 보고하는 경우가 많습니다.
주의할 점
파이프라이닝은 개별 명령어 하나의 처리 지연시간(latency)을 줄여주는 기법이 아니라, 여러 명령어를 겹쳐 실행해 전체 처리량(throughput)을 높이는 기법입니다. 또한 이전 명령어의 결과를 다음 명령어가 곧바로 필요로 하는 경우나 조건 분기가 발생하는 경우에는 파이프라인이 잠시 멈추는 "파이프라인 정체(stall)"가 생길 수 있으며, 이를 얼마나 잘 처리하느냐가 CPU 스케줄링 및 명령어 실행 효율과 함께 프로세서 성능을 좌우합니다.
참고 문헌
- Hennessy, J. L., & Patterson, D. A. (2017). Computer Architecture: A Quantitative Approach (6th ed.). Morgan Kaufmann.
- Patterson, D. A., & Hennessy, J. L. (2020). Computer Organization and Design: The Hardware/Software Interface, RISC-V Edition (2nd ed.). Morgan Kaufmann.
- Kogge, P. M. (1981). The Architecture of Pipelined Computers. McGraw-Hill.
표의 기준값은 위 문헌에 근거한 관례이며, 분야·학술지마다 다른 기준을 쓸 수 있습니다.