Pipeline Hazard
파이프라인 해저드
- 파이프라인 방식이 적용된 프로세서에서 의존성으로 발생할 수 있는 문제를 의미한다.
- 후속 명령어가 후속 Clock cycle에서 실행될 수 없는 상황을 뜻한다.
- 가장 간단한 해결방법은 해저드가 발생할 때마다 파이프라인을 멈추는 것(pipeline stall)이며,
파이프라인 해저드는 전적으로 파이프라인 구성에 달려있다.
- 파이프라인 구성과 여러 제약 조건에 따라 해저드의 형태가 언제나 다르게 나타날 수 있다.
- 원인에 따라 크게 세 가지로 분류된다.
1. Structural Hazard (구조적 해저드)
- 프로세서의 자원이 부족해서 발생하는 해저드이다.
- H/W를 추가/업그레이드하여 해결할 수 있는 해저드이다.
ex) Pipelining을 적용시킨 시스템에서 F단계와 M단계가 동시에 처리될 때, 메모리가 부족하다면
Structural hazard가 발생할 수 있다. 그 이유는 F단계, M단계 모두 메모리 접근 연산을 수행하게 되는데, 여기서 메모리가 부족하면 delay가 생길 수 있기 때문이다.
* 파이프라인 프로세서에서는 피연산자를 읽는 F단계에 있는 명령어와, 최종적으로 결과를 쓰는 W단계의 명령어가 동시에 작동하므로 레지스터 파일은 반드시 최대 두 개의 읽기와 한 번의 쓰기가 동시에 가능해야 하며, 또 이 작업이 사이클마다 가능하게 지원해야 한다. 레지스터 파일에 많은 읽기와 쓰기를 동시에 처리하도록 하는 것(멀티 포트화)은 매우 어려운 작업이며 반도체 설계 공간도 전력도 모두 많이 소비하게 된다. 대안으로 적은 수의 읽기/쓰기 포트를 가지는 작은 크기의 컴포넌트를 여러 개 두는 방법을 쓴다. 이 단위를 캐시에서는 뱅크, 레지스터 파일은 클러스터라 부른다.
2. Data Hazard (데이터 해저드)
- Data dependence(데이터 의존성)에 의해 발생하는 해저드이다.
- 컨트롤/데이터 해저드는 프로그램이 근본적으로 갖는 의존성 때문에 발생한다.
* Data dependence (데이터 의존성)
- 앞선 명령어의 결과를 후속 명령어가 필요로 할 때, 앞선 명령어가 처리될 때 까지 후속 명령어는 처리되지 못하고 기다리게 되는 현상을 일컫는 용어
* Solutions for Data Hazard
가. Pipeline Stall
- 필요한 결과값이 나올 때 까지 명령어를 지연(Stall)시키는 방법이다.
- Pipeline 방식의 지향점(성능 개선)과는 거리가 멀어지게 되는 해결방법이다.
나. Data Forwarding
- 필요한 결과가 W단계를 통해 Store될 때 까지 대기하는 것이 아닌, 결과가 실제로 생성되는 단계에서 바로 건네받아 처리시키는 방법이다.
- Delay 시간이 없거나 최소화되는 방법이다.
다. Code Relocation (코드 재배치)
- Compiler가 해저드를 해결하지 못했을 때, Dependence가 생기지 않으면서, 에러가 생기지 않게끔 프로그래머가 Code를 재배치하는 방법이다.
3. Control Hazard (컨트롤 해저드)
- 분기 명령어가 실행으로 인해 발생하는 해저드이다.
- 컨트롤/데이터 해저드는 프로그램이 근본적으로 갖는 의존성 때문에 발생한다.
* Solutions for Control Hazard
가. Pipeline Stall
나. 분기 예측
다. "nop"명령어의 사용
- nop는 "No Operation"을 의미한다.
- 분기 명령어 다음줄(= delay slot) 에 위치한 명령어는 항상 실행되므로, nop명령을 통해 delay slot을 제거하거나,
반대로 분기 명령어의 목적지에 해당하는 명령과 관계없는 연산을 실행하는 명령어를 재배치 시켜서 delay slot을 활용하는 방법