5. CPU 성능 향상 기법
1. 빠른 CPU를 위한 설계 기법
클럭
클럭 속도가 빠르게 반복되면 CPU 를 비롯한 컴퓨터 부품들은 그만큼 빠른 박자에 맞춰 움직이게 된다. 즉, 클럭 속도가 높아지면 CPU 는 명령어 사이클을 더 빠르게 반복할 것이고 다른 부품도 그에 맞추어 더 빠르게 작동하게 된다.
실제로 클럭 속도가 높은 CPU 의 성능이 일반적으로 좋다.
하지만, 클럭 속도만 빠르다고 CPU 가 무조건적으로 빨라지는 것은 아니다. -> 클록 속도를 무작정 높이면 발열 문제가 더 심각해 진다. 이처럼 클럭 속도를 높이는 것은 CPU 를 빠르게 만들지만 클럭 속도 만으로 CPU 의 성능을 높이는데 한계가 있다.
코어와 멀티코어
CPU 의 의미인 '명령어를 실행하는 부품' 은 오늘날 '코어' 라는 용어로 사용된다.
코어는 명령어를 실행하는 부품(ALU, 제어장치, 레지스터) 을 모두 포함하고 있다.
코어를 여러개 포함하고 있는 CPU 를 멀티코어 CPU, 멀티코어 프로세서 라고 부른다.
코어의 수에 비례해서 CPU 가 무조건적으로 빨라지는 것은 아니다. -> 코어마다 처리할 연산이 적절하게 분배되지 않는다면, 코어 수에 비례하여 연산 속도가 증가하지 않는다. -> 또한 처리하고자 하는 작업량에 비해 코어 수가 지나치게 많아도 성능에는 크게 영향이 없다.
스레드와 멀티스레드
하드웨어 스레드 : 하나의 코어가 동시에 처리하는 명령어 단위 -> 하나의 코어로 여러개의 명령어를 동시에 처리하는 CPU 를 멀티스레드 CPU, 멀티스레드 프로세서 라고 부른다. -> 멀티스레드 CPU 는 ALU 와 제어장치가 두 개의 레지스터 세트에 저장된 명령어를 해석하고 실행한다.
소프트웨어 스레드 : 하나의 프로그램에서 독립적으로 실행되는 단위
멀티스레드 프로세서
멀티스레드 프로세서를 설계하는 일은 매우 복잡하지만, 가장 큰 핵심은 레지스터이다. -> 가령 프로그램 카운터를 2개 가지고 있다면, 메모리에 가져올 주소를 2개 저장할 수 있다.
코어 내에 하나의 레지스터 세트를 하드웨어 스레드라고 부른다.
하드웨어 스레드를 이용해 하나의 코어로도 여러 명령어를 동시에 처리할 수 있다고 했다. -> 메모리 속 프로그램 입장에서 하나의 하드웨어 스레드는 '한번에 하나의 명령어를 저장하는 스레드' 와 차이가 없다.
때문에, 하드웨어 스레드를 논리 프로세서 라고 부르기도 한다.
2. 명령어 병렬 처리 기법
순차적 명령어 처리 기법
명령어 파이프라인
명령어 처리 과정을 클럭 단위로 나누어 보면 다음과 같이 나눌 수 있다.
명령어 인출
명령어 해석
명령어 실행
결과 저장
중요한 점은 같은 단계가 겹치지 않는다면, CPU 는 각 단계를 동시에 처리할 수 있다는 것이다.
이처럼 마치 공장 생산 라인과 같은 명령어들을 명령어 파이프라인 이라고 한다.
명령어 파이프라인의 위험
데이터 위험 : 데이터에 의존적인 서로 다른 명령어를 동시에 실행하려고 하면, 데이터가 꼬이게 되는 케이스
제어 위험 : 주로 분기로 인한 프로그램 카운터의 갑작스러운 변화 -> 프로그램 카운터가 변하게 되면, 기존에 명령어 파이프라인에서 처리중이던 명령어들이 쓸모 없어진다.
구조적 위험 : 명령어들이 겹쳐 실행하는 과정에서 ALU, 레지스터 등과 같은 CPU 부품을 사용하려 할 때
슈퍼스칼라
슈퍼스칼라 : CPU 내부에 여러 개의 명령어 파이프라인을 포함한 구조
슈퍼스칼라 구조로 명령어 처리가 가능한 CPU 를 슈퍼스칼라 CPU, 슈퍼스칼라 프로세서 라고 부른다.
슈퍼스칼라 프로세서는 이론적으로는 파이프라인의 갯수와 비례해 성능이 증가하지만 그만큼 복잡도가 높아져, 고도로 설계되어야 한다.
비순차적 명령어 처리
순차적 처리 기법은 이전 명령어 실행이 끝나기 전까지 기다려야만 한다.
반대로 비순차적 명령어 처리 방법은 비동기로 처리해 파이프라인이 멈추는 것을 방지한 기법이다.
3. CISC, RISC
명령어 집합
CPU 가 이해할 수 있는 명령어들의 모음을 명령어 집합, 명령어 집합 구조(ISA) 라고 말한다. -> CPU 마다 ISA 가 다를 수 있다. -> ISA 는 CPU 의 언어이다. -> 동시에 CPU 를 비롯한 하드웨어가 소프트웨어를 어떻게 이해 할지에 대한 약속
명령어(ISA) 가 달라지면 어셈블리어(CPU 와 1:1 로 대응하는 저급언어) 도 달라진다.
ISA 가 달라지면 나비효과 처럼 많은 것이 달라진다. -> 명령어 해석 방식, 사용되는 레지스터의 종류와 갯수, 메모리 관리 방법 등..
CISC
CISC 는 복잡하고 다양한 명령어들을 활용하는 CPU 설계 방식으로, 가변 길이 명령어를 사용한다.
장점 : 어셈블리어 코드가 짧아서 메모리를 최대한 아끼며 개발해야 했던 시기에 유행했다.
단점 : 명령어가 워낙 다양하고, 복잡해 명령어의 크기와 실행되기까지의 시간이 일정하지 않다. -> 명령어 처리 시간은 가급적 1클럭으로 일정해야 한다. -> 클럭이 일정하지 않다는 것은 파이프라인이 효율적으로 작동하지 않는다는 것을 의미한다.
RISC
CISC 의 한계점
빠른 처리를 위해서, 명령어 파이프라인을 십분 활용해야 하고, 원활한 파이프라이닝을 위해 '명령어의 길이와 수행 시간이 짧고 규격화' 되어 있어야 한다.
어차피 자주 쓰이는 명령어만 줄 곧 사용되기 때문에, 복잡한 기능을 지원하는 명령어를 추가하기보다 '자주 쓰이는 기본적인 명령어를 작고 빠르게 만드는 것' 이 중요하다.
RISC
RISC 는 CISC 에 비해 명령어의 종류가 적고, 짧고 규격화 된 명령어(되도록 1클럭 내외)를 지향한다.
고정 길이 명령어를 활용한다.
RISC 는 메모리 접근을 단순화, 최소화하는 대신 레지스터를 적극 활용한다. -> 그렇기에 CISC 보다 레지스터를 이용하는 연산이 많고, 일반적인 경우보다 범용 레지스터의 경우도 많다. -> 반대로 사용 가능한 명령어 개수가 CISC 보다 적기 때문에, RISC 는 CISC 보다 많은 명령으로 프로그램을 작동시킨다.
Last updated