본문 바로가기
컴퓨터구조

[혼자 공부하는 컴퓨터구조] 05. CPU 성능 향상 기법

by Lizardee 2023. 7. 29.
05-1. 빠른 CPU를 위한 설계 기법
클럭(clock)
  • 컴퓨터 부품들은 '클럭 신호'에 맞춰 일사불란하게 움직인다.
  • CPU는 '명령어 사이클'이라는 정해진 흐름에 맞춰 명령어들을 실행한다.

▶ 클럭 속도(Hz)

: 1초에 클럭이 몇 번 반복되는가?

  • 클럭 속도를 높이는 것은 분명 CPU를 빠르게 만들지만, 클럭 속도만으로 CPU의 성능을 올리는 것에는 한계가 있다.

 

코어(core)와 멀티코어(multi-core)

▶ 코어(core): 명령어를 실행하는 부품; CPU(ALU, 레지스터, 제어장치)

▶ 멀티코어(multi-core): 명령어를 실행할 수 있는 하드웨어 부품(코어)이 CPU 안에 두 개 이상 있는 CPU

  • 멀티코어의 처리 속도는 단일 코어보다 빠르다. 그러나 CPU의 연산 속도가 꼭 코어의 수에 비례하여 증가하는 것은 아니다. 중요한 것은 코어마다 처리할 명령어들을 얼마나 적절하게 분배하느냐이고, 그에 따라서 연산 속도는 크게 달라진다.

전통적인 CPU vs. 멀티코어 CPU

 

스레드(thread)와 멀티스레드(multi-thread)

▶ 스레드(thread): 명령어를 실행하는 단위

  • 하드웨어적 스레드: 하나의 코어가 동시에 처리하는 명령어 단위
  • 소프트웨어적 스레드: 하나의 프로그램에서 독립적으로 실행되는 단위

▶ 멀티스레드(multi-thread): 하나의 코어로 여러 명령어를 동시에 처리하는 기술

--> 멀티스레드 프로세서(multi-thread processor)

: 하나의 코어로 여러 개의 명령어를 동시에 실행할 수 있는 CPU

핵심은 레지스터! 하나의 코어로 여러 명령어를 동시에 처리하도록 만들려면, 프로그램 카운터, 스택 포인터, 데이터 버퍼 레지스터, 데이터 주소 레지스터와 같이 하나의 명령어를 처리하기 위해 꼭 필요한 레지스터를 여러 개 가지고 있으면 된다. 

멀티스레드 프로세서 예) 2코어 4스레드 CPU

 


05-2. 명령어 병렬 처리 기법(ILP; Instruction-Level Parallelism)
명령어 파이프라인(instruction pipeline)

※ 명령어 처리 과정

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

--> 같은 단계가 겹치지만 않는다면 CPU는 각 단계를 동시에 실행할 수 있다.

 

▶ 명령어 파이프라이닝(instruction pipelining)

: 명령어들을 명령어 파이프라인(instruction pipeline)에 넣고 동시에 처리하는 기법

 

▷ 파이프라인 위험(pipeline hazard)

  • 데이터 위험(data hazard): 데이터 의존적인 두 명령어를 무작정 동시에 실행하려고 하면 파이프라인이 제대로 작동하지 않는다.
  • 제어 위험(control hazard): 분기 등으로 인해 '프로그램 카운터(PC; Program Counter)의 갑작스러운 변화'에 의해 발생한다. 기본적으로 프로그램 카운터(PC)는 현재 실행 중인 명령어의 다음 주소로 갱신되는데, 프로그램 실행 흐름이 바뀌어 명령어가 실행되면서 프로그램 카운터 값에 갑작스러운 변화가 생긴다면, 명령어 파이프라인에 미리 가지고 와서 처리 중이었던 명령어들은 아무 쓸모가 없어진다.
    --> 분기 예측(branch prediction): 프로그램이 어디로 분기할지 미리 예측한 후 그 주소를 인출하는 기술
  • 구조적 위험(structural hazard): 명령어들을 겹쳐 실행하는 과정에서 서로 다른 명령어가 동시에 ALU, 레지스터 등과 같은 CPU 부품을 사용하려고 할 때 발생한다. (= 자원 위험(resource hazard))

 

슈퍼스칼라(superscalar)

: CPU 내부에 여러 개의 명령어 파이프라인을 포함한 구조

  • 슈퍼스칼라 프로세서(CPU): 슈퍼스칼라 구조로 명령어 처리가 가능한 CPU

 

비순차적 명령어 처리(OoOE; Out-of-Order Execution)

: 명령어를 순차적으로만 실행하지 않고 순서를 바꿔 실행해도 무방한 명령어를 먼저 실행하여 명령어 파이프라인이 멈추는 것을 방지하는 기법

 


05-3. CISC와 RISC
명령어 집합 구조(ISA; Instruction Set Architecture)

명령어의 기본적인 구조와 작동 원리는 비슷하지만, 명령어의 세세한 생김새, 명령어로 할 수 있는 연산, 주소 지정 방식 등은 CPU마다 조금씩 차이가 있다. CPU가 이해할 수 있는 명령어들의 모음을 명령어 집합 구조(ISA; Instruction Set Architecture)라고 한다. 즉, CPU마다 ISA가 다를 수 있다는 것이다.

 

1) CISC(Complex Instruction Set Computer)

'복잡한 명령어 집합을 활용하는 컴퓨터', 다양하고 강력한 기능의 명령어 집합을 활용하기 때문에 명령어의 형태와 크기가 다양한 가변 길이 명령어를 활용한다. 

 

▷ 단점: 활용하는 명령어가 너무 복잡하고 다양한 기능을 제공하는 탓에 명령어의 크기와 실행되기까지의 시간이 일정하지 않다. 그리고 복잡한 명령어때문에 명령어 하나를 실행하는 데에 여러 클럭 주기를 필요로 한다.

--> 명령어 수행 시간이 길고 가지각색이기 때문에 파이프라인이 효율적으로 명령어를 처리할 수 없다.

 

2) RISC(Reduced Instruction Set Computer)

RISC는 CISC에 비해 명령어의 종류가 적고, 짧고 규격화된 명령어, 되도록 1클럭 내외로 실행되는 명령어를 지향한다. 즉, RISC는 고정 길이 명령어를 활용한다.

--> 명령어 파이프라인에 최적화되어 있다.

 

RISC는 메모리 접근을 단순화, 최소화하는 대신 레지스터를 적극적으로 활용한다. 그렇기에 CISC보다 레지스터를 이용하는 연산이 많고, 일반적인 경우보다 범용 레지스터 개수도 더 많다.

다만 사용 가능한 명령어 개수가 CISC보다 적기 때문에 RISC는 CISC보다 많은 명령어로 프로그램을 작동시킨다.