크래프톤정글/혼공컴운

[혼공컴운] CH05 CPU 성능 향상 기법

아람2 2024. 10. 7. 10:05
반응형

CH05 CPU 성능 향상 기법

05-1 빠른 CPU 를 위한 설계 기법

 

CPU 의 속도를 빠르게 만들어보기

1) 컴퓨터 부품들은 '클럭 신호'에 맞춰 일사불란하게 움직인다

2) CPU 는 '명령어 사이클' 이라는 정해진 흐름에 맞춰 명령어들을 실행한다

 

클럭 신호가 빠르게 반복되면 CPU 를 비롯한 컴퓨터 부품들이

그만큼 빠른 박자게 맞춰 움직일까? -> 일반적으로는 YES 

다만 필요 이상으로 클럭을 높이면 발열이 심각해진다 

클럭 속도

* 클럭 속도 - 헤르츠 Hz 단위로 측정 

* 헤르츠 Hz - 1초에 클럭이 반복되는 횟수

클럭이 '똑-딱-' 하고 1초에 한 번 반복되면 1Hz

클럭이 1초에 100번 반복되면 100Hz 

코어 (Core)

현대적인 관점에서 "CPU" 라는 용어를 재해석해야 한다 

전통적으로 '명령어를 실행하는 부품'은 원칙적으로 하나만 존재하지만

오늘날 CPU 에는 '명령어를 실행하는 부품' 이 여러 개 존재한다

'명령어를 실행하는 부품' 을 코어라는 용어로 사용한다 

https://youtu.be/VO0RQAA7KYc?si=yLK8HIS77vEFxDY4
단, 코어 수에 비례하여 속도가 증가하지는 않는다

 

스레드 Thread - 실행 흐름의 단위 

하나의 프로그램을 독립적으로 동시에 실행하는 방법, 1코어 1스레드 CPU 도 여러 소프트웨어적 스레드를 만들 수 있다.
사진은 2코어 4스레드, 멀티 - 하나의 코어에서 여러 개의 명령을 동시에 처리할 수 있는 프로세서/ CPU
메모리 입장에서는 실제 프로세서 (코어) 의 개수는 모르지만, 명령어를 몇 개씩 가져오고 실행하는지만 느낀다

 

05-2 명령어 병렬 처리 기법 

명령어가 처리되는 과정을 비슷한 시간 간격으로 나누면

1) 명령어 인출 Instruction Fetch

2) 명령어 해석 Instruction Decode

3) 명령어 실행 Execute Instruction

4) 결과 저장 Write Back 

명령어 파이프라이닝 - 동시에 여러 개의 명령어를 겹쳐 실행하는 기법
파이프라인 위험 - 동시에 명령어를 처리할 수 없는 경우

데이터 위험

명령어 간의 의존성에 의해 야기, 모든 명령어를 동시에 처리할 수 없다

(이전 명령어를 끝까지 실행해야만 비로소 실행할 수 있는 경우)

명령어 1. R1 <- R2 + R3

명령어 2. R2 <- R1 + R5 

명령어 1에서 R1 이 계산된 이후에 명령어 2를 실행할 수 있다

제어 위험

프로그램 카운터의 갑작스러운 변화가 일어나는 상황, 

 

CPU 가 실행하고자 하는 메모리의 주소 번지가 갑자기 다른 특정 메모리 주소 번지로 실행의 흐름을 바꾸는 명령어를 받을 때 발생 (ex. JUMP, CALL, Interrupt)

실행 중인 흐름을 갑자기 다른 메모리 주소로 변경시켜 파이프라인에 있던 명령어를 무효화시키기 때문에 파이프라이닝의 성능이 저하될 수 있다 

구조적 위험

서로 다른 명령어가 같은 CPU 부품 (ALU, 레지스터) 을 쓰려고 할 때 발생 

 

슈퍼스칼라

CPU 내부에 여러 개의 명령어 파이프라인을 포함한 구조 - 오늘날의 멀티스레드 프로세서 

 

이론적으로는 파이프라인 개수에 비례하여 처리 속도가 증가하지만

파이프라인 위험도 증가로 인해, 파이프라인 개수에 비례하여 처리 속도가 증가하진 않는다 

 

비순차적인 명령어 처리

합법적인 새치기, 파이프라인의 중단을 방지하기 위해 명령어를 순차적으로 처리하지 않는 명령어 병렬 처리 기법

의존성이 없는 명령어들 간의 순서를 바꾸어 처리하는 방식 

 

05-3 명령어 집합 구조, CISC 와 RISC 

"CPU는 명령어를 실행한다" 

명령어 집합 (구조), ISA Instrunction Set Architecture

CPU 가 이해할 수 있는 명령어들의 모음, CPU 의 언어, 하드웨어가 소프트웨어를 어떻게 이해할지에 대한 약속 

명령어가 달라지만 명령어 해석 방식, 레지스터의 종류와 개수, 파이프라이닝의 용이성 등 많은 것들이 달라진다 

같은 소스 코드를 컴파일해도, CPU 마다 나오는 어셈블리어 (기계어) 종류가 다를 수 있다

 

CISC Complex Instruction Set Computer

복잡한 명령어 집합을 활용하는 컴퓨터/ CPU 

 

복잡하고 다양한 명령어, 명령어의 형태와 크기가 다양한 가변 길이 명령어를 활용 

다양하고 강력한 명령어를 활용하여 상대적으로 적은 수의 명령어로도 프로그램을 실행할 수 있다 

x86, x86-64 는 CISC 기반 명령어 집합 구조 

 

메모리를 최대한 아끼며 개발해야 했던 시절에는 인기가 높았으나 명령어 파이프라이닝이 불리하다는 치명적인 단점

명령어가 워낙 복잡하고 다양한 기능을 제공하는 탓에 명령어의 크기와 실행되기까지의 시간이 일정하지 않음 

복잡한 명령어 때문에 명령어 하나를 실행하는 데에 여러 클럭 주기 필요 

 

게다가, 대다수의 복잡한 명령어는 사용 빈도가 낮다 (20%의 단어가 80% 사용된다는 논문도 있다)

 

RISC Reduced Instruction Set Computer

명령어의 종류가 적고, 짧고 규격화된 명령어 사용, 단순하고 적은 수의 고정 길이 명령어 집합을 활용  

 

메모리 접근 (Load, Store) 최소화, 레지스터 십분 활용 -> CISC 에 비해 범용 레지스터 종류가 많은 경우가 많다 

다만 명령어 종류가 CISC 보다 적기 때문에 더 많은 명령어로 프로그램을 동작시킨다 

 

 + CISC 기반의 명령어 집합을 사용하는 CPU 제조 회사는 CISC 의 단점을 개선하려고 노력하고 있다 

CISC 가 실제로 실행될 때는 CPU 내부적으로, 명령어를 실행되는 단위로써 조금 더 잘게 쪼개어 (마이크로명령어) 실행하고 있다

명령어를 실행하는 그 동작 자체도 가급적 1 클럭 내로 잘게 쪼개서 실행하기 때문에 CPU 내부적으로는 RISC 처럼 사용한다 

반응형