Search
🧸

CPU 성능 향상 기법

생성일
2023/08/05 03:25
태그
혼공컴구
컴퓨터 구조
날짜
3 more properties

학습 목표

빠른 CPU를 위한 설계 기법
빠른 CPU를 위한 명령어 병령 처리 기법
RISC와 CISC 차이

빠른 CPU를 위한 설계 기법

클럭

현재 아는 지식
컴퓨터 부품들은 클럭 신호에 맞춰 일사분란하게 움직인다
CPU는 명령어 사이클이라는 정해진 흐름에 맞춰 명령어를 실행한다
→ 클럭 속도가 높아지면 그만큼 명령어 사이클이 더 빠르게 반복된다 (속도의 단위)
→ 하지만 빠를수록 발열도 심해진다
→ Hz 단위로, 1초에 클럭이 몇 번 반복되는 지 나타냄
오버클럭킹 (Overclocking)
기본 클럭 속도(Base)와 최대 클럭 속도(Max)가 있다. 고성능을 요하는 순간에는 순간적으로 클럭을 높일 수도 있는데, 이러한 기법을 오버클럭킹이라고 한다

코어와 멀티코어

클럭을 올리는 대신 CPU의 코어와 스레드 수를 늘려서 성능 향상 가능

코어

우리가 지금까지 배운 CPU는 하나의 코어에 해당
오늘날의 CPU는 명령어를 실행하는 부룸을 여러 개 포함하는 부품으로 격상
멀티코어 CPU, 멀티코어 프로세서
코어를 여러 개 포함하고 있는 CPU

스레드와 멀티스레드

스레드

실행 흐름의 단위
하드웨어적 스레드: CPU에서 사용
소프트웨어적 스레드: 프로그램에서 사용

하드웨어적 스레드

하나의 코어가 동시에 처리하는 명령어 단위
지금까지 배운 건 1코어 1 스레드
2코어 4스레드
이처럼 여러 명령어를 동시에 처리하는 CPU를 멀티스레드 프로세서, 또는 멀티스레드 CPU

소프트웨어적 스레드

하나의 프로그램에서 독립적으로 실행되는 단위
예를 들어, 워드 프로세서 프로그램을 개발하는 경우
사용자로부터 입력 받은 내용을 화면에 보여 주는 기능
사용자가 입력한 내용이 맞춤법에 맞는지 검사하는 기능
사용자가 입력한 내용을 수시로 저장하는 기능
→ 각 기능을 수행하는 코드를 각각의 스레드로 만들면 동시에 실행 가능

멀티스레드 프로세서

지금 논하는 프로세서는 하드웨어적 스레드
용어의 혼란을 방지하기 위해
소프트웨어적 스레드 → 스레드
하드웨어적 스레드 → 하드웨어적 스레드
멀티스레드 프로세서를 설계하는 것은 매우 어렵다
하지만 가장 큰 핵심은 레지스터
하나의 코어로 여러 명령어를 동시에 처리하려면
프로그램 카운터
스택 포인터
데이터 버퍼 레지스터
데이터 주소 레지스터
등 하나의 명령어를 처리하기 위해 필요한 레지터를 여러 개 가지고 있어야한다
편의상, 하나의 명령어를 처리하기 위해 꼭 필요한 레지스터들 → 레지스터 세트
하나의 코어에서 두 개의 명령어가 동시에 실행가능하려면?
메모리 입장에서는 각각의 스레드가 하나의 코어처럼 느껴짐
하드웨어 스레드 = 논리 프로세서 (Loical Processor)

명령어 병렬 처리 기법

ILP, Instruction-Level Parallelism
시간을 알뜰하게 쓰면서 명령어들을 처리하는 방법
1.
명령어 파이프라이닝
2.
슈퍼스칼라
3.
비순차적 명령어 처리

명령어 파이프라인

명령어 처리 과정을 클럭 단위로 나누어 보면 일반적으로 다음과 같다
1.
명령어 인출, instruction fetch
2.
명령어 해석, instruction decode
3.
명령어 실행, execute instruction
4.
결과 저장, write back
→ 같은 단계가 겹치지만 않는다면 동시에 실행할 수 있다

파이프라인 위험

Pipleline Hazard
특정 상황에서는 성능 향상에 실패하는 경우도 있다
1.
데이터 위험
2.
제어 위험
3.
구조적 위험

데이터 위험

Data Hazard
명령어 간 데이터 의존성에 의해 발생
위의 경우 명령어 1을 수행해야만 명령어 2를 수행할 수 있다
동시에 수행되면 파이프라인이 제대로 작동하지 않을 것

제어 위험

Control Hazard
분기 등으로 인한 Program Counter의 갑작스러운 변화에 의해 발생
PC : 현재 실행 중인 명령어의 다음 주소 ← 흐름이 바뀌면서 갑작스런 변화?
명령어 파이프라인에 미리 가지고 와서 처리 중이던 명령어들은 아무 쓸모 없어진다
→ 그래서 등장한 기술이 바로 분기 예측 (Branch Prediction)

구조적 위험

Structural Hazard
겹쳐 실행하는 과정에서 서로 다른 명령어가 동시에 ALU, 레지스터 등과 같은 CPU 부품을 사용하려고 할 때 발생
자원 위험 (Resource Hazard)와 동치

슈퍼 스칼라

Superscalar
파이프라이닝은 단일 파이프라인으로도 구현이 가능
오늘날 대부분의 CPU → 여러 개의 파이프라인을 이용
슈퍼 스칼라 = 여러 개의 명령어 파이프라인을 포함한 구조
슈퍼스칼라 구조로 명령어 처리가 가능한 CPU
슈퍼스칼라 프로세서
슈퍼스칼라 CPU
파이프라인 위험을 방지하기 위해 고도로 설계

비순차적 명령어 처리

OoOE, Out-of-Order Execution
오늘날 CPU 성능 향상에 크게 기여한 기법, 대부분의 CPU가 차용
“합법적 새치기”

CISC와 RISC

명령어 파이프라이닝과 슈퍼스칼라 기법을 실제로 사용하려면
명령어가 파이프라이닝에 최적화되어 있어야 함
CPU가 인출하고 해석하고 실행하는 명령어가 파이프라이닝 하기 쉬워야

파이프라이닝 하기 쉬운 명령어란?

명령어가 어떻게 생겨야 파이프라이닝에 유리할까
CPU의 언어인 ISA와 각기 다른 성격의 ISA인 CISC와 RISC를 알아보자
Recall) 명령어

명령어 집합

Instruction Set, or, ISA, Instruction Set Architecture
명령어의 세세한 생김새
명령어로 할 수 있는 연산
주소 지정 방식 등등
→ CPU 제조사마다 차이가 있다
→ 명령어 집합: CPU가 이해할 수 있는 명령어들의 모음
→ ISA는 CPU의 언어인 셈
Set(구조) ?
CPU가 어떤 명령어를 이해하는지에 따라 컴퓨터 구조 및 설계 방식이 달라지므로 ‘구조’
제어장치가 명령어를 해석하는 방식, 사용되는 레지스터의 종류와 개수, 메모리 관리 방법 등등 …

CISC

Complex Instruction Set Computer
복잡한 명령어 집합을 활용하는 컴퓨터
여기서 컴퓨터 = CPU
다양하고 강력한 기능의 명령어 집합을 활용
형태와 크기가 다양한 가변 길이 명령어 활용
상대적으로 적은 수의 명령어로도 프로그램을 실행
실행 파일의 크기가 작다
CISC는 메모리를 최대한 아껴야 했던 시절에 인기가 높았다

단점

활용하는 명령어가 워낙 복잡함
복잡한 명령어 때문에 하나 실행할 때 여러 클럭 주기가 필요
수행 시간이 길고 제각각이라 파이프라인 구현에 큰 걸림돌
한 마디로, 규격화가 필요한 상황
대다수의 복잡한 명령어는 그 사용 빈도가 낮음
CISC 기반 CPU는 성장에 한계가 있다

RISC

Reduced Instruction Set Computer

CISC가 준 교훈

빠른 처리를 위해 명령어 파이프라인을 십분 활용해야 한다
원활한 파이프라이닝을 위해 “명령어 길이와 수행 시간이 짧고 규격화” 되어 있어야 한다
어차피 자주 쓰는 명령어만 줄곧 사용된다. 복잡한 기능을 지원하는 명령어를 추가하기보다는 자주 쓰이는 기본적인 명령어를 작고, 빠르게 만드는 것이 중요하다

RISC 특징

CISC에 비해 명령어 종류가 적다
CISC와 달리 짧고 규격화된 명령어를 지향
되도록 1클럭 내외로 처리되는 명령어 지향
고정된 길이 명령어 활용
특히, 메모리에 직접 접근하는 명령어를 load, store 두 개로 제한
메모리 접근을 단순화하고, 최소화를 추구
CISC보다 주소 지정 방식의 종류가 적은 경우가 많다
Load-Store 구조
그래서 RISC를 load-store 구조라고 부르기도 한다
메모리 접근을 단순화하는 대신, 레지스터를 적극 활용한다
CISC보다 레지스터를 이용하는 연산이 많다
범용 레지스터 개수도 더 많다
명령어 개수가 적기 때문에 더 많은 명령으로 프로그램을 작동시킨다