명령어 파이프라인

명령어 처리과정

  1. 명령어 인출
  2. 명령어 해석
  3. 명령어 실행
  4. 결과 저장

같은 단계가 겹치지 않는 이상 CPU는 각 단계를 동시에 실행시킬 수 있다.

위와 같이 명령어를 동시에 처리하는 기법을 명령어 파이프라인이라 한다.

파이프라이닝은 높은 성능을 가져오나 특정 상황에서는 성능향상에 실패하는데 이러한 상황을 파이프라인 위험이라 한다.

파이프 라인 위험에는 아래와 같은 종류가 있다.

  • 데이터 위험
  • 제어 위험
  • 구조적 위험

데이터 위험

데이터 위험은 명령어 간 의존성에 의해 발생한다.

아래와 같은 명령어가 있다고 가정하자

명령어 1 : R1 <- R2 + R3
명령어 2 : R4 <- R1 + R5

위의 경우 명령어 1을 수행해야만 명령어 2를 수행할 수 있다.

만약 명령어 1 실행이 끝나기 전에 명령어2 를 인출하면 의도치 않는 결과가 인출 될 수 있다.

제어 위험

주로 분기 등으로 인해 프로그램 카운터의 갑작스러운 변화에 의해 발생한다.

기본적으로 프로그램 카운터는 현재 실행중인 명령어의 다음 주소로 갱신된다. 그러나 프로그램 실행 흐름이 바뀌어 명령어가 실행되면서 프로그램 카운터에 갑작스러운 변화가 생긴다면 명령어 파이프라인에 미리 가지고 와서 처리중인 명령어들은 쓸모가 없어진다.

구조적 위험

구조적 위험은 명령어들을 겹쳐 실행하는 과정에서 서로 다른 명령어가 동시에 CPU 부품을 사용하려 할 때 발생한다.

슈퍼 스칼라

파이프라이닝은 단일 파이프라인으로 구현이 가능하나, 오늘날 대부분의 CPU는 여러 개의 파이프라인을 이용한다.

이를 슈퍼 스칼라라고 한다.

비순차적 명령어 처리(OoOE)

명령어를 순차적으로 실행하지 않는 기법이다.

아래와 같은 명령어가 있다고 가정해보자

1) M(100) <- 1
2) M(101) <-2
3) M(102) <- M(100) + M(101)
4) M(150) <- 1
5) M(151) <- 2
6) M(152) <- 3

여기서 주목해야 할 점은 3번 명령어를 실행하기 위해서는 1번과 2번 명령어 실행이 끝날 때까지 기다려야 한다.

이 명령어들을 순차적으로 실행하기 보단 3번을 가장 뒤로 보내서 1,2,4,5,6,3 순서로 실행하면 3번을 위해 파이프라인을 멈추는 것을 방지할 수 있다.
업로드중..

이처럼 명령어 순서를 바꿔 실행해도 무방한 명령어를 먼저 실행하여 명령어 파이프라인이 멈추는 것을 방지하는 기법을 비순차적 명령어 처리 기법이라 한다.

profile
어쩌다보니 개발하게 된 구황작물

0개의 댓글