CPU 성능 향상 기법
CPU 성능을 높이기 위해서
클럭
클럭속도는 헤르츠(Hz)단위로 측정한다. 이는 1초에 클럭이 몇 번 반복되는지를 나타낸다.
클럭속도가 높은 CPU는 빠르게 동작한다. 하지만, 클럭속도를 무작정 높이게 되면 발열 문제가 심각해진다.
코어와 멀티코어
코어란 ? CPU내에서 명령어를 실행하는 부품으로 여러 개 있을 수 있다.
멀티코어 CPU 또는 멀티코어 프로세서란 ? 코어가 여러개 있는 것. 즉, CPU 내에 명령어를 처리하는 일꾼이 여러 명 있는 것이다.
하지만 이것도 마찬가지로 코어 수에 비례하여 속도가 증가하지 않는다.
만약 10명의 일꾼이 있는데(10개의 코어), 일해야할게 10개라면 각각 돌아가서 빠르게 처리되겠지만, 일해야할게 1개라면, 일꾼이 1명이거나 10명이거나 차이는 없을 것이다.
중요한 것은 코어마다 처리할 명령어들을 얼마나 적절하게 분배하느냐이고 그에 따라서 연산 속도는 크게 달라진다.
스레드와 멀티스레드
스레드(thread)의 사전적 의미는 '실행 흐름의 단위'이다. CPU에서 사용되는 스레드와 프로그래밍에서 사용되는 스레드는 의미가 다르다.
CPU에서 사용한 스레드 = 하드웨어적 스레드
프로그램에서 사용되는 스레드 = 소프트웨어적 스레드
하드웨어적 스레드
- 하나의 코어가 동시에 처리하는 명령어 단위
- 즉, 하나의 코어로도 여러 개의 명령어를 동시에 실행할 수 있다.
- 이처럼 하나의 코어로 여러 명령어를 동시에 처리하는 CPU를 멀티스레드 프로세서 또는 멀티스레드 CPU라고 한다.
멀티스레드 프로세서
- 가장 큰 핵심은 레지스터이다.
- 하나의 코어로 여러 명령어를 동시처리하기 위해서는 프로그램 카운터, 스택포인터, 데이터 버퍼 레지스터, 데이터 주소 레지스토와 같이 하나의 명령어를 처리하기 위해 꼭 필요한 레지스터를 여러개 가지고 있으면 된다.
- 논리 프로세서라고도 불린다.
소프트웨어적 스레드
- 하나의 프로그램에서 독립적으로 실행되는 단위
- 하나의 프로그램은 실행되는 과정에서 한 부분만 실행될 수도 있지만, 프로그램의 여러 부분이 동시에 실행될 수도 있다.
명령어 병렬 처리 기법
명령어 파이프 라인
- 명령어 처리 과정을 클럭 단위로 나누어 보면 일반적으로 명령어 인출, 명령어 해석, 명령어 실행, 결과 저장으로 이뤄진다.
- 같은 단계가 겹쳐지지만 않는다면 CPU는 '각 단계를 동시에 실행할 수 있다'는 것이다.
- 이처럼 마치 공장 생산 라인과 같이 명령어들을 명령어 파이프라인에 넣고 도시에 처리하는 기법을 명령어 파이프라이닝 이라고 한다.
- 만약 모든 명령어를 순차적으로만 처리한다면 비효율적일 것이다.
- 특정 상황에서 성능 향상에 실패하는 경우가 있다.
- 데이터 위험
- 명령어 간 데이터 의존성에 의해 발생한다.
- 모든 명령어를 동시에 처리할 수는 없다. 이전 명령어를 끝까지 실행해야 실행 할 수 있는 경우가 발생.
- 명령어 1 : R1 <- R2 + R3 / 명령어 2 : R4 <- R1 + R5
- 위와 같을 때, 명령어 1이 끝나지 않으면 명령어2에서 R1 값을 수행할 수 없다. 이처럼 명령어 2는 명령어 1의 데이터에 의존적이다.
- 이처럼 데이터 의존적인 두 명령어를 무작정 동시에 실행하려고 하면 파이프라인이 제대로 작동하지 않은 것을 '데이터 위험'이라고 한다.
- 제어 위험
- 분기 등으로 인한 '프로그램 카운터의 갑작스러운 변화'에 의해 발생한다.
- 기본적으로 프로그램 카운터는 현재 실행 중인 명령어의 다음 주소로 갱신된다.
- 하지만 프로그램 실행 흐름이 바뀌어 명령어가 실행되면서 프로그램 카운터 값에 갑작스러운 변화가 생기면 명령어 파이프라인에 미리 가지고 와서 처리 중이었던 명령어들은 아무 쓸모가 없어진다. 이를 제어 위험 이라고 한다.
- 구조적 위험
- 명령어들을 겹쳐 실행하는 과정에서 서로 다른 명령어가 동시에 ALU, 레지스터 등과 같은 CPU부품을 사용하려고 할 때 발생한다.
- 데이터 위험
슈퍼스칼라
오늘날 대부분의 CPU에서는 여러 개의 파이프라인을 이용한다. 이처럼 CPU 내부에 여러 개의 명령어 파이프라인을 포함한 구조를 슈퍼스칼라라고한다.
- 슈퍼스칼라 구조로 명령어 처리가 가능한 CPU를 슈퍼스칼라 프로세서 또는 슈퍼스칼라 CPU라고 한다.
- 가령 멀티스레드 프로세서는 한 번에 여러 명령어를 인출하고, 해석하고, 실행할 수 있기 때문에 슈퍼스칼라 구조를 사용할 수 있다.
- 하지만 파이프라인 개수에 비례하여 빨라지지는 않는다. 그래서 슈퍼스칼라 프로세서는 고도로 설계되어야 한다.
비순차적 명령어 처리
명령어를 순차적으로 실행하지 않는 기법이다.
예) 메모리 N번지는 M(N)으로, 메모리 N번지에 M을 저장하라는 M(N) | M으로 표기
1 | M(100) | 1 |
2 | M(101) | 2 |
3 | M(102) | M(100) + M(101) |
4 | M(150) | 1 |
5 | M(151) | 2 |
6 | M(152) | 3 |
- 3번 명령어를 실행하기 위해서는 1, 2번 명령어 실행이 끝날때까지 기다려야 한다.
- 순차적으로 실행되기 때문에 3, 4, 5, 6번의 명령어들은 기다려야 한다.
- 하지만 의존성이 전혀없는 4, 5, 6 번을 3번 앞으로 바꿀 수 있다. 그렇다면 순차적으로 명령어를 처리할 때보다 더 효율적으로 처리할 수 있다.
- 순서를 바꿔 실행해도 무방한 명령어를 먼저 실행하여 명령어 파이프라인이 멈추는 것을 방지하는 기법을 비순차적 명령어 처리 기법이라고 한다.
CISC와 RISC
CISC | RISC |
복잡하고 다양한 명령어 | 단순하고 적은 명령어 |
가변 길이 명령어 | 고정 길이 명령어 |
다양한 주소 지정 방식 | 적은 주소 지정 방식 |
프로그램을 이루는 명령어의 수가 적음 | 프로그램을 이루는 명령어의 수가 많음 |
여러 클럭에 걸쳐 명령어 수행 | 1클럭 내외로 명령어 수행 |
파이프라이닝하기 어려움 | 파이프라이닝하기 쉬움 |