파이프라인(pipeline) & Hazard

Updated:

파이프라인(pipeline)이란?

C언어의 printf()를 어셈블리어로 변형하면 다음과 같아집니다.

MOV R1, R2
ADD R1, R2, R3

(이렇게 변한다는건 아니고 예시입니다)

어셈블리어 MOV R1, R2 한 줄을 instruction이라고 부를 수 있습니다. (시간복잡도를 구하는 빅오표기법이 이 instruction의 복잡성을 계산하는 것과 같습니다)

파이프라인은 한 instruction을 여러 단계로 나누어서 단계별로 동시에 실행함으로서 프로세서의 성능을 높이는 방식입니다.
다음 그림은 5단계의 pipeline의 모습입니다.


Hazard 참고

해저드(Hazard)란?

파이프라인 기법에는 여러 문제가 있는데 이를 Hazard라고 하며 파이프라인의 위험은 크게 구조적 위험, 데이터 위험, 제어 위험으로 구분됩니다.

(1) 구조적 해저드 : 같은 레지스터에 동시에 Write x

  • 해결방안 : 해당 레지스터를 사용할 수 있을 때까지 Stall(지연)

(2) 데이터 해저드 : 아직 수행이 안된 명령의 결과값을 참조할 때 발생

ADD R1, R2, R3
MUL R4, R1, R2
ADD 명령어가 아직 WB이 안되었는데 이미 명령어를 읽어와 다음과 같이 R4에 저장시키게 되는 오류가 발생된다.
이 오류는 쓰기 후 읽기(RAW)으로 구분되며 유형은 세 가지 RAW, WAR, WAW가 존재한다.

  • 해결방안 : 복잡한 방법도 존재하지만 Stall(지연) 을 통해 해결할 수 있다.

(3) 제어 해저드 : Jump나 Branch 등 분기 명령에 의해 발생

  • 해결방안 : 분기가 끝날때까지 Stall(지연)