Control Hazard

김세영·2021년 5월 29일
0

Control Hazard

명령어들이 Control에 대한 종속성이 있어, Control의 순서가 바뀌어 실행이 제대로 되지 않는 현상

Program Counter(이하 PC)는 한 명령어가 끝난 후 PC + 4로 다음 명령어를 실행하는데,
branch, jump 등 분기로 인해 원래 Pipeline에서 다음에 실행되어야 할 명령어들을 비워주고 분기로 인한 새로운 명령어들을 Pipeline에 채워주어야 함

Control Speculation

전체 명령어의 약 20%정도에서 Control Flow가 발생함

  • 그 중 forward(if-then-else)에서 약 50%가 발생함
  • backward(loop)에서 약 90%가 발생함

정상적으로 nextPC = PC + 4가 되는 경우는 약 86%, 나머지 14%에 대해 Delay와 성능 저하를 최소화해서 Pipeline을 실행하도록 해야 함

Calculating the nextPC for MIPS

  • 대부분 nextPC = PC + 4
  • jump: 무조건 Pipeline을 비워줘야 함
  • branch: true, false에 따라 Pipeline을 비울지 말지 결정해야 함

Control Hazard Solutions

Stall Branches

  • Stall으로 버퍼를 넣어 해결 (Pipeline의 성능 저하)
  • MEM단계가 아닌 ALU에서 계산이 끝난 직후 결과를 다음 Pipeline에 넘겨주면 1cycle을 줄일 수 있음

Predict not-taken

  • 이미 들어와 있는 명령을 그대로 수행 (nextPC = PC + 4)

Predict taken (IMPORTANT)

  • 이미 들어와 있는 명령을 무효화시키고, 새로운 명령어를 들여와야 함
  • 크기 비교기 역할을 하는 하드웨어를 Register 단계에서 추가하여, ALU단계 이전에 다음 Pipeline에게 더 빨리 결과를 전달해줄 수 있다.

Branch Target Buffer (BTB)

주소만을 모아놓고, nextPC를 예측하는 역할

  • 사용된 PC 주소들은 다음에도 사용될 가능성이 있으므로 이를 저장
  • 전혀 사용되지 않은 주소들은 그 때 가서 저장
  • 이를 통해 다음 명령에 대한 주소 계산을 하지 않고, BTB를 참조하여 그 내용을 가져다 씀

Locality

Temporal Locality

최근에 사용된 것들은 아주 가까운 미래에 다시 사용될 가능성이 높다.

Spatial Locality

최근에 사용된 것들 주변의 것들이 계속 사용될 가능성이 높다.

Tagged BTB


주소를 BTB index, Tag로 나누고, Tag가 같으면 BTB index로 가서 미리 계산된 nextPC를 가져옴

profile
초보 iOS 개발자입니다ㅏ

0개의 댓글