VLIW
very long instruction word architecture으로 컴파일러가 독립적인 명령어들을 찾아 하나의 VLIW 명령어로 묶는다.
장점:
- 하드웨어 구조가 단순화된다.
단점:
- 컴파일러가 매 사이클마다 N개의 독립적인 명령어를 찾아야 한다.
- 독립적인 명령어가 부족할 경우 nop으로 채운다.
- 실행 명령어 개수 변경 시 재컴파일이 필요하다.
- stall 발생 시 여러 명령어를 동시에 stall 한다.
이 아키텍처는 컴파일러 역할이 중요하며, 하드웨어 복잡성을 줄이고 소프트웨어 최적화에 의존한다.
.
Superscalar
VLIW가 어떤 instruction을 동시에 처리할지 컴파일러가 정적으로 결정한다면 superscalar는 어떤 instruction을 동시에 처리할지 하드웨어에서 동적으로 결정한다. superscalar 같은 동적 결정 방식은 컴파일러가 못하는 dependency issue를 파악할 수 있고 효율을 끌어올릴 수 있다.
superscalar에는 순서대로 실행하는 in-order 방식과 순서를 변경해 실행하는 out-of-order 방식이 있다.
in-order 방식의 경우 필연적으로 여러가지 dependency issue들이 발생할 수 밖에 없다.
이 때문에 서로 의존성이 없는 독립적인 instruction끼리 묶어서 실행하는 out-of-order 방식이 존재한다.
out-of-order 방식을 사용하면 앞선 명령어가 dependency issue로 인해 잠시 실행이 중단됐을 때 다른 명령어를 실행시켜 clock cycle을 줄일 수 있다.
그렇다면 out-of-order 방식에서 순서를 어느 정도까지 바꾸는 것을 허용해야 할까? 우선 명령어를 처리하는 세가지 단계를 살펴보자.
1. Instruction issue: ALU에 명령어가 들어가서 execution이 시작하는 단계
2. Instruction completion: ALU에서 연산이 끝나는 단계
3. Instruction commit: 연산이 끝난 후 연산 결과를 레지스터 파일이나 데이터 주소에 써주는 단계
In order issue with In order completion(IOI-IOC)
ALU에 명령어가 순서대로 들어가고 순서대로 execution이 끝나는 방식이다.
아래 그림은 pipeline stage가 3개이고 2개의 명령어씩 실행시키는 프로세서의 예시이다.
execution이 순서대로 실행되고 순서대로 끝나야하기 때문에 비효율적이다.
In-order issue with Out-of-order completion(IOI-OOC)
ALU에 순서대로 들어가지만 연산은 순서대로 끝날 필요 없는 방식이다.
아래는 전 예시를 IOI-OOC 방식으로 수행한 것이다.
굳이 순서대로 끝날 필요가 없기 때문에 비교적 더 효율적으로 바뀌었다.
Out of order issue with Out of order completion(OOI-OOC)
ALU에 명령어가 들어가고 끝나는 순서가 모두 상관없는 방식이다.
I5와 I4에 data dependecy가 있기 때문에 I6를 먼저 execution 해주어 clock cycle을 줄였다.
IPC가 높아진다는 장점이 있지만, dependency를 체크해줄 수 있는 로직이 필요하다는 단점이 있다.
Out-of-order execution
OoO execution은 대부분의 고성능 프로세서들에서 사용된다.
OoO execution 진행 시 dependency issue로 중단된 instruction들은 'Reservation station'이라는 휴식 공간에 머문다.
instruction을 재개하기 위한 source value들이 모두 충족되면 다시 dispatch 된다. 따라서 instruction들은 data의 흐름에 따라 dispatch 된다고 볼 수 있다.
data dependency에는 세 가지 경우가 있다.
- True data dependencies (read and write)
- Antidependencies (write before read)
- Output dependencies (write before write)
true dependency는 데이터 흐름에 의해 불가피하게 발생한다. antidependency와 output dependency는 레지스터 개수 제한으로 발생하며, 'Register renaming'으로 해결 가능하다.
OoO execution은 명령어 수준 병렬성을 최대화하고 프로세서 리소스 활용도를 높이지만, 하드웨어 복잡도와 전력 소비가 증가한다.
Register renaming은 서로 연관 있는 것들끼리만 같은 register name을 쓰게하고 연관이 없는 것들끼리는 다른 register name을 쓰게 하는 방식이다.
Mordern pipeline에서 instruction은 다음과 같이 처리된다.
1. fetch와 decord를 거친 instruction은 'Reservation station'에 위치한다.
2. 'Reservation station'에서 'Tag and Value Broadcast Bus'를 통해 특정 데이터가 변경됐다는 정보를 받고, 실행하는데 필요한 모든 데이터를 충족시킨 instruction부터 execution한다.
3. execution이 완료되면 데이터가 변경됐다는 정보를 'Tag and Value Broadcast Bus'를 통해 'Reservation station'으로 보낸다.
4. 'Reorder buffer'에서 commit해도 되는지 판단하고 괜찮으면 write back한다.
'학교공부 > 컴퓨터구조' 카테고리의 다른 글
[컴퓨터 구조] A Single Cycle MIPS Processor (0) | 2024.10.13 |
---|---|
[컴퓨터 구조] Branch prediction (0) | 2024.10.13 |
[컴퓨터구조] Cache (0) | 2023.06.09 |
[컴퓨터 구조] Memory Hierarchy (0) | 2023.06.03 |
[컴퓨터 구조] Multithreading (0) | 2023.06.03 |