Pipeline Hazard 란?
한줄요약 : 파이프라인 방식이 적용된 프로세서에서 의존성으로 발생할 수 있는 문제!
•
후속 명령어가 후속 clock cycle 에서 실행될 수 없는 상황을 뜻한다.
•
가장 간단한 해결방법은 해저드가 발생할 때마다 파이프를 멈추는것이다. (pipelinse stall) [’스턴걸렸다..’]
•
파이프라인 해저드는 전적으로 파이프라인을 어떻게 구성하느냐! 에따라 달려있다.
•
파이프라인 구성과 여러 제약 조건에 따라 해저드의 형태가 언제나 다르게 나타날 수 있다.
그렇다면 이러한 파이프라인 해저드는 무엇 때문에 생기는 것일까?
원인에 따라 크게 3가지로 구분해보자면,
1) 구조적 해저드(structural hazard)
2) 데이터 해저드 (data hazard)
3) 컨트롤 해저드(control hazard)
자세하게!
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을 활용하는 방법이다.