[컴퓨터구조론] 파이프라이닝과 해저드

2022. 12. 15. 12:00공부/컴퓨터 구조론

728x90

이전 포스팅에서 데이터 경로에 대해서 공부했었다.

https://growth-coder.tistory.com/37

 

두 가지 방식 중 다중 사이클 방식을 사용하면 오늘 공부할 파이프라이닝을 구현할 수 있다.

 

파이프라이닝

 

다중 사이클 방식은 하나의 명령어가 여러 개의 사이클을 사용하기 때문에 하드웨어 장치에 여러 번 접근할 수 있다.

 

어떤 명령어가 A, B, C, D의 사이클로 이루어져 있다고 해보자.

 

이러한 명령어를 여러 번 수행한다고 하면

위와 같이 하나의 명령어가 끝나고 다음 명령어를 실행하는 방식으로 수행이 될 것이다.

 

그러나 다중 사이클 방식을 사용한다면 하나의 사이클이 끝나고 다음 사이클에서는 이전 사이클에서 사용된 하드웨어에 접근할 수 있기 때문에 아래와 같은 파이프라이닝이 가능하다.

 

하나의 사이클이 끝나면서 하드웨어 장치 사용을 마치면 다른 명령어에서 하드웨어에 접근하도록 하는 것이다.

 

명령어를 여러 개의 사이클로 분할할수록 이론적으로는 성능이 향상된다.

 

그러나 실질적으로는 문제가 발생하는데 이러한 문제들을 해저드라고한다.

 

해저드

해저드의 종류는 크게 3가지로 나뉜다.

 

  1. 구조적 해저드
  2. 데이터 해저드
  3. 명령어 해저드

 

구조적 해저드

 

명령어와 데이터가 하나의 메모리에 존재하고 포트도 하나라고 하면 문제가 발생할 수 있다.

 

 

메모리에 연산 결과를 저장하는 명령어가 아래와 같은 과정을 거친다고 해보자.

 

명령어 인출 -> 명령어 해독 -> 연산 -> 작성

 

명령어 인출은 명령어 메모리에서 가져오고 작성은 데이터 메모리에서 작성을 하는데

 

데이터와 명령어가 동일한 메모리에 있기 때문에 파이프라이닝 구조에서 아래처럼 충돌이 일어날 수 있다.

 

명령어 인출 -> 명령어 해독 -> 연산             -> 작성

                        명령어 인출 -> 명령어 해독 -> 연산            -> 작성

                                                명령어 인출 -> 명령어 해독 -> 연산            -> 작성

                                                                        명령어 인출 -> 명령어 해독 -> 연산            -> 작성

 

이러한 문제점을 구조적 해저드라고 한다.     

 

구조적 해저드 해결방안

 

  1. 하드웨어를 추가하거나 포트를 늘린다.
  2. 충돌 가능성이 있는 파이프라인을 바꾼다.
  3. 잠시 실행을 멈춘다.

 

데이터 해저드

 

add $t0, $t1, $t2 명령어는 t0 레지스터에 연산의 결과를 저장하고 있다.

 

위 명령어도 명령어 인출 -> 명령어 해독 -> 연산 -> 저장의 과정을 거친다고 하고 이 다음 명령어가

 

add $s0, $s0, $t0라고 해보면 아래와 같은 파이프라이닝이 될 것이다.

 

명령어 인출 -> 명령어 해독 -> 연산             -> 작성

                        명령어 인출 -> 명령어 해독 -> 연산            -> 작성

 

보다시피 두 번째 명령어는 t0 레지스터에 값을 저장하기 전에 t0 레지스터 값을 가져오게 된다.

 

이렇듯 데이터 간의 관계가 종속적일 경우 데이터 해저드가 발생할 수 있다.

 

데이터 관계는 다음과 같은 것들이 있다.

 

  1. RAR(read after read) : 선행 데이터를 읽은 후에 후행 데이터를 읽음 (문제x)
  2. RAW(read after write) : 선행 데이터 작성 후에 후행 데이터를 읽음 (가장 빈번히 발생하는 문제)
  3. WAR(write after read) : 선행 명령어 읽기 전에 후행 명령어 작성 (superscalar에서 발생)
  4. WAW(write after write) : 선행 명령어 읽은 후에 후행 명령어 작성 (superscalar에서 발생)

데이터 해저드 해결방안

 

ALU에서 연산을 마치면 이 결과를 다음 사이클로 넘기는 것 뿐만 아니라 다음 명령어 ALU의 입력으로 넣는다.(forwarding)

 

 

명령어 해저드

 

주로 분기 명령에서 발생한다. 분기를 해야할 경우 명령어가 준비되지 않아서 패널티가 크다.

 

명령어 해저드 해결방안

 

분기 예측

 

 

해저드 해결 방안

 

크게는 정적과 동적으로 나뉜다.

 

  1. 정적 : 하드웨어 추가, 코드 배치와 같이 프로그램 실행 전에 이루어진다.
  2. 동적 : 명령어 실행을 잠시 중단하는 것과 같이 프로그램 실행 도중에 이루어진다.

 

 

 

728x90