파이프라인 데이터패스 및 제어

Bor·2021년 12월 4일
0

컴퓨터구조

목록 보기
8/15

파이프라이닝 개관에 대한 요약

파이프라이닝은 동시에 실행되는 명령어의 수를 증가시켜 명령어들이 시작하고 끝나는 속도를 증가시킨다. 파이프라이닝은 각각의 명령어의 실행을 끝내는데 걸리는 시간을 단축시키지 않는데 이 시간을 지연시간(latency)이라고 부른다.

지연시간: 파이프라인의 단계 수 또는 실행 중 두 명령어 사이의 단계 수

예를 들어 다섯 단계 파이프라인은 한 명령어가 끝나는 데 다섯 클럭 사이클이 걸린다. 1장에서 사용했던 용어를 사용하면 파이프라이닝은 각각의 명령어 지연시간 보다는 처리율을 향상시킨다. 파이프라이닝은 순차적인 명령어 스트림에 있는 명령어간 병렬성을 추구하는 기술. 멀티프로세서 프로그래밍과는 달리 기본적으로 프로그래머에게 보이지 않는다는 이점을 가지고 있다.


4.6 파이프라인 데이터패스 및 제어

명령어를 다섯 단계로 나눈 것은 다섯 단계 파이프라인을 의미하며 이는 한 클럭 사이크렝 최대 5개의 명령어가 실행 중일 수 있다느 것을 의미한다. 따라서 데이퍼 패스를 5개 부분으로 나눠야 하고 다음과 같이 이름을 붙인다.

  • IF : 명령어 인출
  • ID : 명령어 해독 및 레지스터 파일읽기
  • EX : 실행 또는 주소 계산
  • MEM : 데이터 메모리 접근
  • WB : 쓰기(write back)

위 그림을 보면 이 5개의 요소가 데이터 패스를 그리는 방법에 맞아 돌아간다. 명령어와 데이터는 실해오디며 다섯 단계를 왼쪽에서 오른쪽으로 움직이며 결코 뒤쪽으로 움직여가지는 않는다. 그러나 이에는 두 가지 예외가 있다.

  • 쓰기 단계 : 결과를 데이터 패스의 중앙에 있는 레지스터 파일에다 쓴다
  • PC의 다음값 선정: 증가된 PC 값과 MEM 단계의 분기 주소 중에서 고른다.

오른쪽에서 왼쪽으로 흐르는 데이터는 현재 명령어에 영향을 주지 않는다. 파이프라인의 뒤쪽에 있는 명령어들만이 이 같은 역방향 데이터 흐름에 영향을 받는다. 오른쪽에서 왼쪽으로 가는 첫 번째 연결선은 데이터해저드로 이어질 수 있고 두번째 연결선은 제어 헤저드로 이어질 수 있다.

그림 4.34 단일 사이클 데이터패스에서 실행되고 있는 명령어들

  • 어두운 부분은 사용되고 있는 부분을 표시한다. IM은 명령어 인출 단계에서 명령어 메모리와 PC를 나타내며, Reg는 명령어 해독/레지스터 읽기(ID) 단계의 레지스터 파일과 부호확장기를 의미한다.
  • 올바른 시간 순서를 유지하기 위해서 이 데이터패스는 레지스터 파일을 두 개의 논리적 반쪽으로 나누고 있다. 레지스터 읽기 동안(ID) 읽히는 레지스터와 쓰기(WB) 동안에 써지는 레지스터가 그것이다.
  • 레지스터에 쓰기가 행해지지 않는 ID단계에는 점선을 통해 레지스터 왼쪽 반쪽을 흰색으로, 레지스터 읽기가 행해지지 않는 WB 단계에서는 오른쪽 반을 점선으로 된 흰색으로 표시해 이중 사용을 표시

아래 그림은 적재 명령어가 파이프라인의 다섯 단계를 통과하면서 따라 활성화되는 데이터패스 부분을 파란색으로 보여준다. 적재 명령어는 다섯 단계 모두에서 활성화되므로 적재 명령어를 첫번째로. (레지스터나 메모리가 읽힐 때는 레지스터 또는 메모리 오른쪽 반을 강조 / 쓰기가 이뤄질 땐 왼쪽 반을 강조)

그림 4.36

1) 명령어 인출 (Instruction Fetch) : 위쪽 그림은 pc에 있는 주소를 사용해서 메모리로부터 명령어를 읽어오고 IF/ID 파이프라인 레지스터 저장하는 과정. PC 주소는 4만큼 증가되어 PC에 다시 저장됨으로써 다음 클럭에도 사용될 수 있다. 이 증가한 주소는 IF/ID 파이프라인 레지스터에도 쓰이는데 이것은 beq 며령어처럼 뒤에 필요한 경우를 위해서이다. 어떤 종류의 명령어를 가져오고 있는지 모르기 때문에 이와 같이 대비.

2) 명령어 해독 및 레지스터 파일 읽기(instruction decode and register file read) : 아래의 그림은 IF/ID 파이프라인 레지스터의 명령어 부분이 16비트 수치 필드 값과 레지스터 번호 두 개를 제공하는 것을 보여준다. 세 값모두 증가한 PC 값과 더불어 ID/EX 파이프라인 레지스터에 저장된다. 차후에 필요할 지 모르는 것은 모두 전달한다.

3) 실행 또는 주소 계산: 아래의 그림은 적재 명령어가 ID/EX 파이프라인 레지스터로부터 레지스터 1의 내용과 부호확장된 수치를 읽고, ALU를 사용해 이들을 더하는 것을 보여준다. 합은 EX/MEM과 파이프라인 레지스터에 저장된다.

그림 4.37

4) 메모리접근 : 아래 그림 중 위쪽 그림은 적재명령어가 EX/MEM 파이프라인 레지스터에서 주소를 받아서 데이터 메모리를 읽고 이 데이터를 MEM/WB 파이프라인 레지스터 저장하는 것을 보여준다.

5) 쓰기 : 마지막 단계. MEM/WB 파이프라인 레지스터에서 데이터를 읽어서 그 데이터를 그림 중앙에 있는 레지스터 파일에 쓴다.

그림 4.38

이 같이 적재 명령어를 따라가보면 후속 파이프 단계에서 필요한 정보는 모두 파이프라인 레지스터를 통해 그 필요 단계까지 전달되어 한다는 것을 알 수 있다. 저장명령어를 따라가 보면 후속 파이프 단계를 위해 정보를 전달해야 하는 것뿐만 아니라 명령어 실행도 유사하다는 것을 알 수 있다. 다음은 저장 명령어의 다섯 단계다.

1) 명령어 인출: PC의 주소를 사용해 메모리에서 명령어를 읽어서 IF/ID 파이프라인 레지스터에 저장한다. 명령어가 판별되기 이전에 이 단계가 실행되기 때문에 그림 4.36의 상단그림은 적재 명령어 뿐만 아니라 저장명령어에 대해서도 동작한다.

2) 명령어 해독 및 레지스터 파일 읽기: IF/ ID 파이프라인 레지스터에 있는 명령거가 레지스터 번호를 공급해 두 개의 레지스터를 읽고 또한 16비트 수치의 부호를 확장한다. 이들 세 개의 32비트 값들 모두가 ID/EX 파이프라인 레지스터에 저장된다. 적재 명령어를 위한 그림 4.36의 아래 그림은 저장 명령어를 위한 두 번째 단계의 동작도 보여준다. 이와 같이 첫 두단계는 모든 명령어의 공통. 뭐가 나올지 모르므로.

그림 4.39 / EX : 저장 명령어의 세 번째 파이프 단계.
그림 4.37의 적재 명령어에 대한 세 번째 단계와는 달리두 번째 레지스터 값이 EX/MEM 레지스터에 적재되는데 이 값은 다음 단계에서 사용된다.이 두 번째 레지스터를 EX/MEM 파이프라인 레지스터에 항상 써 넣는 것이 해를 끼치지는 않지만,파이프라인을 이해하기 쉽게 하기 위하여 저장 명령어일 때만 두 번째 레지스터를 쓰기로 한다.

3) 실행 및 주소 계산 : 그림 4.39는 세번째 단계를 보여주는데 실제 주소(effective address)는 EX/MEM 파이프라인 레지스터 제정된다.

4) 메모리접근 : 그림 4.40의 위쪽 그림은 데이터가 메모리에 써지고 있는 것을 보여준다. 저장되어야 할 데이터를 가지고 있는 레지스터는 앞 단계에서 읽히고 읽힌 값이 ID/EX에 저장되어 있다. MEM 단계에서 데이터를 쓸 수 있게 하는 유일한 방법이 EX 단계에서 데이터를 EX/MEM 파이프라인 레지스터에 저장하는 것.

5) 쓰기: 그림 4.40의 아래 그림은 저장 명령어의 마지막 단계. 쓰기 단계에서는 아무것도 일어나지 않음. 저장명령어를 뒤따르는 명령어가 이미 진행 중이기 때문에 이 명령어들을 더 빨리 수행할 방법은 없음. 따라서 특정 단계에서 어떤 명령어가 아무 일도 안 해도 거쳐 가야하는 수 밖에 없음. 뒤따르는 명령어들이 최고 속도로 이미 진행중이기 때문.

그림 4.40 / MEM과 WB : 저장 명령어의 네 번째 및 다섯 번째 파이프 단계

앞선 파이프 단계에서 뒤의 파이프 단계로 무엇인가를 보내기 위해 그 정도가 파이프라인 레지스터에 저장되어야 한다는 것을 저장 명령어는 다시 보여줌. 그렇지 않으면 다음 명령어가 들어올 때 정보를 잃어버리기에. 저장 명령어의 경우 ID에서 읽었던 레지스터 중 하나를 MEM으로 전달할 필요가 있다. 왜냐 MEM에서 메모리에 저장되기 때문. 이 데이터가 처음에는 ID/EX 레지스터에 저장 나중에 EX/MEM 레지스터에 전달됨.

적재 명령어와 저장 명령어는 두 번째 중요한 점을 보여 주고 있다.즉 데이터패스의 각 구성 요소, 즉 명령어 메모리, 레지스터 읽기 포트, ALU, 데이터 메모리, 레지스터 쓰기 포트 등은 한 파이프라인 단계에서만 사용될 수 있다. 그렇지 않으면 구조적 해저드를 일으키게 될 것이다. 따라서 이들 구성 요소와 그 요소들의 제어는 한 파이프라인 단계와 연관 지을 수 있다. 이제 적재 명령어 설계에서의 문제점을 들추어 낼 수 있다. 적재 명령어의 최종 단계에서 어느 레지스터가 변하는가?좀 더 구체적으로 말하면 어느 명령어가 쓰기 레지스터 번호를 제공하는가? IF/ID 파이프라인 레지스터에 있는 명령어가 쓰기 레지스터 번호를 제공하는데,사실 이 명령어는 적재 명령어보다 상당히 뒤에 실행되는 명령어이다.

따라서 적재 명령어에 있는 목적지 레지스터 번호를 간직할 필요가 있다.저장 명령어가 MEM 단계에서 사용하기 위해 ID/EX의 레지스터 내용을 EX/MEM 파이프라인 레지스터로 전달했듯이,적재 명령어도 레지스터 번호를 ID/EX에서 EX/MEM을 거쳐 MEM/WB 파이프라인 레지스터로 보내야 WB 단계에서 사용할 수 있다. 그림 4.41는 올바른 데이터패스를 보여 주고 있는데 쓰기 레지스터 번호를 먼저 ID/EX 레지스터로, 그 뒤에는 EX/MEM 레지스터로, MEM/WB 레지스터로 전달한다. 이 레지스터 번호는 WB 단계에 쓰기를 행할 레지스터를 명시하기 위해 사용된다.

그림 4.41 / 적재 명령어를 제대로 처리하기 위해서 수정된 파이프라인 데이터패스
레지스터 번호는 ID 파이프 단계에서부터 MEM/WB 파이프라인 레지스터까지 전달되므로 이 마지막 세 개의 파이프라인 레지스터에 5비트가 추가된다.

파이프라인 제어

4.3절에서 단일 사이클 데이터패스에 제어를 추가했던 것처럼 파이프라인 데이터패스에 제어를 추가한다. 첫 번째 단계는 기존 데이터패스에 제어선 레이블을 붙이는 것이다. 그림 4.46은 이러한 제어선을 보여 준다.

그림 4.46 제어신호가 명시된 그림 4.41의 파이프라인 데이터패스

그림 4.17의 간단한 데이터패스용 제어로부터 가능한 한 많은 것을 빌려 온다.특히 똑같은 ALU 제어회로, 분기회로, 목적지 레지스터 번호 멀티플렉서, 제어선을 사용한다. 파이프라인 레지스터(IF/ID, ID/EX, EX/MEM, MEM/WB)들은 매 클럭 사이클마다 쓰기가 행해지기 대문에 쓰기 신호가 따로 없다. 파이프라인을 위한 제어를 명시하기 위해서는 각 파이프라인 단계 동안의 제어 값들을 정하기만 하면 된다. 각 제어선은 한 파이프라인 단계에서만 활성화되는 구성요소들과 관련 있기 때문에 제어선을 파이프라인 단계에 따라 다섯 그룹으로 나눌 수 있다.

  1. 명령어 인출:명령어 메모리를 읽고 PC 값을 쓰기 위한 제어신호들은 항상 인가되므로 이 파이프라인 단계에는 제어할 것이 없다.

  2. 명령어 해독/레지스터 파일 읽기 : 이전 단계와 같다.

  3. 실행/주소 계산 : 설정할 신호들은 RegDst, ALUOp, ALUSrc이다. 이 신호들은 목적지 레지스터와 ALU 연산을 선택하고 Read data 2 와 부호확장된 수치 중 하나를 ALU의 입력으로 선택한다.

  4. 메모리 접근 : 이 단계에서 설정되는 제어선은 Branch, MemRead, MemWrite이다.이 신호들은 각각 같을 시 분기, 적재, 저장 명령어일 때 설정된다.

  5. 쓰기 : 두 제어선은 MemtoReg과 RegWrite인데 MemtoReg는 레지스터 파일에 ALU 결과를 보낼 것인가 메모리 값을 보낼 것인가를 결정하며RegWrite는 선택된 값을 레지스터에 쓰게 하는 신호이다.

데이터패스를 파이프라이닝하는 것이 제어선의 의미를 바꾸지는 않기 때문에 전과 같은 제어 값을 사용할 수 있다. 그림 4.49는 4.4절에서와 같은 값을 갖지만 9개의 제어선이 파이프라인 단계에 의해 그룹화되어 있다.

그림 4.49

제어를 구현하는 것은 각 단계에서 9개의 제어신호의 값을 그 명령어에 해당하는 값으로 설정하는 것을 의미한다. 이렇게 하는 가장 간단한 방법은 제어 정보를 포함하도록 파이프라인 레지스터를 확장하는 것이다.제어선들이 EX 단계에서 출발하기 때문에 제어 정보를 명령어 해독 단계 동안에 생성할 수 있다. 그림 4.50은 명령어가 파이프라인을 흘러 내려가면서 제어신호들이 적당한 파이프라인 단계에서 사용되는 것을 보여준다.

그림 4.50 마지막 세 단계를 위한 제어선들

그림 4.51은 확장된 파이프라인 레지스터와 해당 단계에 연결된 제어선을 가지고 있는 전체 데이터패스를 보여 준다.


4.7 데이터 해저드 : 전방전달 대 지연

이전 절에서 사용한 예제들은 파이프라인 실행의 위력과 하드웨어가 어떻게 그 임무를 수행하는가를 보여 주었다. 그림 4.43에서 4.45까지에 나와 있는 명령어들은 독립적인 관계였었다. 즉 어느 명령어도 다른 명령어들에 의해 계산된 결과를 사용하지 않았다. 그러나 4.5절에서 데이터 헤저드가 파이프라인 실행에서 장애물이라는 것을 보았다. 많은 종속성을 가지고 있는 프로그램을 살펴보자. 종송성은 파란색으로 표시되어 있다.

마지막 네 개의 명령어 모두 첫 번째 명령어의 레지스터 $2의 결과에 종속적이다. 이 프로그램이 우리 파이프라인 기계에서 어떻게 수행될까?그림 4.52는 다중 클럭 사이클 파이프라인 표현을 사용하여 이 명령어들의 실행을 보여 주고 있다. 레지스터 $2의 값은 sub 명령어가 결과 값의 쓰기를 행하는 클럭 사이클 5의 중간에 바뀐다.

그림 4.52 5개의 명령어 시퀀스의 파이프라인 종속성. 종송석을 보이기 위해 단순한 데이터패스를 사용하였다

sub와 add 같의 해저드는 레지스터 파일 하드웨어의 설계에 의해 해결될 수 있다. 같은 클럭 사이클에서 쓰기는 앞부분에서 일어나고 읽기는 뒷부분에서 일어난다고 가정한다.그러면 읽기는 새로 써진 값을 읽게 된다. 실제 레지스터 파일의 많은 구현이 그렇듯이 이 예에서도 이런 데이터 해저드는 발생하지 않는다. and와 or 명령어 실행시 데이터 해저드가 발생하는데 이는 전방전달을 통해 코드들을 지연 없이 실행할 수 있다.

0개의 댓글