📘 Pipelining(파이프라이닝)

branch prediction을 계기로 컴퓨터 구조에 대해 한번 공부해보는 시간을 가지다 이것이 왜 쓰게 됐는지 알아보다 파이프라이닝이라는 중요한 기술을 알게되었다.

Pipelining(파이프라이닝)

명령어를 순차적을 실행하는 프로세스에 적용되는 기술이다. 한번에 하나의 명령어만 실행하는 것이 아니라 하나의 명령어가 실행되는 도중에 다른 명령어 실행을 시작하는 식으로 동시에 여러개의 명령어를 실행하는 기법이다. 즉, 한 명령어의 수행이 끝나기 전에 다른 명령어의 수행하는 것이 파이프라이닝이다.

사용 이유

만약, 파이프라인을 사용하지 않고 단일 사이클을 사용하면 한 명령어가 끝날때가지 다른 명령어를 실행하지 못하게 된다.

하지만 파이프라이닝을 수행하기 어렵게 하는 부분들이 존재한다.

이를 해저드라고 한다.

해저드

해저드의 종류에는 세가지가 있다.

  • 구조적 해저드 : 구조적 해저드란 파이프라인에서 실행중인 2개 이상의 명령어가 동일한 하드웨어 자원일 등시에 요구하기 때문에 파이프라인을 멈춰야 하는 상황을 구조적 해저드라고 한다.

  • 데이터 해저드 : 연산할 데이터가 준비되지 않아 파이프라인을 멈춰야 하는 모든 상황이나 조건을 데이터 해저드라고 한다. 주로 선행 명령어와 후행 명령어가 사용하는 데이터 간 종속성 문제로 발생하는데 이는 쉽게 말해 선행 명령어와 후행 명령어가 쓰는 레지스터가 같을 때 주로 발생한다 (레지드터 : 프로세서에 위치한 고속 메모리로 극히 소량의 데이터나 처리 중인 중간 결과와도 같은 프로세서가 바로 사용할 수 있는 데이터를 담고 있는 영역)

  • 명령어 해저드 : 실행할 명령어가 결정/준비되지 않아서 멈춰야 하는 상황이나 조건

이 명령어 해저드 때문에 분기예측을 쓰는것이다. 그럼 이 명령어 해저드가 뭔지 살펴보자

명령어 해저드

분기 명령어의 조건을 만족하면 +1, 만족하지 못하면 -1 한다고 한다 분기 명령어의 조건을 비교하고있는데, 파이프라이닝을 도입했기 때문에 다음 실행할 명령어를 담는 레지스터에는 +1을 하는 명령어를 담아 놓았다. 조건을 비교해보니 조건을 만족하지 않아서 -1을 해야 되므로 앞에 수행 ㅎ했던 과정들을 원래대로 복원시켜놔야한다. 이 과정이 복잡하기 때문에 분기 명령어를 만났을 때에는 파이프라인을일시적으로 중단하고 기다려야 된다.

해결방안(지연분기와 분기예측)

명령어 해저드는 주로 분기 명령어 때문에 발생한다. 분기 명령어는 분기 패널티에 해당하는 사이클만큼 파이프를 낭비한다. 이와 같이 낭비되는 파이프를 분기 지연 슬롯이라고한다.

지연 슬롯을 분기 명령어와 관계없는 명령어로 채운다면 명령어 해저드의 영향을 줄일 수 있다.

이제 우리가 알아야할건 분기예측이다. Static Branch Prediction(정적분기예측) Dynamic Branch Prediction(동적분기예측) 으로 나뉜다. 정적 분기 예측은 컴파일러의 도움으로 분기 여부를 예측하는 기법으로 분기가 발생하지 않는다(분기가 실패한다)고 가정하는 발생 예측 기법과 분기가 발생한다(분기가 성공한다)고 가정한는 발생 얘측기법이 있다.

  1. 분기가 실패할 것으로 예측 (predict the branch as not taken)
    • 분기가 일어나지 않을 것으로 예측하고 실행
    • 분기 주소는 “ID” 단계에서 미리 계산 -> ID : Instruction Decoding 단계
    • 만약 분기가 일어나면, 파이프라인을 멈춘 뒤 분기 주소로 이동
  2. 분기가 성공할 것으로 예측 (predict the branch as taken)
    • 분기 주소는 “ID” 단계에서 미리 계산
    • 예상 페널티: 1 사이클 (실제로 분기 안 함), 1 사이클 (실제로 분기) -> 장점이자 단점임. 무조건 1사이클

Dynamic Branch Prediction(동적분기예측) 전에 쓴 블로그에 다뤄볼 예정이다. 링크

태그:

카테고리:

업데이트: