파이프라인 해저드 (Pipeline Hazard)

개념
파이프라인의 정의 - 명령어를 단계(stage)별로 분할하여, 수행 단계가 겹치지 않은 명령을 중첩하여 수행 - 명령어당 수행 사이클(CPI)를 1에 가깝도록 하여, CPU의 성능을 향상시키는 기법 - 벡터 프로세싱을 공간적인 병렬성이라 하면, 파이프라인은 시간적인 병렬성을 추구

 

I. 파이프라인의 성능을 저해하는 파이프라인 해저드의 개요
    가. 파이프라인의 정의

  • 명령어를 단계(stage)별로 분할하여, 수행 단계가 겹치지 않은 명령을 중첩하여 수행
  • 명령어당 수행 사이클(CPI)를 1에 가깝도록 하여, CPU의 성능을 향상시키는 기법
  • 벡터 프로세싱을 공간적인 병렬성이라 하면, 파이프라인은 시간적인 병렬성을 추구

    나. 파이프라인 해저드의 3가지 종류

종류

세부설명

구조적 해저드

(Structural hazards)

- 하드웨어가 여러 명령들의 수행을 지원하지 않기 때문에 발생, 자원충돌 (resource conflicts)

데이터 해저드

(Data hazards)

- 명령의 값이 현재 파이프라인에서 수행 중인 이전 명령의 값에 종속 (세부적으로 RAW, WAR, WAW 해저드가 있음. RAR는 해저드 아님)

제어 해저드

(Control hazards)

- 분기(jump, branch 등) 명령어에 의해서 발생

(분기를 결정된 시점에, 잘못된 명령이 파이프라인에 있기 때문에 발생)

II. 파이프라인 해저드의 유형별 발생원인
    가. 구조적 해저드

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 명령어와 데이터가 하나의 메모리에 존재하고, 포트도 하나인 경우에 발생 가능함.(폰노이만 구조)
  • 발생 원인: CC4 시점에서, Load 명령이 데이터 메모리 읽기를 수행하는 것과, 명령어 3이 명령어 메모리에서 인출(fetch)을 수행하는 것 사이에서, 자원 충돌이 발생하는 현상
  • 이때 물리적인 메모리 포트 혹은 메모리 자원은 하나의 요청에 대해서만 처리할 수 있기 때문임

    나. 데이터 해저드

  • 발생원인: 이전 명령이 WB(Write Back) 단계에서, 레지스터 파일에 값을 반영하기 전에, 후속 명령이 그 값을 읽거나, 쓰려고 하는 경우에 발생(RAW, WAR, WAW 해저드 존재)
  • RAW 해저드

        Read After Write, 이전 명령이 저장한 연산 결과를, 후속 명령이 읽으려고 할 때 발생.
        예> A = B + C; D = A + E;

  • WAR 해저드

        Write After Read, 이전 명령이 값을 읽기 전에, 후속 명령이 값을 쓰는 경우에 발생
        예> A = B + C; B = D + E;
         - 단일 파이프라인에서는 발생하지 않음.
        (읽는 단계가 WB 단계보다 항상 먼저 있기 때문임)
        - 다중 이슈처럼 여러 기능 유닛이 동시에 수행하는 경우에 발생 (예. SuperScalar)

  • WAW 해저드

        Write After Write, 이전 명령이 값을 쓰기 전에, 후속 명령이 값을 쓰는 경우에 발생
        예> A = B + C; A = D + E;
        - 단일 파이프라인에서는 발생하지 않음.
        (WB 단계가 동일하므로, 후속 명령이 먼저 쓰는 것 불가)
        - 다중 이슈처럼 여러 기능 유닛이 동시에 수행하는 경우에 발생(예. SuperScalar)

    다. 제어 해저드

       

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 발생원인: 분기명령에서 분기가 결정되는 시점에 이미 파이프라인에 후속명령들이 채워져 있기 때문 발생
  • 분기가 false인 경우에는 일반적인 경우와 마찬가지로 문제가 없으나, true인 경우에는 수행하지 않았어야 하는 명령을 수행한 것이 됨.

III. 파이프라인 해저드의 유형별 해결책

종류

해결책

구조적 해저드

(Structural hazards)

1) 명령어 메모리와 데이터 메모리 공유에 따른 자원 충돌: 하버드(Harvard) 아키텍처

2) 해당 기능을 사용할 수 있을 때까지 지연(stall, bubble)

 

데이터 해저드

(Data hazards)

1) Forwarding or ByPassing : 결과 값이 준비되면 바로 전달

2) Change Clock Cycle : 레지스터 1/2클럭에 쓰고, 2/2 클럭에서 읽음

3) Restrict Software : 컴파일에서 nop 명령어 삽입하거나 영향 없는 범위에서 순서 변경.

4) HW interlocking: stall을 발생하는 해결법

 

제어 해저드

(Control hazards)

- 분기 판정의 수행 단계를 조기에 실행 (예. EX 단계가 아니라 ID 단계에서 실행)

- 해석 단계에서 명령어 해석과 함께, 분기 명령의 참/거짓을 판단하여 분기를 결정하는 기법

2) 지연 분기(Delayed Branch): 지연 슬롯(delay slot)에 분기와 상관없이 항상 수행되는 명령 삽입

- 무관한 명령은 (a) 분기 명령 이전으로부터 (b) 분기 대상으로부터 (c) 분기 명령 후속으로부터, 가져오게 됨.

- 지연 슬롯의 숫자는 분기 명령의 delay로 결정됨.

IV. 파이프라인 해저드와 관련된 실무적 고려사항
    가. 컴파일러 최적화 활용

  • 하드웨어를 이용한 기법 사용시, 제조 단가가 증가할 수 있으므로, 컴파일러를 통해서 소프트웨어적으로 활용하는 기법(예. 명령어 스케줄링) 등을 활용하는 것이 중요함

    나. 적용 프로세서 고려

  • VLIW와 SuperScalar의 각 경우에는, 파이프라인 해저드에 대한 발생 유형 및 해결책이 달라질 수 있음. 사용할 프로세서의 특성을 고려하여 원인과 해결책 파악 필요

    다. 응용 프로그램 고려

  • 수행하고자 하는 응용 프로그램의 특성을 고려하여, 해저드 해결 필요. 예를 들어, 단순 반복적인 과학 연산의 경우에는 루프(loop) 코드가 많으므로, 분기를 항상 참으로 가정하는 예측도 비용 대비 효과적임. 반대로, 분기 구조가 복잡한 코드의 경우에는, 복잡한 동적인 분기 예측 기법 필요

 

 

댓글