새소식

Computer Science/Computer Architecture

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

  • -

 

본 게시물은 ‘강민철, ⌜혼자 공부하는 컴퓨터구조 + 운영체제⌟, 한빛미디어, 2022’ 을 인용하였습니다.

 

1. 빠른 CPU를 위한 설계 기법

클럭

  • 컴퓨터 부품들은 ‘클럭 신호’에 맞춰 움직임
  • CPU는 ‘명령어 사이클’이라는 정해진 흐름에 맞춰 명령어들을 실행함

⇒ 즉, 클럭 속도가 높아지면 CPU는 명령어 사이클을 더 빠르게 반복할 것이고 다른 부품들도 그에 맞춰 더 빠르게 작동할 것

  • 클럭 속도 : 1초에 클럭이 몇 번 반복되는지를 Hz(헤르츠) 단위로 측정함
    • 클럭이 1초에 100번 반복되면, CPU 클럭 속도는 100Hz
  • 그러나 클럭 속도를 높여 CPU를 빠르게 만드는 것에는 한계가 있음(발열 문제) => 코어&스레드 수 늘리기

 

코어와 멀티 코어

  • 오늘날 CPU는 많은 기술 발전으로 ‘명령어를 실행하는 부품’에서 ‘명령어를 실행하는 부품을 여러 개 포함하는 부품’으로 명칭 범위가 확장됨
  • 코어(core) : 명령어를 실행하는 부품
  • 멀티코어(multi-core) CPU 또는 멀티코어 프로세서 : 코어를 여러 개 포함하고 있는 CPU
    • 멀티코어 처리 속도는 단일코어보다 빠름
코어 수 프로세서 명칭
1 싱글코어(single-core)
2 듀얼코어(dual-core)
3 트리플코어(triple-core)
4 쿼드코어(quad-core)
6 헥사코어(hexa-core)
8 옥타코어(octa-core)
10 데카코어(deca-core)
12 도데카코어(dodeca-core)
  • 그러나 CPU 연산 속도가 코어 수에 비례하여 증가하지는 않음 => 코어마다 처리할 연산이 적절히 분배되어야 함

 

스레드와 멀티스레드

스레드(thread) : 실행 흐름의 단위

  • CPU에서 사용되는 스레드의 종류
    • 하드웨어적 스레드
    • 소프트웨어적 스레드

하드웨어적 스레드

하나의 코어가 동시에 처리하는 명령어의 단위

  • 명령어를 실행하는 부품이 1개, 한 번에 1개 명령어를 실행하는 CPU라면, 1코어 1스레드 CPU

  • 명령어를 실행하는 부품이 2개, 한 번에 4개 명령어를 실행하는 CPU라면, 2코어 4스레드 CPU

  • 멀티스레드(multithread) 프로세서 또는 멀티스레드 CPU : 하나의 코어로 여러 명령어를 동시에 처리하는 CPU
    • cf. Intel : Hyper-threading(하이퍼스레딩)

소프트웨어적 스레드

하나의 프로그램에서 독립적으로 실행되는 단위

  • 하나의 프로그램이 실행되는 과정에서 한 부분만 실행될 수 있지만, 여러 부분이 동시에 실행될 수 있음

  • 예를 들어, 화면에 보여주는 기능/맞춤법 검사 기능/저장 기능을 동시에 수행되길 원한다면 기능을 작동시키는 코드를 각각의 스레드로 만들어 동시에 실행할 수 있음

멀티스레드 프로세서

하나의 코어로 여러 명령어를 동시에 처리하는 CPU

  • 레지스터 세트가 여러 개 있는 것임

  • 프로그램 입장에서는, 2코어 4스레드 CPU는 한 번에 하나의 명령어를 처리하는 CPU가 4개 있는 것 처럼 보임 → 하드웨어 스레드를 ‘논리 프로세서(logical processor)’라고도 함

 

  • 정리
    • 코어 : 명령어를 실행할 수 있는 ‘하드웨어 부품’
    • 스레드 : 명령어를 실행하는 단위
    • 멀티코어 프로세서 : 명령어를 실행할 수 있는 하드웨어 부품이 CPU 안에 2개 이상 있는 CPU
    • 멀티스레드 프로세서 : 하나의 코어로 여러 개의 명령어를 동시에 실행할 수 있는 CPU

 

 

2. 명령어 병렬 처리 기법

ILP(Instruction-Level Parallelism)

명령어 파이프라인

  • 클럭 단위의 명령어 처리 과정
    1. 명령어 인출(Instruction Fetch)
    2. 명령어 해석(Instruction Decode)
    3. 명령어 실행(Execute Instruction)
    4. 결과 저장(Write Back)
  • 명령어 처리 과정에서 같은 단계가 겹치지 않는다면, CPU는 각 단계를 동시에 실행할 수 있음
    • 즉, CPU가 한 명령어를 ‘인출’하는 동안 다른 명령어를 ‘실행’할 수 있음
    • 명령어를 겹쳐서 수행해 더 효율적으로 처리할 수 있음

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

 

파이프라인 위험(pipeline hazard)

파이프라이닝이 높은 성능을 가져오기는 하나, 특정 상황에서는 성능 향상에 실패하는 경우

 

데이터 위험(data hazard)

  • ‘데이터 의존성’에 의해 발생
  • 모든 명령어의 동시 처리는 불가능

▶ 데이터 위험 예시

  • 명령어 1을 수행해야 명령어 2를 수행할 수 있음
  • 명령어 2는 명령어 1의 데이터에 의존적임
  • 데이터 의존적인 두 명령어를 무작정 동시에 실행하려고 하면 파이프라인이 제대로 작동하지 않음

 

제어 위험(control hazard)

  • 주로 분기 등으로 인한 ‘프로그램 카운터의 갑작스러운 변화’
  • 기본적으로 PC는 ‘현재 실행 중인 명령어의 다음 주소’로 갱신되지만, 프로그램 실행 흐름이 바뀌어 명령어가 실행되면서 PC 값에 갑작스러운 변화가 생기면 명령어 파이프라인에 미리 가지고 와서 처리 중이었던 명령어들이 쓸모가 없어지는 상황

  • 분기 예측(branch prediction) : 프로그램이 어디로 분기할지 미리 예측한 후 그 주소를 인출하는 기술

 

구조적 위험(structural hazard)

  • 명령어들을 겹쳐 실행하는 과정에서 서로 다른 명령어가 동시에 ALU, 레지스터 등과 같은 CPU 부품을 사용하려고 할 때 발생
  • 자원 위험(resource hazard)라고도 함

 

 

슈퍼스칼라(superscalar)

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

  • 슈퍼스칼라 프로세서/슈퍼스칼라 CPU : 슈퍼스칼라 구조로 명령어 처리가 가능한 CPU
    • 매 클럭 주기마다 동시에 여러 명령어 인출/실행할 수 있어야 함
  • 이론적으로는 파이프라인 개수에 비래하여 프로그램 처리 속도가 빨라져야 하지만, 파이프라인 위험을 방지하기 위해 고도로 설계되어 있어야 함

 

 

비순차적 명령어 처리

OoOE(Out-of-order execution)

  • 명령어를 순차적으로만 실행하지 않고 순서를 바꿔 실행해도 무방한 명령어를 먼저 실행해 명령어 파이프라인이 멈추는 것을 방지하는 기법
  • 명령어들은 이따금씩 곧바로 처리되지 못하는 경우가 있고 모든 명령어들을 순차적으로만 처리한다면 예상치 못한 상황에서 명령어 파이프라인이 멈추게 되는 문제가 있음

▶ 비순차적 명령어 처리 예시

 

  • 그러나 아무 명령어나 순서를 바꿔서 수행할 수는 없음
    • 의존성이 없는 명령어의 순서를 바꾸어야 함

 

 

3. CISC와 RISC

명령어 집합

ISA; Instruction Set Architecture

  • 명령어 집합/명령어 집합 구조(ISA) : CPU가 이해할 수 있는 명령어들의 모음
    • CPU마다 ISA는 다를 수 있음
      • 인텔 CPU : x86, x86-64 ISA
      • 애플 CPU : ARM ISA
  • ISA가 다르면, 서로의 명령어를 이해X(명령어/어셈블리어도 다름)
    • 제어장치가 명령어를 해석하는 방식, 사용되는 레지스터 종류/개수, 메모리 관리 방법 등 많은 것이 달라짐
  • ISA는 CPU의 언어임과 동시에 CPU를 비롯한 하드웨어가 소프트웨어를 어떻게 이해할지에 대한 약속이라고도 볼 수 있음

 

CISC

Complex Instruction Set Computer

  • 복잡/다양한 명령어들을 활용하는 CPU 설계 방식
    • 예시 : x86, x86-64
  • 복잡/다양한 명령어 집합 활용 위해 가변 길이 명령어 활용
  • 복잡/다양한 기능을 제공해 적은 수의 명령으로 프로그램을 동작시키고 메모리를 절약할 수 있음
  • 그러나 복잡/다양한 기능을 제공해서 명령어 크기와 실행되기까지의 시간이 일정하지 않음

  • 복잡한 명령어 때문에 명령어를 실행하는 데 여러 클럭 주기를 필요로 함
  • 명령어 규격화가 어려워 파이프라이닝이 어려움
  • 대다수 복잡한 명령어의 사용 빈도는 낮음
  • CISC 기반 CPU는 성장에 한계가 있음

 

RISC

Reduced Instruction Set Computer

  • CISC의 한계가 가져온 의미

       1. 빠른 처리를 위해 명령어 파이프라인을 활용해야 함

          원활한 파이프라이닝을 위해 명령어 길이와 수행시간이 짧고 규격화되어 있어야 함

       2. 자주 쓰이는 명령어만 계속 쓸 것

           복잡한 기능을 지원하는 명령어를 추가하는 것보다 자주 쓰이는 기본적인 명령어를 작고 빠르게 만드는 것이 중요

  • RISC는 CISC에 비해 명령어 종류 적고, 짧고 규격화된 명령어, 되도록 1클럭 내외로 실행되는 명령어를 지향함 → 파이프라이닝 최적화
  • 고정 길이 명령어 활용
  • RISC의 load-store 구조 : 메모리에 직접 접근하는 명령어를 load, store 2개로 제한해 메모리 접근을 단순화함
  • 메모리 접근 단순화/최소화 대신, 레지스터를 활용함
    • CISC보다 레지스터를 이용한 연산이 많음
    • 일반적인 경우보다 범용 레지스터 개수도 더 많음
  • CISC보다 사용 가능한 명령어 개수가 적어, 많은 명령으로 프로그램을 작동시킴

 

CISC와 RISC의 차이 정리

CISC RISC
복잡/다양 명령어 단순/적은 명령어
가변 길이 명령어 고정 길이 명령어
다양한 주소 지정 방식 적은 주소 지정 방식
프로그램 이루는 명령어 수 적음 프로그램 이루는 명령어 수 많음
여러 클럭에 걸쳐 명령어 수행 1클럭 내외로 명령어 수행
파이프라이닝하기 어려움 파이프라이닝하기 쉬움

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.