title: 파이프라인 스톨
date: 2025-06-26
category: arch
tags: [pipeline, hazard, stall, forwarding, bubble, nop]
파이프라인 스톨
개요
파이프라인 스톨(Pipeline Stall) 또는 버블(Bubble)은 명령어 파이프라인에서 다음 명령어가 다음 클럭 주기에 바로 실행될 수 없는 상황을 의미한다. 파이프라인은 여러 명령어가 동시에 처리되도록 설계되지만, 명령어 간 의존성이나 리소스 충돌로 인해 파이프라인이 일시 정지되는 경우가 발생한다. 이러한 정지 상태를 스톨(stall)이라 하며, 파이프라인에 NOP(No Operation) 명령어를 삽입하여 버블을 생성하는 것이 일반적인 해결 방법이다.
파이프라인 스톨은 프로세서 성능에 직접적인 영향을 미친다. 이상적인 경우 CPI(Cycles Per Instruction)는 1이지만, 스톨이 발생하면 CPI가 증가하여 실제 성능이 저하된다. 현대 프로세서는 다양한 하드웨어 및 소프트웨어 기술을 활용하여 스톨을 최소화하고 파이프라인 활용도를 극대화한다. 스톨의 원인인 hazard를 정확히 이해하고 적절한 해결책을 적용하는 것은 프로세서 설계의 핵심 과제이다.
핵심 개념
hazard의 유형
파이프라인 hazard는 크게 세 가지 유형으로 분류된다:
| hazard 유형 | 설명 | 발생 조건 | 해결 방법 |
|---|---|---|---|
| 구조적 hazard (Structural) | 두 명령어가 동일한 하드웨어 리소스를 동시에 필요로 할 때 | 리소스 부족 | 리소스 중복, 시간 분할 |
| 데이터 hazard (Data) | 후속 명령어가 앞선 명령어의 결과에 의존할 때 | RAW/WAR/WAW 의존성 | Forwarding, 스톨, 리네이밍 |
| 제어 hazard (Control) | 분기 명령어의 결과가 결정되기 전에 다음 명령어를 인출해야 할 때 | 분기 미결정 | 분기 예측, speculative 실행 |
스톨(Stall)의 동작 원리
스톨은 파이프라인의 특정 스테이지에서 명령어 처리를 일시 중단하는 메커니즘이다:
- 의존성 감지: 제어 로직이 hazard 존재 여부를 판단한다
- 버블 삽입: NOP 명령어를 파이프라인에 삽입한다
- 대기: 앞선 명령어가 충분한 결과를 낼 때까지 대기한다
- 재개: hazard가 해소되면 파이프라인 처리를 재개한다
스톨이 발생하면 hazard가 해소될 때까지 일부 스테이지는 진행이 멈추고, 필요 구간에는 버블이 삽입된다. 이는 유효한 명령어 처리 슬롯을 소비하므로 클럭 주기 낭비로 이어진다.
Operand Forwarding (Bypassing)
Operand Forwarding은 데이터 hazard로 인한 스톨을 완화하는 핵심 기술이다:
동작 원리:
- 명령어의 결과가 Write Back 스테이지에서 레지스터에 기록되기 전에 Execute 스테이지에서 직접 다음 명령어로 전달
- 결과를 기다리지 않고 바로 사용할 수 있어 스톨 횟수를 대폭 줄임
적용 예:
ADD R1, R2, R3 ; R1 = R2 + R3 (결과: 5)
SUB R4, R1, R5 ; R1을 즉시 사용 (스톨 없음)
Forwarding 없이 위 코드를 실행하면 SUB 명령어는 ADD 결과가 레지스터에 기록될 때까지 대기해야 한다. Forwarding을 사용하면 ADD의 Execute 출력이 SUB의 Execute 입력으로 직접 전달되어 대기 시간이 제거되거나 크게 줄어든다.
Pipeline Bubble (NOP 삽입)
버블은 hazard를 완화하기 위해 파이프라인에 삽입되는 NOP 명령어이다:
버블 생성 과정:
1. 제어 로직이 hazard 감지
2. 현재 파이프라인에 있는 명령어들의 진행을 차단
3. NOP 명령어를 파이프라인 최상단에 삽입
4. NOP가 hazard 위치에 도달할 때까지 대기
5. hazard 해소 후 정상 명령어 재개
버블의 영향:
- hazard 종류와 우회 가능 여부에 따라 1클럭 이상 소모
- Throughput 감소
- CPI 증가
비교/분석
hazard 해결 기법 비교
| 기법 | 설명 | 장점 | 단점 | 적용 시점 |
|---|---|---|---|---|
| 스톨 (Stall) | NOP 삽입으로 대기 | 구현 단순, 정확성 보장 | 성능 저하, 클럭 낭비 | 모든 hazard 유형 |
| Operand Forwarding | 결과를 직접 전달 | 스톨 제거, 성능 향상 | 하드웨어 복잡도 증가 | 데이터 hazard |
| 분기 예측 | 분기 결과 미리 추측 | 제어 hazard 완화 | 예측 실패 시 페널티 | 제어 hazard |
| Out-of-Order 실행 | 독립 명령어 먼저 실행 | 파이프라인 활용도 향상 | 설계 복잡도 대폭 증가 | 모든 hazard 유형 |
| 레지스터 리네이밍 | 이름 의존성 제거 | WAW/WAR hazard 제거 | 물리적 레지스터 필요 | Out-of-Order 프로세서 |
스톨 발생 빈도 비교
| 프로세서 유형 | 스톨 빈도 | 주요 원인 | 해결 방식 |
|---|---|---|---|
| In-Order 5단계 | 높음 | 데이터/제어 hazard | 스톨, 기본 forwarding |
| In-Order 깊은 파이프라인 | 매우 높음 | 제어 hazard (branch penalty) | 분기 예측, 스톨 |
| Out-of-Order 슈퍼스칼라 | 낮음 | 구조적 hazard | 리소스 중복, OoO 실행 |
| VLIW | 컴파일러 의존 | 컴파일러 최적화 부족 | 컴파일러 최적화 |
forwarding 유형 비교
| forwarding 경로 | 원본 스테이지 | 대상 스테이지 | 스톨 완화 효과 |
|---|---|---|---|
| EX/MEM → EX | Execute 결과 | 다음 Execute | ALU-ALU RAW에서 1클럭 스톨을 줄이거나 제거 |
| MEM/WB → EX | Memory 또는 늦게 도착한 결과 | Execute | 더 늦은 결과 의존성의 추가 스톨을 완화 |
| Load-use hazard | 데이터 메모리 출력 | 다음 Execute | 일반적으로 최소 1클럭 스톨이 필요 |
동작 원리
5단계 파이프라인에서의 스톨 발생
5단계 클래식 RISC 파이프라인(IF/ID/EX/MEM/WB)에서 스톨이 어떻게 발생하는지 설명한다:
데이터 hazard 발생 예시:
Cycle 1: IF: ADD R1, R2, R3
Cycle 2: ID: ADD R1, R2, R3 | IF: SUB R4, R1, R5 ← R1 의존!
Cycle 3: EX: ADD R1, R2, R3 | ID: SUB R4, R1, R5 ← 스톨 시작
Cycle 4: MEM: ADD R1, R2, R3 | ID: SUB R4, R1, R5 ← 스톨
Cycle 5: WB: ADD R1, R2, R3 | EX: SUB R4, R1, R5 ← 스톨 종료 (load-use가 아니라면 forwarding으로 더 단축 가능)
Operand Forwarding 동작
Forwarding이 적용된 경우의 흐름:
- Execute 완료 시점: ADD 명령어가 Execute 스테이지에서 결과를 계산
- 결과 전달: 계산된 결과가 Execute/MEM 레지스터에 저장됨과 동시에 SUB 명령어의 Execute 입력으로 전달됨
- 즉시 사용: SUB 명령어는 결과를 기다리지 않고 바로 Execute를 시작
분기 hazard로 인한 스톨
분기 명령어가 파이프라인에 진입하면 예측 실패 시 스톨과 flush가 발생한다:
분기 penalty 발생 흐름:
1. 분기 명령어가 IF 스테이지에 진입
2. 다음 명령어들을 speculative로 인출
3. 분기 결과가 구현에 따라 EX 또는 그 이후 스테이지에서 결정
4. 예측 실패 시 잘못 인출된 명령어들을 flush
5. 올바른 주소에서 명령어 인출 재개
분기 penalty와 파이프라인 깊이:
| 파이프라인 깊이 | 분기 penalty (클럭) | 영향 |
|---|---|---|
| 5단계 | 1~2 클럭 | 적음 |
| 10단계 | 4~5 클럭 | 중간 |
| 20단계 | 8~10 클럭 | 큼 |
장단점
스톨의 장점
- 정확성 보장: hazard가 발생하면 잘못된 데이터 사용을 막기 위해 대기
- 단순한 구현: 하드웨어 복잡도가 낮고 구현이 용이
- 예측 불가능한 상황 대응: 정적/동적 분석이 어려운 경우에도 정확한 동작 보장
스톨의 단점
- 성능 저하: 클럭 주기 낭비로 인한 IPC 감소
- 전력 낭비: NOP 실행에도 전력 소모 발생
- 파이프라인 활용도 저하: 파이프라인 빈 스테이지 증가
- 다른 hazard 발생 시 복합적 영향: 여러 hazard가 동시에 발생하면 스톨 구간이 누적되어 처리율이 크게 낮아질 수 있음
hazard 해결 기법의 장단점
| 기법 | 장점 | 단점 |
|---|---|---|
| 스톨 | 구현 단순, 정확성 | 성능 저하 |
| Operand Forwarding | 스톨 감소 | 하드웨어 복잡도 증가 |
| 분기 예측 | 제어 hazard 완화 | 예측 실패 시 큰 페널티 |
| Out-of-Order 실행 | 파이프라인 극대 활용 | 설계 복잡도 대폭 증가 |
| 레지스터 리네이밍 | 이름 의존성 제거 | 물리적 레지스터 추가 필요 |
관련 기술
참고 문헌
- Patterson, D. A., & Hennessy, J. L. (2020). Computer Organization and Design: The Hardware/Software Interface (RISC-V Edition). Morgan Kaufmann.
- Hennessy, J. L., & Patterson, D. A. (2017). Computer Architecture: A Quantitative Approach (6th ed.). Morgan Kaufmann.
- Shen, J. P., & Lipasti, M. H. (2013). Modern Processor Design: Fundamentals of Superscalar Processors. Waveland Press.
관련 기술 문서
핵심 정리
- 파이프라인 스톨은 hazard(구조적/데이터/제어)로 인해 다음 명령어가 즉시 실행될 수 없는 상황이며, 버블 삽입과 진행 정지로 처리된다.
- Operand Forwarding은 데이터 hazard로 인한 스톨을 대폭 줄이는 핵심 기술로, Execute 결과를 다음 명령어로 직접 전달한다.
- 분기 hazard는 파이프라인 깊이에 비례하는 penalty를 발생시키며, 분기 예측으로 완화된다.
- Out-of-Order 실행과 레지스터 리네이밍은 스톨을 근본적으로 줄이는 고급 기술로, 설계 복잡도를 높이는 대신 성능을 크게 향상시킨다.
- 현대 프로세서는 여러 hazard 해결 기법을 병행 적용하여 스톨을 최소화하고 파이프라인 활용도를 극대화한다.