Chapter 5. CPU 성능 향상 기법
CPU 속도와 관련된 개념들은 클럭, 코어, 스레드 등이 있다.
클럭
컴퓨터 부품들은 ‘클럭 신호’에 맞춰 움직이기 때문에 일반적으로, 클록 속도가 높을수록 CPU의 성능이 좋다. 이때 클럭 속도는 Hz 단위로 측정한다. 하지만 클럭 속도를 무작정 높일 경우 발열 문제가 발생하기 때문에 한계가 있다.
코어와 멀티 코어
CPU 내에서 명령어를 실행하는 부품으로 여러 개 있을 수 있다. 코어 수에 따라 싱글코어, 듀얼코어 등으로 불리며 코어가 여러 개일 경우 멀티코어 CPU 또는 멀티코어 프로세서라고 부른다.
그러나 코어 수를 두 개, 세 개 늘린다고 연산 속도가 두 배, 세 배 빨라지진 않는다.
스레드와 멀티 스레드
스레드는 크게 CPU에서 사용되는 하드웨어적 스레드가 있고, 프로그램에서 사용되는 소프트웨어적 스레드가 있다.
하드웨어적 스레드
하나의 코어가 동시에 처리하는 명령어의 단위를 의미하며 여러 스레드를 지원하는 CPU는 하나의 코어로도 여러 개의 명령어를 동시에 실행할 수 있다. 이와 같이 하나의 코어로 여러 명령어를 동시에 처리하는 CPU를 멀티스레드 프로세서 또는 멀티스레드 CPU라 한다.
소프트웨어적 스레드
하나의 프로그램에서 독립적으로 실행되는 단위를 의미하며 프로그래밍 언어나 운영체제에서 말하는 스레드는 이를 말한다. 즉, 사용자로부터 입력을 받아 화면에 보여주는 기능과 사용자가 입력한 내용을 수시로 저장하는 기능 이 두 가지의 기능을 각각의 스레드로 만들면 동시에 실행할 수 있다.
멀티스레드 프로세서를 설계하기 위한 핵심은 레지스터이다. 하나의 명령어를 처리하기 위한 레지스터들을 여러 개 가지도록 설계하면 되는 것이다.
명령어 병렬 처리 기법
명령어를 동시에 처리하여 CPU를 끊임없이 작동시키는 기법을 명령어 병렬 처리 기법(ILP; Instruction-Level Parallelism)이라 한다. 대표적으로는 명령어 파이프라이닝, 슈퍼스칼라, 비순차석 명령어 처리가 있다.
명령어 파이프라인
명령어 처리 과정을 클럭 단위로 나누어 보면 다음과 같다.
- 명령어 인출(Instruction Fetch)
- 명령어 해석(Instruction Decode)
- 명령어 실행(Execute Instruction)
- 결과 저장(Write Back)
이때, 중요한 점은 아래의 그림과 같이 CPU는 같은 단계가 겹치지만 않는다면 각 단계를 동시에 실행할 수 있다는 것이다.
이처럼 공장 생산 라인과 같이 명령어들을 명령어 파이프라인에 넣고 동시에 처리하는 기법을 명령어 파이프라이닝이라고 한다. 이는 높은 성능을 가져지만, 성능 향상에 실패하는 파이프라인 위험 상황도 있다. 여기에는 크게 세 가지 위험이 있다.
데이터 위험(data hazard)
명령어 간 데이터 의존성에 의해 발생한다.
예를 들어 A 명령어의 결과값을 이용해 B 명령어를 수행할 때, 파이프라이닝 기법에 의하면 A 명령어가 아직 완료되지 않았는데 B 명령어를 동시에 수행하게 되는 상황을 말한다.
제어 위험(control hazard)
주로 분기 등으로 인한 ‘프로그램 카운터의 갑작스러운 변화’에 의해 발생한다.
일반적으로 프로그램 카운터는 현재 실행 중인 명령어의 다음 주소로 갱신되지만, 프로그램의 실행 흐름이 바뀌어 명령어가 실행되면서 프로그램 카운터 값이 변경된다면 명령어 파이프라인에 미리 가지고 와서 처리 중이었던 명령어들은 아무 쓸모가 없어지는 상황을 말한다. 이는 분기 예측(branch prediction)을 통해 프로그램이 어디로 분기할지 미리 예측한 후 그 주소를 인출하는 방식으로 완화할 수 있다.
구조적 위험(structural hazard)
명령어들을 겹쳐 실행하는 과정에서 서로 다른 명령어가 동시에 ALU나 레지스터와 같은 CPU 부품을 사용하려고 할 때 발생한다. 이는 자원 위험(resource hazard)이라고도 부른다.
슈퍼스칼라
파이프라이닝은 단일로도 구현이 가능하지만 오늘날의 대부분의 CPU에서는 여러 개의 파이프라인을 사용한다. 이처럼 CPU 내부에 여러 개의 명령어 파이프라인을 포함한 구조를 슈퍼스칼라(superscalar)라고 한다. 또한, 슈퍼스칼라 구조로 명령어 처리가 가능한 CPU를 슈퍼스칼라 프로세서 또는 슈퍼스칼라 CPU라고 한다.
비순차적 명령어 처리
파이프라인의 중단을 방지하기 위해 명령어를 순차적으로 처리하지 않는 명령어 병렬 처리 기법으로, 다음 그림과 같다.
위의 그림에서 3번 명령을 수행하기 위해서는 1,2번 명령 수행이 완료되어야만 한다. 하지만 아래와 같이 3번 명령어를 뒤로 미루어 수행한다면 기다릴 필요 없이 명령어를 병렬적으로 처리할 수 있게 된다.
CISC와 RISC
CPU가 이해할 수 있는 명령어들의 모음을 명령어 집합 또는 명령어 집합 구조(ISA; Instruction Set Architecture)라 한다. 이는 CPU마다 다를 수 있다.
그중 가장 대표적인 ISA는 두 가지가 있다.
CISC(Complex Instruction Set Computer)
다양하고 강력한 기능의 명령어 집합을 활용하는 ISA로, 명령어의 형태와 크기가 다양한 가변 길이 명령어를 활용한다. 명령어가 다양하기 때문에 적은 수의 명령어로도 프로그램을 수행할 수 있다. 따라서, 메모리 측면에서 장점이 있다. 그러나 명령어가 워낙 복잡하고 다양하기 때문에 명령어의 크기와 실행되기까지의 시간이 일정하지 않고, 명령어 하나를 실행하는 데에 여러 클럭 주기를 필요로 한다. 이는 아래와 같이 명령어 파이프라인을 구현하는 데에 불리하다.
RISC(Reduced Instruction Set Computer)
고정 길이 명령어를 사용하며, 되도록 1 클럭 내외로 실행되는 명령어를 지향하는 ISA이다. 따라서, 명령어 파이프라이닝에 최적화되어 있다.
참고 자료:
강민철. 『혼자 공부하는 컴퓨터 구조 + 운영체제』. 한빛미디어, 2022.