빠른 CPU를 위한 설계 기법
클럭
앞서 컴퓨터 부품들은 '클럭 신호'에 맞춰 일사불란하게 움직이고, CPU는 '명령어 사이클'이라는 정해진 흐름에 맞춰 명령어들을 실행한다고 설명했습니다. 만약 클럭 신호가 빠르게 반복되면 CPU는 명령어 사이클을 더 빠르게 반복할 것이고, 다른 부품들도 그의 맞춰 더 빠르게 작동할 것입니다. 그래서 클럭 속도가 높은 CPU는 일반적으로 성능이 좋습니다.
* 클럭 속도는 헤르츠(Hz) 단위로 측정합니다. 이는 1초에 클럭이 몇번 반복되는지를 나타내며 1초에 한 번 반복되면 CPU 클럭 속도는 1Hz로 표현됩니다.
코어와 멀티코어
오늘날 CPU는 많은 기술적 발전을 거듭하였고 이전 CPU를 정의하는 '명령어를 실행하는 부품'을 CPU 내부에 얼마든지 만들 수 있게 되었습니다. 그래서 우리가 이전 CPU를 정의하는 것은 오늘날 코어라는 용어로 변모하였습니다.
코어를 여러 개 포함하고 있는 CPU를 멀티코어 CPU 또는 멀티코어 프로세서라고 부릅니다. 이는 CPU 내에 명령어를 처리하는 일꾼이 여러 명 있는 것과 같습니다. 그렇다고 코어 수가 지나치게 많아도 성능에 영향이 크게 없는 경우도 있습니다. 예를 들어 4인분의 도시락을 요리사 100명이서 만드는 것이 4명의 요리사가 만드는 것보다 특별히 더 빠르지 않는 것과 같습니다.
스레드와 멀티스레드
스레드의 사전적 의미는 '실행 흐름의 단위'입니다. 그러나 이 또한 CPU에서 사용되는 스레드와 프로그래밍에서 사용되는 스레드의 용례가 다르기에 활자 그대로 받아들이면 안됩니다.
하드웨어적 스레드
CPU에 사용되는 하드웨어적 스레드는 '하나의 코어가 동시에 처리하는 명령어 단위'를 의미합니다.
위 이미지처럼 하나의 코어로 여러 명령어를 동시에 처리하는 CPU를 멀티스레드 프로세서 또는 멀티스레드 CPU라고 합니다.
소프트웨어적 스레드
소프트웨어적 스레드는 '하나의 프로그램에서 독립적으로 실행되는 단위'를 의미합니다. 하나의 프로그램은 실행되는 과정에서 한 부분만 실행될 수도 있지만, 프로그램의 여러 부분이 동시에 실행될 수도 있습니다.
* 만약 우리가 하드웨어적 스레드와 소프트웨어적 스레드를 구분하지 않는다면, '1코어 1스레드 CPU가 여러 스레드로 만들어진 프로그램을 실행할 수 있다'는 말이 어려울 것입니다.
멀티스레드 프로세서
멀티스레드 프로세서 설계의 핵심은 레지스터입니다. 하나의 코어로 여러 명령어를 동시에 처리하도록 만들려면 프로그램 카운터, 스택 포인터, 메모리 버퍼 레지스터, 메모리 주소 레지스와 같이 하나의 명령어를 처리하기 위해 꼭 필요한 레지스터를 여러 개 가지고 있으면 됩니다.
위와 같이 이용하더라도 메모리 속 프로그램 입장에서 봤을 때 하드웨어 스레드는 마치 '한 번에 하나의 명령어를 처리하는 CPU' 즉, 코어나 다름없어 보입니다. 때문에 하드웨어 스레드를 논리 프로세서라고 부르기도 합니다.
명렁어 병렬 처리 기법
빠른 CPU를 위해서는 클럭 속도에 멀티코어, 멀티스레드를 지원하는 CPU를 만드는 것도 중요하지만 CPU가 놀지 않고 작동하게 만드는 것도 중요합니다.
명령어 파이프라인
명령어 파이프라인을 이해하려면 명령어 처리 과정이 클럭 단위로 나뉘어진다는 것을 이해하면 됩니다. 중요한 점은 같은 단계가 겹치지 않는다면 CPU는 '각 단계를 동시에 실행할 수 있다'는 것입니다.
이처럼 명령어들을 명령어 파이프라인에 넣고 동시에 처리하는 기법을 명령어 파이프라이닝이라고 합니다.
파이프라이닝이 높은 성능을 가져오기는 하지만 특정 상황에서는 성능 향상에 실패하는 경우도 있습니다. 이러한 상황을 파이프라인 위험이라고 부릅니다.
데이터 위험
파이프라인 위험의 하나로 데이터 위험은 데이터 의존성에 의해 발생합니다. 예를 들어, 명령어 2를 실행하기 위해서 명령어 1을 먼저 수행해야하는 경우 명령어 2는 명령어 1에 데이터 의존적이고 이를 무작정 동시에 실행하려고 하면 파이프라인이 제대로 작동하지 않을 수 있습니다. 이를 '데이터 위험'이라고 합니다.
제어 위험
제어 위험은 주로 분기 등으로 인한 '프로그램 카운터의 갑작스러운 변화'에 의해 발생합니다. 기본적으로 프로그램 카운터는 '현재 실행 중인 명령어의 다음 주소'로 갱신되지만 갑작스러운 프로그램 카운터 값의 변화가 생긴다면 미리 가져와 처리 중이었던 명령어들은 아무 쓸모가 없어집니다.
구조적 위험
구조적 위험은 명령어들을 겹처 실행하는 과정에서 서로 다른 명령어가 동시에 ALU, 레지스터 등과 같은 CPU 부품을 사용하려고 할 때 발생합니다. 자원 위험이라고도 부릅니다.
슈퍼스칼라
오늘날 대부분의 CPU에서는 단일 파이프라인이 아닌 여러 개의 파이프라인을 이용하며, CPU의 내부에 여러 개의 명령어 파이프라인을 포함한 구조를 슈퍼스칼라라고 합니다.
슈퍼스칼라 구조로 명령어 처리가 가능한 CPU를 슈퍼스칼라 프로세서 또는 슈퍼스칼라 CPU라고 합니다.
비순차적 명령어 처리
비순차적 명령어 처리는 보통 OoOE로 줄여 부릅니다. 위에서 설명한 기법은 모두 순차적인 처리를 상정한 방법이었으나 비순차적 명령어는 순서를 바꿔 실행해도 무방한 명령어를 먼저 실행하여 명령어 파이프 라인이 멈추는 것을 방지하는 기법입니다.
CISC와 RISC
명령어 집합
CPU가 이해할 수 있는 명령어들의 모음 즉, 명령어 집합 또는 명령어 집합 구조(이하 ISA)라고 합니다. ISA가 다르다는 건 CPU가 이해할 수 있는 명령어가 다르다는 뜻이고, 명령어가 달라지면 어셈블리어도 달라집니다.
앞서 배운 명령어 처리 기법들에서 적용하기에 용이한 ISA가 있고 그렇지 못한 ISA도 있습니다. 이러한 처리 기법들을 도입하기에 유리한 ISA로는 CISC와 RISC가 대표적입니다.
CISC
CISC는 Complex Instruction Set Computer의 약자로 '복잡한 명령어 집합을 활용하는 컴퓨터'를 의미합니다. CISC는 다양하고 강력한 기능의 명령어 집합을 활용하기 때문에 명령어의 형태와 크기가 다양한 가변 길이 명령어를 활용합니다.
다양하고 강력하다는 말은 상대적으로 적은 수의 명령어로도 프로그램을 실행할 수 있다는 것을 의미합니다만, 치명적인 단점이 있습니다. 워낙 다양하고 복잡한 기능을 제공하는 탓에 명령어의 크기와 실행되기까지의 시간이 일정하지 않습니다. 한마디로 규격화되지 않은 명령어가 파이프라이닝을 어렵게 만들고 이는 현대 CPU에서 아주 치명적인 약점입니다.
RISC
RISC는 위의 CISC의 단점을 보완하고자 등장하였습니다. RISC는 Reduced Instruction Set Computer의 약자로 CISC에 비해 명령어의 종류도 적고 CISC와 달리 규격화된 명령어, 되도록 1클럭 내외로 실행되는 명령어를 지향합니다. 즉, 고정 길이 명령어를 활용합니다.
RISC는 명령어가 규격화되어 있고, 1클럭 내외로 실행되기 때문에 RISC 명령어 집합은 명령어 파이프라이닝에 최적화되어 있습니다. 또한 RISC는 메모리에 직접 접근하는 명령어를 load, store 두 개로 제한할 만큼 메모리 접근을 단순화하고 최소화를 추구합니다.
CISC | RISC |
복잡하고 다양한 명령어 | 단순하고 적은 명령어 |
가변 길이 명령어 | 고정 길이 명령어 |
다양한 주소 지정 방식 | 적은 주소 지정 방식 |
프로그램을 이루는 명령어의 수가 적음 | 프로그램을 이루는 명령어의 수가 많음 |
여러 클럭에 걸쳐 명령어 수행 | 1클럭 내외로 명령어 수행 |
파이프라이닝하기 어려움 | 파이프라이닝하기 쉬움 |
'시리즈 > 컴퓨터 구조' 카테고리의 다른 글
[컴퓨터 구조] 입출력장치 (0) | 2025.02.03 |
---|---|
[컴퓨터 구조] 보조기억장치 (0) | 2025.02.02 |
[컴퓨터 구조] 메모리와 캐시 메모리 (1) | 2025.02.01 |
[컴퓨터 구조] 명령어에 대해 알아보기 (1) | 2025.01.24 |
[컴퓨터 구조] 컴퓨터 구조에 대해 알아보기 (0) | 2025.01.22 |