정리 표:
R-type | add, sub, and, or, xor, nor, sll, srl, sra | 수행 | jr은 미수행 |
I-type | lw, lui | 수행 | 데이터 전송 명령어 |
I-type | addi, andi, ori, xori, sw, beq, bne | 미수행 | 연산 및 분기 명령어 |
J-type | j, jal | 미수행 | 점프 명령어 |
5단계의 파이프라인 단계에서 IF - ID - EX - MEM - WB에서
load 명령어
- IF : 명령어 인출
- ID : 명령어 해독 및 주소 계산
- EX : 주소 계산
- MEM : 메모리에서 데이터 읽기
- WB : 메모리에서 읽은 데이터를 레지스터에 쓰기
즉 load 명령어에서는 wb 단계를 수행합니다.
store 명령어
- IF : 명령어 인출
- ID : 명령어 해독 및 주소 계산
- EX : 주소 계산
- MEM : 메모리에 데이터 쓰기
- WB : store 명령어는 메모리에 값을 저장하는 것이 목적이므로, 레지스터의 결과를 다시 쓸 필요 없습니다.
beq 명령어
- IF : 명령어 인출
- ID : 명령어 해독 및 비교
- EX : 분기 조건 확인
- MEM : 메모리 접근 없음
- WB : beq 명령어는 분기 여부를 결정하는 것이 목적이므로, 레지스터의 결과를 다시 쓸 필요는 없습니다. 대신 분기 조건이 참이면 pc값을 변경하여 다음 실행할 명령어를 결정합니다.
단일 사이클 프로세서 대비 파이프라인 프로세서의 특징
단일 사이클 프로세서는 하나의 명령어를 하나의 클럭 사이클 동안 실행합니다. 즉 명령어 인출, 해독, 실행, 메모리 접근, 쓰기의 모든 단계를 하나의 클럭 사이클 내에 완료합니다.
파이프라인 프로세서 여러 단계에 나누어 각 단계를 처리합니다.
단일 사이클 프로세서의 경우 모든 명령어가 하나의 클럭 사이클에 실행되므로 CPI는 항상 1입니다. 파이프라인 프로세서의 경우 이상적인 상황 1에 가깝겠지만 hazard가 발생하면 1보다 커질 수 있습니다. 줄어드는 것은 애매합니다.
클럭 주파수가 높아진다 (o)
단일 사이클 프로세서는 하나의 클럭 사이클 내에 모든 단계를 완료해야 하므로, 클럭 주기가 길어집니다. 즉 클럭 주파수는 낮습니다. (클럭 주파수 = 1초에 몇번 반복하는지, 길이에 반비례)
파이프라인 프로세서는 각 단계를 분리해서 처리하므로 클럭 주기가 짧으며 즉 클럭 주파수가 높아집니다.
면적이 증가한다
파이프라인 프로세서는 각 단계를 저장하기 위한 추가적인 레지스터가 필요합니다. 따라서 단일 프로세서에 비해 면적이 증가합니다.
소모 전력이 증가한다
클럭 주파수가 높아지면, 더 빠른 속도로 동작하면 소모 전력은 증가합니다. (동일 시간에 더 많은 일이 일어나므로 그 만큼 시간당 소모되는 에너지가 늘어나는 것)
MIPS 프로세서 클럭주기 설정
- 클럭 주기 : CPU가 동작하는 기본 시간 단위로 클럭 주기가 짧을수록 클럭 주파수가 높아집니다.
- 단일 사이클 프로세서 : 하나의 명령어는 하나의 클럭 사이클 동안 실행
- 파이프라인 프로세서 : 명령어를 여러 단계로 나누어 동시에 처리
- Delay : 어떤 동작이 완료되는 데 걸리는 시간
클럭 주기는 instruction의 가장 긴 delay에 의해 결정됩니다.
단일 사이클 프로세서의 경우, 하나의 클럭 사이클 내에 모든 단계를 완료해야 하므로, 가장 오래 걸리는 단계의 실행 시간이 클럭 주기가 됩니다. 만약 명령어 실행하는 데 필요한 단계 중 가장 오래 걸리는 시간이 200ps라면 클럭 주기는 최소 200ps 이상이어야 합니다.
메모리에 데이터를 저장해야 하는 store가 load 보다 delay가 짧다.
load 명령어는 메모리에서 데이터를 읽어와 레지스터에 저장하는 것이고 store 명령어는 레지스터의 데이터를 메모리에 저장하는 명령어입니다.
일반적으로 load는 메모리 접근 후 데이터를 읽어오는 시간이 필요하므로, store보다 시간이 오래 걸립니다. store는 데이터를 메모리에 쓰는 것으로 작업이 완료되므로, 쓰기 완료를 기다릴 필요가 없어 load보다 빠르게 완료됩니다.
하나의 instruction을 실행하면서 register file은 유일하게 두 번 접근되는 unit이다
대부분의 명령어는 레지스터에서 데이터를 읽어오고, 연산 결과를 다시 레지스터에 저장합니다. 특히 R-type의 경우 두 개의 소스 레지스터에서 값을 읽고, 하나의 목적지 레지스터에 값을 씁니다.
load 명령어의 경우에도 레지스터에서 주소 계산에 필요한 값을 읽고, 메모리에서 읽어온 데이터를 레지스터에 저장합니다. 따라서 register file은 하나의 instruction을 실행하면서 유일하게 두 번 접근됩니다.
클럭 주기를 낮추는 방법으로 Pipelining을 들 수 있다.
파이프라이닝은 명령어를 여러 단계로 나누어 동시에 처리함으로써 전체적인 처리 속도를 향상시키는 기술입니다. 파이프라이닝을 사용하면 각 단계의 실행 시간, 즉 클럭 주기를 단일 사이클 프로세스보다 짧게 가져갈 수 있습니다. 클럭 주기가 짧아지면 클럭 주파수는 높아집니다.
IF 단계의 역할
IF 단계는 메모리에서 실행할 명령어를 가져오는 단계입니다. 이 단계에서 PC가 사용됩니다.
Instruction Memory에서 instruction이 하나 선택된다.
IF의 주된 역할은 instruction memory에서 명렁어를 읽어오는 것입니다. pc가 가리키는 주소에 있는 명령어가 선택됩니다.
MIPS는 32비트 아키텍쳐이므로 명령어 크기는 4바이트입니다. 따라서 하나의 명령어를 인출한 후에는 PC를 4만큼 증가시켜 다음 명령어의 주소를 가리키도록 합니다.
MemRead 신호는 데이터 메모리를 읽을 때 사용되는 제어 신호입니다. 명령어 메모리를 읽을 때는 별도의 제어 신호가 사용됩니다. IF 단계에서는 항상 명령어를 읽어야 하므로, MemRead 신호의 값에 상관없이 명령어가 인출됩니다. MemRead = 1은 데이터 메모리를 읽을 때 사용이 됩니다.
파이프라인 적용된 MEM 단계
MEM 단계는 메모리에 접근하는 단계입니다. load 명령어는 이 단계에서 메모리에서 데이터를 읽어오고, store 단계에서는 메모리에 데이터를 씁니다.
load instruction을 수행할 때에만 data memory의 읽기가 수행됩니다.
load 명령어는 메모리에서 데이터를 읽어와 레지스터에 저장하는 것입니다. 이 읽기 작업은 MEM 단계에서 수행됩니다. 다른 명령어에서는 읽는 작업을 수행하지 않습니다.
R-type instruction 은 mem 단계에서 아무것도 하지 않습니다.
파이프라인은 모든 명령어가 동일한 단계를 거치도록 설계되어 있습니다. R-type 명령어가 메모리 접근 필요없으니 아무것도 하지 않습니다. 물론 이것이 생략되는 것은 아닙니다.
ALU의 결과를 data memory의 주소로 사용한다
load와 store 명령어는 메모리 접근을 위한 주소가 필요합니다. 이 주소는 EX단계에서 ALU를 통해 계산됩니다. 계산된 주소는 MEM 단계에서 메모리에 접근하는 데 사용됩니다.
store 명령어는 레지스터의 데이터를 메모리에 저장하는 역할을 합니다. 이 쓰기 작업은 MEM 단계에서 수행됩니다. 다른 명령어들은 데이터를 쓰는 작업이 필요하지 않으므로 MEM 단계에서 쓰기 작업을 수행하지 않습니다.
ID 단계 수행
ID 단게에서는 IF 단계에서 인출해 온 명령어를 해독하고, 필요한 레지스터를 읽는 단계입니다. 이 단계에서는 명령어의 종류를 파악하고 명령어 실행에 필요한 제어 신호를 생성합니다.
ID 단계에서 수행되는 것들을 보면 다음과 같습니다.
- 레지스터 파일에서 레지스터의 값을 읽는 것 : 대부분의 MIPS는 두 개의 소스 레지스터를 필요로합니다. ID 단계에서는 레지스터 번호를 이요하여 해당 레지스터의 값을 읽어옵니다.
- Instruction의 최하위 16비트를 32비트로 확장한다 : ALU 연산을 위해서 확장하는 작업은 EX 전 ID에서 실행됩니다.
- Instruction을 해석하여 제어 신호를 생성한다 : ID 단계 중요한 역할 중 하나는 명령어를 해독하여 이후 필요한 제어 신호를 생성하는 것입니다.
제어 신호와 파이프라인 단계
ALUOp
ALU에서 수행할 연산의 종류를 결정하는 제어 신호입니다. 덧셈, 뺄셈, AND, OR 등 어떤 연산을 수행할지 신호가 지정합니다. ALU는 EX단계에서 수행됩니다.
ALUSrc
ALU의 두 번째 입력값을 결정하는 제어 신호입니다. 레지스터에 읽은 값을 사용할지, immediate를 사용할지 선택합니다. ALU의 입력값을 선택하는 것은 ALU 연산 전에 이루어지므로 이는 EX단계에서 사용됩니다.
MemRead
메모리에서 데이터를 읽을지 여부를 결정하는 것입니다. load 명령어 실행 시 이 신호가 활성화됩니다. 메모리 접근은 MEM 단계에서 이루어집니다.
MemWrite
메모리에 데이터를 쓸지 여부를 결정하는 제어 신호입니다. store 명령어를 실행 시 이 신호가 활성화됩니다. 메모리에 쓰는 작업은 MEM 단계에서 수행됩니다.
RegWrite
레지스터에 값을 쓸지 여부를 결정하는 것입니다. ALU 연산 결과 또는 메모리에서 읽어온 값을 레지스터에 저장할 때 이 신호가 활성화됩니다. 레지스터에 쓰는 작업은 WB에서 일어납니다.
MemtoReg
레지스터에 쓸 값을 선택하는 제어 신호입니다. ALU 연산 결과를 쓸지, 메모리에서 읽어온 값을 쓸지를 결정합니다. 레지스터에 값을 쓰는 것은 WB에서 일어납니다.
IF 관련 제어 신호
- PCSource : 다음에 PC에 어떤 값을 넣을지 결정 (PC+4, 분기 시 분기 주소 등)
- lorD : 메모리 접근 시 명령어 데이터인지 데이터 메모리인지 선택
'IT 프로그래밍 > 컴퓨터구조' 카테고리의 다른 글
[컴퓨터구조] 포워딩 hazard 위험 (0) | 2024.12.18 |
---|---|
[컴퓨터구조] 파이프라인 해저드 (Pipeline Hazards) 및 해결 방법 (0) | 2024.12.18 |
[컴퓨터구조] (0) | 2024.12.18 |
[컴퓨터구조] Processor1 (0) | 2024.12.17 |
[컴퓨터구조] processor1 (0) | 2024.12.17 |