05-1. 빠른 CPU를 위한 설계 기법
클럭
- 클럭 신호가 높아지면 CPU는 명령어 사이클을 더 빠르게 반복할 것임
- 다른 부품들도 그에 발맞춰 더 빠르게 작동함
- 실제로 클럭 속도가 높은 CPU는 일반적으로 성능이 좋기에 클럭속도는 CPU 속도 단위로 간주되기도 함
- 클럭 속도는 헤르츠(Hz) 단위로 측정함
- 이는 1초에 클럭이 몇 번 반복되는지를 나타냄
- 예를 들어 클럭아 똑-딱- 하고 1초에 한번 반복되면 CPU 클럭속도는 1Hz이고, 100번 반복되면 100Hz 임
- CPU의 기본속도가 2.5GHz, 최고 속도가 4.9GHz 라면 1초에 25억(2.5x10의 9승), 순간적으로는 최대 49억번(4.9x10의 9승)번 반복되는 것을 나타냄
- 오버플로킹은 CPU가 고성능을 요하는 순간에는 순간으로 클럭을 높이고 그렇지 않을 때 낮추는 것을 이야기함
코어와 멀티코어
- 클럭속도를 높이는 거 외에 CPU 성능을 높이는 방법으로는 코어와 스레드 수를 늘리는 방법이 있음
- 코어는 명령어를 실행하는 부품이라는 의미
- 명령어를 실행하는 부품을 여러개 포함하는 부품으로 명령어 범위가 확장됨
- 코어를 여러 개 포함하고 있는 CPU를 멀티코어 CPU 또는 멀티코어 프로세서라고 부름
- 이는 CPU 내에 명령어를 처리하는 일꾼이 여러 명 있는 것과 같음
코어 수 | 프로세서 명칭 |
1 | 싱글코어(single-core) |
2 | 듀얼코어(dual-core) |
3 | 트리플코어(triple-core) |
4 | 쿼드코어(quad-core) |
6 | 헥사코어(hexa-core) |
8 | 옥타코어(octa-core) |
10 | 데카코어(deca-core) |
12 | 도데카코어(dodeca-core) |
여기서 잠깐!!
Q : 코어를 두 개, 세 개, 100개로 늘리면 연산 처리 속도도 두 배, 세 배, 100배로 빨라지나요?
A : 안타깝게도 CPU의 연산 속도가 꼭 코어 수에 비례하여 증가하지 x
스레드와 멀티스레드
- 스레드의 사전적 의미는 실행 흐름의 단위임
- 스레드에는 CPU에 사용되는 하드웨어적 스레드가 있고, 프로그램에서 사용되는 소프트웨어적 스레드가 있음
하드웨어적 스레드
- 여러 쓰레드를 지원하는 CPU는 하나의 코어로도 여러 개의 명령어를 동시에 실행 할 수 있음
- 예를 들어 2코어 4스레드 CPU는 명령어를 실행하는 부품을 두 개 포함하고, 한 번에 네 개의 명령어를 처리할 수 있는 CPU를 의미
- 이 처럼 하나의 코어로 여러 명령어를 동시에 처리하는 CPU를 멀티스레드 프로세서 또는 멀티스레드 CPU라고 함
- 하이퍼스레딩이라는 용어는 인텔에서 만든 멀티스레드 기술을 의미함
소프트웨어적 스레드
- 하나의 코어가 동시에 처리되는 명령어 단위를 의미
- 한 번에 하나씩 명령어를 처리하는 1코어 1스레드 CPU도 소프트웨어적 스레드를 수십 개 실행 가능
멀티스레드 프로세서
- 실제로 설계하는 일은 매우 복잡하지만 가장 큰 핵심은 레지스터임
- 하나의 코어로 여러 명령어를 동시에 처리하려면 프로그램 카운터, 스택 포인터, 데이터 버퍼 레지스터, 데이터 주소 레지스터 등이 필요
- 논리 프로세서는 2코어 4스레드 CPU는 한 번에 네 개의 명령어를 처리할 수 있는데, 프로그램 입장에서 봤을땐 한 번에 하나의 명령어를 처리하는 CPU가 4개 있는 것처럼 보이는 것
05-2. 명령어 병렬 처리 기법
명령어 파이프라인
- 명령어 파이프라인을 이해하려면 하나의 명령어가 처리되는 전체 과정을 비슷한 시간 간격으로 나누어 보아야 함
- 여기서 중요한 것은 같은 단계가 겹치지만 않는다면 CPU는 각 단계를 동시에 실행할 수 있음
- 명령어 인출(Instruction Fetch)
- 명령어 해석(Instruction Decode)
- 명령어 실행(Execute Instruction)
- 결과 저장(Write Back)
- 예를 들어 CPU는 한 명령어를 인출하는 동안에 다른 명령어를 실행할 수 있고 한 명령어가 실행되는 동안에 연산결과를 저장 할 수 있음
- 명령어 파이프라인은 공장 생산 라인 같이 명령어들을 말하고 동시에 처리하는 기법을 명령어 파이프 라이닝 이라고 함
- 특정 상황에서는 성능 향상에 실패하는 경우도 있는데 이를 파이프라인 위험이라고 함
- 파이프라인 위험에는 크게 데이터 위험, 제어 위험, 구조적 위험이 있음
데이터 위험
- 명령어 간 데이터 의존성에 의해 발생함
- 모든 명령어를 동시에 처리 x
- 어떤 명령어는 이전 명령어를 끝까지 실행해야만 비로소 실행할 수 있는 경우가 있음
제어 위험
- 주로 분기 등으로 인한 프로그램 카운터의 갑작스러운 변화에 의해 발생함
- 기본적인 프로그램 카운터는 현재 실행 중인 명령어의 다음 주소로 갱신됨
- 분기 예측은 프로그램이 어디로 분기할지 미리 예측한 후 그 주소를 인출하는 기술임
구조적 위험
- 명령어들을 겹쳐 실행하는 과정에서 서로 다른 명령어가 동시에 ALU, 레지스터와 같은 CPU 부품을 사용하려고 할때 발생함
- 구조적 위험은 자원 위험이라고도 부름
슈퍼스칼라
- CPU 내부에 여러 개의 명령어 파이프라인을 포함한 구조
- 슈퍼스칼라 구조로 명령어 처리가 가능한 CPU를 슈퍼스칼라 프로세서 또는 슈퍼스칼라 CPU라고 함
- 슈퍼스칼라 프로세서는 매 클럭 주기마다 동시에 여러 명령어를 인출하거나 실행할 수도 있어야 함
- 이론적으로 파이프라인 개수에 비례하여 프로그램 처리 속도가 빨라짐
- 하지만 파이프라인 등의 위험 문제가 있어 실제로는 반드시 파이프라인 개수에 비례하여 빨라지지는 않음
비순차적 명령어 방식
- 명령어들을 순차적으로 실행하지 않는 기법
- 파이프라인 위험과 같은 예상치 못한 문제들로 인해 이따금씩 명령어는 곧바로 처리되지 못함
- 명령어를 순차적으로 실행하지 않고 순서를 바꿔 실행해도 무방한 명령어를 먼저 실행하여 명령어 파이프라인이 멈추는 것을 방지함
05-3. CISC와 RISC
명령어 집합
- CPU가 이해할 수 있는 명령어의 모음을 명령어 집합 또는 명령어 집합 구조라고 함
- 즉 CPU마다 ISA가 다를 수도 있음
- 인텔의 노트북 CPU는 x86 혹은 x86-64 ISA를 이해하고 애플의 아이폰 CPU는 ARM ISA를 이해함
- x86(x86-64)과 ARM은 다른 ISA 이기 때문에 인텔 CPU를 사용하는 컴퓨터와 아이폰의 명령어는 서로 이해 못함
- 같은 소스로 만들어진 프로그램 일지라도 ISA가 다르면 CPU가 이해할 수 있는 명령어도 어셈블리어도 달라짐
- ISA가 같은 CPU 끼리는 서로의 명령어를 이해 할 수 있지만, ISA가 다르면 서로의 명령어를 이해하지 x
- ISA는 CPU의 언어임과 동시에 CPU를 비롯한 하드웨어가 소프트웨어를 어떻게 이해할지에 대한 약속이라고 볼 수 있음
CISC
- Complex Instruction Set Computer의 약자
- 이를 해석하면 복잡한 명령어 집합을 활용하는 컴퓨터를 의미함
- CISC란 이름 그대로 복잡하고 다양한 명령어를 활용하는 CPU 설계 방식임
- x86, x86-64는 대표적인 CISC 기반의 ISA임
- CISC는 다양하고 강력한 기능의 명령어 집합을 활용하기 때문에 명령어의 크기가 다양한 가변 길이 명령어를 사용
- 메모리에 접근하는 주소 지정 방식도 다양해서 아주 특별한 상황에서만 사용되는 독특한 주소 지정 방식도 있음
- 상대적으로 적은 수의 명령어로도 프로그램을 실행시킬 수 있음
- 이로 인해서 메모리 공간을 절약할 수 있는 장점이 있음
- 하지만 단점으로는 활용하는 명령어가 워낙 복잡하고 다양한 기능을 제공하는 탓에 명령어 크기와 실행되기 까지 시간 일정 x
- 복잡한 명령어 때문에 명령어 하나를 실행하는 데에 여러 클럭 주기를 필요
- 그리고 대다수의 복잡한 명령어는 그 사용빈도가 낮음
RISC
- Reduced Instruction Set Computer의 약자
- 이름처럼 CISC에 비해 명령어의 종류가 적음
- CISC와는 달리 짧고 규격화된 명령어, 되도록 1클럭 내외로 실행되는 명령어를 지향함
- 즉 고정 길이 명령어를 활용
- RISC는 메모리에 직접 접근하는 명령어를 load,store 두 개로 제한할 만큼 메모리 접근을 단순화하고 최소화를 추구함
CISC와 RISC 비교
CISC | RISC |
복잡하고 다양한 명령어 | 단순하고 적은 명령어 |
가변 길이 명령어 | 고정 길이 명령어 |
다양한 주소 지정 방식 | 적은 주소 지정 방식 |
프로그램을 이루는 명령어 수가 적음 | 프로그램을 이루는 명령어 수가 많음 |
여러 클럭에 걸쳐 명령어 수행 | 1클럭 내외로 명령어 수행 |
파이프라이닝 하기 어려움 | 파이프라이닝 하기 쉬움 |
'공부 기록일지' 카테고리의 다른 글
유성이의 공부일지(7) - 혼자공부하는 컴퓨터 구조 + 운영체제 7장 (0) | 2024.07.07 |
---|---|
유성이의 공부일지(6) - 혼자공부하는 컴퓨터 구조 + 운영체제 6장 (0) | 2024.07.06 |
유성이의 공부일지(4) - 혼자공부하는 컴퓨터 구조 + 운영체제 4장 (0) | 2024.07.03 |
유성이의 공부일지(3) - 혼자공부하는 컴퓨터 구조 + 운영체제 3장 (0) | 2024.07.02 |
유성이의 공부일지(2) - 혼자공부하는 컴퓨터 구조 + 운영체제 2장 (0) | 2024.07.01 |