본문 바로가기
Computer Architecture/Basic

CPU 성능을 올리기 위한 설계 방법

by FastBench 2023. 4. 7.

초안 :  2023.04.06

 

 

CPU설계를 할때 클럭을 높이고, 코어를 왕창 때려넣고, 레지스터를 왕창 박아서 멀티스레드 기능을 넣으면 빠른 성능의 CPU를 만들 수 있다. 그런데 이보다 중요한 것은 CPU가 놀지 않도록 하는 것이다.

 

명령어를 동시에 처리하여 CPU 가 쉬지 않고 동작하게 하는 기법을 ILP (Instruction-Level Parallelism, 명령어 병렬처리 기법) 이라고 한다.

이번게시글에서는 대표적인 파이프라이닝, 슈퍼스칼라, 비순차적 명령어 처리에 대해 다룬다.

 

파이프라이닝 (Pipelining)

이전에 명령어의 실행 cycle 을 Fetch ↔ Execution 으로 나눴는데, 클럭 단위로 살펴보면 아래와 같다.

1. Instruction Fetch (명령어 인출)
2. Instruction Decode (명령어 해석)
3. Execute Instruction (명령어 실행)
4. Write Back (결과 저장)

 

1번과정은 꼭 4번과정이 끝난 후에 이뤄져야 할까? 파이프라이닝은 각 단계를 동시에 실행한다는 것에서 시작한다.

아래그림을 참조하자.

CPU 가 Decoding 을 하는 클럭주기에 동시에 명령어를 Fetch할 수 있다. 이렇게 겹쳐서 수행을 하면 훨씬 효율적으로 명령어를 처리할 수 있는 것이다. 만약 순차적으로 처리한다면, 아래와 같이 명령어 두개를 처리하는데에만 t8 이 소요될 것이다.

파이프라이닝이 모든 경우에 다 적용될 수는 없다. 특정상황에서는 성능향상에 실패하는 경우도 있는데 이러한 상황을 Pipeline hazard 라고 부른다. CPU 제조사들은 이러한 위험을 고려하여 CPU를 설계해야 한다.

Pipeline hazard 에는 크게 Data hazard, Control hazard, structural hazard 가 있다.

 

- Data hazard (데이터 위험)

data hazard 는 명령어 간의 데이터 의존성에 의해 발생한다.

명령어1 과 명령어2 가 있는데 명령어2는 꼭 명령어1이 끝난 후에 실행되어야 한다면?

명령어 1 : R1 ← R2 + R3
명령어 2 : R4 ← R1 + R5

이와 같이 데이터 의존적인 두 명령어를 동시에 실행하려고 하면 파이프 라인이 제대로 작동하지 않는데 이를 'Data hazard(데이터위험)' 이라고 한다.

 

- Control hazard (제어 위험)

Control hazard 는 주로 분기(switch) 등으로 인한 PC값이 변할 때 발생한다.

기본적으로 PC 값은 매 싸이클마다 1씩 더해지면서 '현재 실행 중인 명령어의 다음 주소' 로 갱신된다. 그런데 만약 if 문과 같은 분기를 맞이하면 PC 값은 갑작스레 변화가 생기면, 명령어 파이프 라인에 미리 가져와 처리중이었던 명령어들은 아무 쓸모가 없어진다. 이를 Control hazard 라고 한다.

Control hazard

- Structural hazard (구조적 위험)

명령어들을 겹처 실행하는 과정에서, 서로 다른 명령어가 동시에 ALU 와 레지스터 같은 CPU 파츠를 사용하려고 할때 발생한다. 같은 의미로 resource hazard 라고도 부른다.

 

 

슈퍼스칼라(Superscalar)

오늘날 대부분 CPU는 여러개의 파이프라인을 이용한다. 이처럼 cpu 내부에 여러개의 명령어 파이프라인을 포함한 구조를 슈퍼스칼라 라고 한다. 즉 슈퍼스칼라 프로세서(CPU)는 매 클럭마다 여러 명렁어를 fetch 하고 execute 할 수 있어야 한다.

예를 들어, 멀티스레드 프로세서는 한번에 여러 명렁어를 인출 할 수 있기에 슈퍼스칼라 구조를 사용할 수 있다.

당연히 여러개의 파이프라인을 사용하므로 각종 hazard 를 피하기 어려워 지므로 설계 난이도는 매우 올라간다.

 

비순차적 명령어 처리 (OoOE , Out of order execution)

파이프라이닝, 슈퍼스칼라 기법은 모두 여러 명령어의 순차적 처리를 병렬적으로 빠르게 처리하기 위한 방법이었다.

다만 Pipeline hazard 와 같은 문제로 인해 몇몇 명령어는 곧바로 처리되지 못하는데, 이처럼 모든 명령어를 순차적으로 처리한다면 파이프라인은 멈춰버리게 된다.

 

아래의 예시를 보자.  Command 3 이 Command 2와 의존성이 있어 파이프라인이 멈추는 경우와 이를 비순차적으로 처리하여 파이프라인이 멈추는 것을 방지한 예시이다.

이렇게 순서를 바꿔 실행해도 무방한 명령어를 먼저 실행하여 파이프라이닝이 멈추는 것을 방지하는 기법을 OoOE , 비순차적 명령어 처리 기법이라고 한다.

 

추가적으로 OoOE 에 대해 살펴보던 도중 추가로 읽어보면 좋을 게시글을 발견하여 링크를 건다.

https://bluekms21.gitbooks.io/femp/content/03_OoOE.html

아무래도 컴파일러단에서 일어나는 최적화가 아니다 보니, 실행 도중 버그가 발생할 수 있다는 글이다.

 

 

 

 

Reference

  • 혼자 공부하는 컴퓨터 구조 + 운영체제, 한빛미디어, 강민철

 

 

 

'Computer Architecture > Basic' 카테고리의 다른 글

Logical Address 와 Physical Address  (0) 2023.04.09
CISC 와 RISC  (0) 2023.04.08
스레드(thread)와 멀티 스레드 CPU  (0) 2023.04.06
인터럽트(Interrupt)  (0) 2023.04.05
프로세서 내부의 레지스터  (0) 2023.04.04

댓글