파이프라인 해저드
IT위키
더 많은 작업
파이프라인 해저드(Pipeline Hazard)는 명령어 파이프라인에서 다음 명령어가 정해진 클록 사이클에 다음 단계로 진행하지 못하게 막는 상황으로, 구조적 해저드·데이터 해저드·제어 해저드의 세 종류로 나눈다.
명령어 파이프라인은 인출(IF), 해독(ID), 실행(EX), 메모리 접근(MEM), 결과 저장(WB) 같은 단계를 겹쳐 실행해 이상적으로는 한 사이클에 명령어 하나를 끝낸다(→ CPU 병렬 처리, 명령당 사이클 수). 그러나 명령어들이 같은 하드웨어를 동시에 쓰려 하거나, 앞 명령어의 결과가 아직 나오지 않았거나, 다음에 무엇을 인출할지 분기 결과를 아직 모르면 뒤 명령어를 멈추게(stall) 해야 한다. 이렇게 파이프라인 때문에 드러나는 명령어 사이의 의존과 충돌을 해저드라 한다. 스탠퍼드 대학교 EE108b 강의는 해저드를 파이프라인이 효율을 잃게 만드는 명령어 간 의존으로 설명하고, 구조적 해저드(자원 충돌), 데이터 해저드, 제어 해저드 셋으로 나눈다.[1]
| 종류 | 원인 | 예 | 주된 해결 방법 |
|---|---|---|---|
| 구조적 해저드(structural hazard) | 두 명령어가 같은 하드웨어 자원을 같은 사이클에 쓰려 한다(자원 충돌) | 메모리가 하나뿐인데 한 명령어는 데이터를 읽고 다른 명령어는 명령어를 인출해야 하는 경우 | 자원을 늘리거나 나눈다(명령어 메모리·데이터 메모리 또는 캐시 분리, 레지스터 파일 포트 추가), 아니면 한쪽을 멈춘다 |
| 데이터 해저드(data hazard) | 뒤 명령어가 아직 파이프라인 안에 있는 앞 명령어의 결과를 필요로 한다 | ADD R1, R2, R3 바로 뒤에 SUB R4, R1, R5 가 R1 을 읽는 경우 | 전방 전달(forwarding, bypassing)로 결과를 레지스터에 쓰기 전에 다음 단계로 넘긴다. 적재(load) 결과처럼 전달로도 늦으면 한 사이클 멈춘다. 컴파일러의 명령어 재배치 |
| 제어 해저드(control hazard, 분기 해저드) | 분기·점프 명령어의 결과가 나오기 전에는 다음에 인출할 명령어를 정할 수 없다 | 조건 분기 BEQ 의 비교 결과가 EX 단계에서야 나오는 경우 | 결과가 나올 때까지 멈춤, 분기 예측(분기하지 않음 예측, 분기 목표 버퍼, 2비트 예측기), 지연 분기 |
두 명령어 i(앞)와 j(뒤)가 같은 레지스터나 메모리 위치를 쓰는 순서에 따라 나눈다.
- RAW(Read After Write, 진짜 의존) - j 가 i 가 쓴 값을 읽어야 한다. 순서대로 실행하는 단순 파이프라인에서 실제로 생기는 해저드이다
- WAR(Write After Read, 반의존) - j 가 i 가 읽기 전에 그 위치에 써 버리면 i 가 틀린 값을 읽는다
- WAW(Write After Write, 출력 의존) - j 의 쓰기가 i 의 쓰기보다 먼저 끝나면 최종 값이 틀어진다
WAR 와 WAW 는 이름만 겹치는 의존이라, 명령어 순서를 바꿔 실행하는(비순차 실행) 프로세서에서 문제가 되고 레지스터 재명명(register renaming)으로 없앤다.
- 해저드의 일반적 분류는 구조적·데이터·제어의 셋뿐이다. '레지스터 해저드'라는 별도 종류는 없다. 레지스터 값을 두고 생기는 충돌은 데이터 해저드(RAW·WAR·WAW)에 들고, 레지스터 파일 포트가 모자라 동시에 읽고 쓰지 못하는 것은 구조적 해저드에 든다
- 전방 전달은 데이터 해저드의 대책이고, 분기 예측은 제어 해저드의 대책이다. 구조적 해저드는 자원을 늘려야 근본적으로 없어진다
- 해저드로 생긴 멈춤 사이클은 CPI 를 1 보다 크게 만든다. 슈퍼스칼라처럼 한 사이클에 여러 명령어를 내보내면 같은 사이클에 충돌할 명령어 쌍이 늘어 해저드 처리가 더 복잡해진다
- 디지털 회로에서 입력이 바뀌는 순간 출력이 잠깐 튀는 글리치를 일으키는 회로 구조도 해저드라 부르지만, 파이프라인 해저드와는 다른 개념이다
- ↑ 1.0 1.1 1.2 C. Kozyrakis, 「EE 108b Lecture 10: Control Hazards and Advanced Pipelining」, Stanford University, https://web.stanford.edu/class/archive/ee/ee108b/ee108b.1082/handouts/lect.10.PipelineHazards2.pdf, 확인일: 2026-11-04.
- ↑ Jason Tang, 「Lecture 17: Pipeline Hazards」, UMBC CMSC 411 Computer Architecture, 2024, https://userpages.cs.umbc.edu/jtang/cs411.s24/lectures/L17PipelineHazards.pdf, 확인일: 2026-11-04.