본문 바로가기
Computer Architecture/Processor

Processor의 구조 - 6. Pipeline(파이프라인) 설계

by FastBench 2024. 11. 13.
반응형

- 프로세서 시리즈 모아보기 -

https://microelectronics.tistory.com/112

 

기본적인 ISA 동작 방식을 모르면 이해하기 어렵습니다.

 

파이프라인 프로세서 구축 과정

파이프라인 프로세서는 단일 사이클 설계를 여러 단계로 나누어 각 명령어가 동시에 실행되도록 설계된다. 이 단계는 Instruction Fetch(IF), Instruction Decode(ID), Execute(EX), Memory Access(MEM), Write Back(WB)의 다섯 단계로 나뉜다. 각 단계가 독립적으로 실행되어 한 사이클 동안 여러 명령어가 병렬로 진행될 수 있게 한다.

1. 파이프라인의 다섯 단계

  • IF (Instruction Fetch): 메모리에서 명령어를 가져오는 단계이다.
  • ID (Instruction Decode): 명령어를 해독하고, 레지스터 파일에서 필요한 데이터를 읽는다.
  • EX (Execute): ALU에서 명령어 연산을 수행하거나 주소를 계산하는 단계이다.
  • MEM (Memory Access): 메모리에서 데이터를 읽거나 쓰는 작업을 수행한다.
  • WB (Write Back): 연산 결과를 레지스터 파일에 기록하는 단계이다.

이 다섯 단계는 서로 독립적으로 진행되어, 파이프라인이 채워질수록 병렬 처리가 가능해진다.

2. 파이프라인 레지스터의 필요성

파이프라인의 각 단계 사이에는 파이프라인 레지스터가 있어, 이전 단계에서 생성된 데이터를 다음 단계로 넘긴다. 클럭 신호에 따라 이 레지스터는 이전 단계의 출력을 입력으로 받아 다음 단계에 넘겨준다. 이렇게 함으로써 각 명령어는 파이프라인을 통해 각 단계에서 필요한 데이터를 전달받아 처리된다.

3. 파이프라인의 성능 이점

반응형

파이프라인을 적용한 MIPS 설계는 단일 사이클 설계와 비교할 때 클럭 속도를 증가시킬 수 있다.

 

단일 사이클 프로세서의 경우, 가장 느린 명령어에 맞춰 클럭 속도를 설정해야 했으나, 파이프라인 프로세서에서는 각 단계의 최장 시간을 기준으로 클럭 속도를 설정한다. 예를 들어, 단일 사이클 설계에서 800ps가 소요되는 작업이 파이프라인에서는 200ps의 클럭 속도로 나누어져 실행되므로 속도 향상이 가능하다.

R-format 명령어만을 실행하는 코드에서는 파이프라인의 80%만 사용된다. 이 경우 
Instruction Fetch(IF), Instruction Decode(ID), Execute(EX), Write Back(WB) 단계만 사용되며, 메모리 접근(MEM) 단계는 사용되지 않는다.

 

4. 제어 로직의 역할

모든 명령어가 모든 단계를 사용하지는 않는다. 예를 들어:

  • R-format 명령어와 분기 명령어는 메모리 접근(MEM) 단계를 사용하지 않는다.
  • store word와 분기 명령어는 레지스터 파일에 쓰기(WB) 단계를 사용하지 않는다.

따라서 제어 로직은 명령어의 유형에 따라 각 단계에서 올바른 작업이 수행되도록 조정해야 한다.

 

MIPS 파이프라인 프로세서 단계별 동작

MIPS 파이프라인은 다섯 단계로 나뉘며, 각 단계마다 수행되는 작업과 파이프라인 레지스터에 저장되는 상태 정보가 있다. 여기서는 load 명령어를 예로 들어 각 단계에서 수행되는 작업을 살펴본다.

1. Instruction Fetch (IF)

  • 수행 작업: PC + 4를 계산하여 다음 명령어 주소를 결정하고, 명령어 메모리에서 현재 명령어를 가져온다.
  • 저장 데이터: 파이프라인 레지스터에는 계산된 PC + 4현재 명령어가 저장된다.
  • 의미: 이 데이터는 다음 단계에서 명령어 해독 및 레지스터 읽기 작업에 사용된다.

2. Instruction Decode (ID)

  • 수행 작업: 파이프라인 레지스터의 명령어를 해독하고, 레지스터 파일에서 소스 레지스터 값을 읽어온다. 또한, 명령어의 즉시 값(immediate)을 부호 확장(sign-extend)한다.
  • 저장 데이터: 이전의 PC + 4, 명령어 자체, 레지스터 파일에서 읽은 두 개의 값, 부호 확장된 즉시 값이 저장된다.
  • 의미: 이 정보는 이후 단계에서 ALU 연산 및 분기 주소 계산에 사용된다.

3. Execute (EX)

  • 수행 작업: 분기 명령어의 경우 PC + 4와 부호 확장된 즉시 값을 사용해 분기 주소를 계산하고, ALU에서 연산을 수행한다.
  • 저장 데이터: 명령어, 계산된 분기 주소, ALU 결과, 그리고 레지스터 파일에서 읽은 두 번째 값(rf2)을 저장한다.
  • 의미: rf2 값은 store 명령어가 데이터 메모리에 쓰기를 수행할 때 사용되며, ALU 결과는 연산 결과 또는 메모리 주소로 사용된다.

4. Memory Access (MEM)

  • 수행 작업: ALU 결과를 주소로 사용하여 메모리에 접근한다. load 명령어의 경우 메모리에서 데이터를 읽어오고, store 명령어의 경우 rf2의 값을 메모리에 쓴다.
  • 저장 데이터: 명령어, 메모리에서 읽은 데이터(읽기인 경우) 또는 ALU 결과(쓰기인 경우)가 저장된다.
  • 의미: 메모리 작업 결과는 최종적으로 레지스터 파일에 쓰기 위해 Write Back 단계로 전달된다.

5. Write Back (WB)

  • 수행 작업: 메모리에서 읽은 데이터 또는 ALU 연산 결과를 레지스터 파일에 기록한다.
  • 중요한 점: 기록할 레지스터는 IF/ID 파이프라인 레지스터가 아닌, 최종 단계의 파이프라인 레지스터에서 가져와야 한다. (Instruction 을 토대로 어떤 레지스터에 기록해야 할지 알 수 있다.)

6. 전체 정리

각 단계별로 저장해야하는 항목들을 정리하면 아래와 같다.

 

 

제어로직 설계

파이프라인의 제어 로직은 각 단계에서 명령어가 수행해야 할 작업을 관리한다. 이를 통해 필요한 제어 신호를 생성하여 파이프라인의 각 단계가 올바른 작업을 수행할 수 있도록 한다.

 

바로 위 챕터에서, 각 Stage 가 처리해야하는 일을 알기 위해서 pipeline stage register 에 명령어를 저장해야한다고 했는데, 과연 실제로 명령어 전체를 저장해야하만 할까? 아니다. 각 stage 가 사용할 부분만 저장을 하면 되고, 더 구체적으로는 각 stage 에서 사용되는 제어신호만 저장하면 된다.

 

1. 파이프라인의 제어 신호 흐름

파이프라인의 다섯 단계는 각각 특정 작업을 수행하며, 명령어 해독(ID) 단계에서 제어 신호를 생성하여 이후 단계로 전달한다.

1.1 Instruction Fetch (IF): instruction memory에서 명령어를 가져오고, 이를 파이프라인 레지스터에 저장한다.

1.2 Instruction Decode (ID): 명령어를 해독하여 제어 로직으로 전달한다. 제어 로직은 명령어 유형에 따라 각 단계에서 필요한 제어 신호를 생성한다.

  • Execute 단계에서 ALU 연산 제어, 레지스터 파일 또는 즉시 값의 입력 선택, 목적 레지스터 선택 등의 신호가 생성된다.
  • Memory 단계에서 메모리 읽기/쓰기 여부와 분기 여부를 결정하는 신호가 생성된다.
  • Write Back 단계에서는 레지스터 파일에 데이터를 쓸지 여부를 제어하는 신호가 생성된다.

1.3 Execute (EX): ID 단계에서 생성된 제어 신호를 사용해 ALU 연산을 수행하거나, 분기 주소를 계산한다. 메모리나 최종 쓰기 단계에서 필요한 제어 신호는 다음 파이프라인 레지스터로 전달된다.

  1. ARUSrc : ALU 입력 소스가 RF2 인지 Imm 값인지 선택
  2. ALUOp : ALU 연산 타입 선택 (ADD 인지 SUB 인지 등등..)
  3. RegDst : 명령어 타입에 따른 Destination Register 선택. (명령어에 따라 destination register 의 field 위치가 다름)

1.4 Memory Access (MEM): 이전 단계에서 전달된 신호를 사용해 메모리 읽기/쓰기 작업을 수행한다.

  1. MemWrite/Read : 메모리 제어 신호
  2. PCSrc : PC+4 를 사용할지, 계산된 분기주소를 사용할지 선택
파이프라인의 분기 명령어에서 분기 여부를 결정하기 위해 AND 게이트가 사용된다. 예를 들어, branch equal 명령어의 경우, Jump 신호가 활성화되고 ALU 출력이 0일 때 분기가 발생한다. 이는 이전 사이클에서 계산된 ALU 결과와 제어 신호가 현재 사이클에서 AND 게이트를 통해 확인되며, 조건이 만족될 경우 분기를 수행한다.

1.5 Write Back (WB): 마지막 단계에서 제어 신호에 따라 ALU 또는 메모리에서 가져온 데이터를 레지스터 파일에 저장한다.

  1. MemtoReg : ALU 의 연산결과를 RF에 쓸지, 메모리에서 읽은 값을 쓸지 선택
  2. RegWrite : RF 에 값을 쓸지 말지 선택

2. Destination Register 선택 (R-타입과 I-타입 구분)

Write Back 에서 RF 에 값을 쓸 때, 아래와 같이 파이프라인 레지스터에서 레지스터 위치를 가져와야한다. 

 

MIPS 파이프라인에서 목적 레지스터를 선택할 때, R-타입 명령어와 I-타입 명령어가 다르게 동작한다.

R-타입 명령어는 rd 레지스터를 목적 레지스터로 사용하고, I-타입 명령어는 rt 레지스터를 사용한다. 이 구분을 위해 명령어 해독(ID) 단계에서 두 값 모두를 파이프라인 레지스터에 저장하고, 이후 단계에서 올바른 레지스터를 선택하여 사용한다.

 

결론

  • 파이프라인 프로세서는 명령어를 여러 단계로 나누고, 파이프라인 레지스터를 통해 데이터와 명령어를 전달함으로써 병렬 처리가 가능해진다. 이를 통해 프로세서는 더 빠르게 명령어를 처리할 수 있으며, 제어 로직은 각 명령어가 필요한 단계만 수행할 수 있도록 조정하여 효율을 극대화한다.
  • 파이프라인 레지스터는 각 단계 사이에서 데이터를 보관하며, 클럭 신호에 따라 각 단계의 데이터를 다음 단계로 전달한다. 이를 통해 명령어가 파이프라인을 거치면서 필요한 정보가 지속적으로 전달되고, 각 단계는 독립적으로 작업을 수행할 수 있다.
  • MIPS 파이프라인의 제어 로직은 각 명령어의 실행 단계를 관리하고, 명령어 해독 단계에서 생성된 제어 신호가 각 단계에서 올바른 작업을 수행하도록 지원한다. 이러한 제어 로직과 신호의 흐름을 통해 파이프라인은 고성능, 병렬 처리를 통해 매 사이클마다 명령어를 완료할 수 있도록 한다.

 

Reference

반응형

댓글