Programming/Computer Science

[혼공학습단 9기] 혼.공.컴.운. - 5. CPU 성능 향상 기법 (미션 포함)

리버김 2023. 1. 15.

# 선택 미션

CH. 05(05-1) 코어와 스레드, 멀티 코어와 멀티 스레드의 개념을 정리하기

05-1 빠른 CPU를 위한 설계 기법

클럭, 멀티코어, 멀티 스레드가 각각 무엇인지 알아보고, 이들이 CPU 속도와 어떤 관계가 있는지 학습한다.

클럭

  1. 컴퓨터 부품들은 '클럭 신호'에 맞춰 일사불란하게 움직인다.
  2. CPU는 '명령어 사이클'이라는 정해진 흐름에 맞춰 명령어들을 실행한다.

즉, 클럭 속도가 높아지면 CPU는 명령어 사이클을 더 빠르게 반복할 것이고, 이는 곧 성능이 좋다는 것을 의미한다.

그래서 클럭 속도는 CPU 속도 단위로 간주되기도 한다.

 

클럭 속도

헤르츠(Hz) 단위로 측정. 1초에 클럭이 몇 번 반복되는지를 나타냄.

 

예: 2.5GHz의 경우, 1초에 클럭이 25억(2.5 X 10^9)번 반복되는 것을 의미한다.

클럭 속도는 항상 일정하지 않으며, 고성능이 요구되는 순간에는 CPU가 순간적으로 클럭 속도를 높인다. 최대 클럭 속도 이상으로 끌어올리는 기법은 오버클럭킹이라고 한다.

 

코어와 멀티코어

클럭 속도를 높이는 방법 외에 CPU의 성능을 높이는 방법에는 대표적으로 CPU와 '코어'와 '스레드' 수를 늘리는 것이 있다.

코어

명령어를 실행하는 부품(이전에 배운 CPU의 의미를 가져 온다. '8코어' CPU라면, 명령어를 실행하는 부품을 여덟 개 포함하고 있다고 보면 된다.)

멀티 코어

코어를 여러 개 포함하는 CPU를 멀티코어 CPU 또는 멀티코어 프로세서라고 한다. 멀티코어 CPU는 코어가 몇 개 포함되어 있는지에 따라 싱글코어, 듀얼코어, 트리플코어... 도데카코어(12) 등으로 나뉜다.

 

그러나 코어를 늘린다고 해서 CPU 속도가 그와 비례하여 증가하지는 않는다. 중요한 것은 코어마다 처리할 명령어들을 적절히 분배하는 것이다,

 

스레드와 멀티스레드

스레드

'실행 흐름의 단위'다. 그러나 보다 엄밀하게 이해할 필요가 있다.

 

[하드웨어적 스레드: CPU에서 사용하는 개념]

 

'하나의 코어가 동시에 처리하는 명령어 단위'

 

여태까지 이해한 CPU는 1코어 1스레드 CPU로, 한 번에 하나씩 명령어를 실행했다.

그러나 여러 스레드를 지원하는 CPU는 하나의 코어로도 여러 개의 명령어를 실행할 수 있다. 이를 멀티스레드 프로세서 또는 멀티스레드 CPU라고 한다. 참고로 인텔의 멀티스레드 기술은 '하이퍼스레딩'이라는 이름을 갖고 있다.

 

[소프트웨어적 스레드: 프로그램에서 사용하는 개념]

 

'하나의 프로그램에서 독립적으로 실행되는 단위'

 

여러 기능들을 작동시키는 코드를 각각의 스레드로 만들면 동시에 실행할 수 있다. Python, Java, C++ 등의 프로그래밍 언어를 이용해 소프트웨어적 스레드를 만들 수 있다.

 

* 앞으로 소프트웨어적 스레드는 '스레드, CPU에서 사용되는 스레드는 '하드웨어 스레드'라고 칭한다.

 

[멀티스레드 프로세서]

 

멀티스레드 프로세서가 하나의 코어로 여러 명령어를 동시에 처리할 수 있도록 하는 핵심은 레지스터다. 

 

프로그램 카운터, 스택 포인터, 데이터 버퍼 레지스터, 데이터 주소 레지스터와 같이 하나의 명령어를 처리하기 위해 꼭 필요한 레지스터를 여러 개 가지고 있으면 된다. 그래서 만약 각 코어에 레지스터 세트가 두 개씩 있는 코어가 두 개인 CPU는 한 번에 네 개의 명령어를 처리할 수 있는 거다.

 

프로그램 입장에서 봤을 때는 한 번에 하나의 명령어를 처리하는 CPU가 네 개 있는 것처럼 보여 하드웨어 스레드를 '논리 프로세서'라고 부르기도 한다. 이는 작업 관리자 성능 탭의 CPU 항목에서 확인할 수 있다.

 

정리하면

코어: 명령어를 실행할 수 있는 '하드웨어 부품'

스레드: '명령어를 실행하는 단위'

멀티코어 프로세서: '명령어를 실행할 수 있는 하드웨어 부품이 CPU 안에 두 개 이상 있는 CPU

멀티스레드 프로세서: 하나의 코어를 여러 개의 명령어를 동시에 실행할 수 있는 CPU

 

05-2 명령어 병렬 처리 기법

명령어를 동시에 처리하여 CPU를 한시도 쉬지 않고 작동시키는 기법인 명령어 병렬 처리 기법(명령어 파이프라이닝, 슈퍼스칼라, 비순차적 명령어 처리)을 알아보자.

명령어 파이프라인

명령어 처리 과정을 클럭 단위로 나누어 보면 이렇다.

 

  1. 명령어 인출
  2. 명령어 해석
  3. 명령어 실행
  4. 결과 저장

중요한 점은 같은 단계가 겹치지만 않는다면 CPU는 각 단계를 동시에 실행할 수 있다는 것이다. 예를 들어 CPU는 한 명령어를 '인출'하는 동안에 다른 명령어를 '실행'할 수 있고, 한 명령어가 '실행'되는 동안에 연산 결과를 '저장'할 수 있다.

 

명령어 파이프라이닝: 공장 생산 라인과 같이 명령어들을 명령어 파이프라인에 넣고 동시에 처리하는 기법

 

파이프라인 위험: 파이프라이닝이 높은 성능을 가져오는 데 실패하는 경우

 

데이터 위험

데이터 위험은 명령어 간 '데이터 의존성'에 의해 발생한다. 데이터 의존적인 두 명령어를 동시에 실행하려고 하면 파이프라인이 제대로 작동하지 않는 것을 데이터 위험이라고 한다.

 

제어 위험

분기 등으로 인한 '프로그램 카운터의 갑작스러운 변화'에 의해 발생한다. 이를 위해 분기 예측이라는 기술을 활용하는데, 프로그램이 어디로 분기할지 미리 예측한 후 그 주소를 인출하는 기술이다.

 

구조적 위험

명령어들을 겹쳐 실행하는 과정에서 서로 다른 명령어가 동시에 ALU, 레지스터 등과 같은 CPU 부품을 사용하려고 할 때 발생한다. 자원 위험이라고도 부른다.

 

슈퍼스칼라

CPU 내부에 여러 개의 명령어 파이프라인을 포함한 구조. 오늘날 대부분의 CPU에서 사용한다. 생산라인을 여러 개 두는 것으로 생각하면 된다.

 

슈퍼스칼라 구조로 명령어 처리가 가능한 CPU를 슈퍼스칼라 프로세서 또는 슈퍼스칼라 CPU라고 한다.

 

  • 매 클럭 주기마다 동시에 여러 명령어를 인출, 실행할 수 있다.
  • 이론적으로는 파이프라인 개수에 비례하여 프로그램 처리 속도가 빨라진다. 하지만 파이프라인 위험을 위해 고도로 설계되어야 한다.

 

비순차적 명령어 처리기(OoOE: Out-of-order execution)

명령어를 순차적으로만 실행하지 않고 순서를 바꿔 실행해도 무방한 명령어를 먼저 실행하여 명령어 파이프라인이 멈추는 것을 방지하는 기법. 오늘날  CPU 성능 향상에 크게 기여한 기법이자 대부분의 CPU가 차용하는 기법이다.

 

비순차적 명령어 처리가 가능한 CPU는 명령어들이 어떤 명령어와 데이터 의존성을 가지고 있는지, 순서를 바꿔 실행할 수 있는 명령어에는 어떤 것들이 있는지를 판단할 수 있어야 한다.

 

05-3 CISC와 RISC

CPU의 마지막 이야기. 명령어가 어떻게 생겨야 파이프라이닝에 유리할까?

 

명령어 집합

명령어 집합 구조(ISA: Instruction Set Architecture): CPU가 이해할 수 있는 명령어의 모음들. CPU마다 ISA가 다를 수 있다.

 

가령 인텔의 노트북 속 CPU는 x86 혹은 x86-64 ISA를 이해하고, 애플의 아이폰 속 CPU는 ARM ISA를 이해한다. ISA는 일종의 CPU의 언어인 셈이다. ISA가 다르면 제어장치가 명령어를 해석하는 방식, 사

용되는 레지스터의 종류와 개수, 메모리 관리 방법, CPU 하드웨어 설계 등 수많은 것에 영향을 미친다.

 

현대 ISA 양대 산맥인 CISC와 RISC에 대해 알아보자

 

CISC

Complex Instruction Set Computer == 복잡한 명령어 집합을 활용하는 컴퓨터(CPU)

 

x86이 대표적인 CISC 기반의 ISA

 

가변 길이 명령어: 명령어의 형태와 크기가 다양. 적은 수의 명령어로도 프로그램을 실행할 수 있음

 

명령어 수행 시간이 길고 가지각색이기 때문에 파이프라인이 효율적으로 명령어를 처리할 수 없음

 

복잡하고 다양한 기능을 제공해 적은 수의 명령으로 프로그램을 동작시키고 메모리를 절약할 수 있지만, 명령어의 규격화가 어려워 파이프라이닝이 어렵다. 그리고 대다수의 복잡한 명령어는 그 사용 빈도가 낮다. 이런 이유로 CISC 기반 CPU는 한계가 있다.

 

RISC 

CISC의 한계가 준 교훈

  1. 빠른 처리를 위해 명령어 파이프라인을 십분 활용해야 한다. 원활한 파이프라이닝을 위해 명령어 길이와 수행 시간이 짧고 규격화되어 있어야 한다.
  2. 어차피 자주 쓰이는 명령어만 줄곧 사용된다. 복잡한 기능을 지원하는 명령어를 추가하기보다는 자주 쓰이는 기본적인 명령어를 작고 빠르게 만드는 것이 중요하다.

 

ARM이 대표적

 

Reduced Instruction Set Computer

 

고정 길이 명령어: CISC에 비해 명령어의 종류가 적고, 규격화된 명령어, 되도록 1클럭 내외로 실행되는 명령어를 지향한다. 명령어 파이프라이닝에 최적화되어 있다.

 

load-store 구조: 메모리에 직접 접근하는 명령어를 load, store 두 개로 제한할 만큼 메모리 접근을 단순화하고 최소화를 추구. 주소 지정 방식의 종류가 적은 방식이 많음. 그 대신 레지스터를 이용하는 연산이 많음.

 

정리하면

CISC RISC
복잡하고 다양한 명령어 단순하고 적은 명령어
가변 길이 명령어 고정 길이 명령어
다양한 주소 지정 방식 적은 주소 지정 방식
프로그램을 이루는 명령어의 수가 적음 프로그램을 이루는 명령어의 수가 많음
여러 클럭에 걸쳐 명령어 수행 1클럭 내외로 명령어 수행
파이프라이닝하기 어려움 파이프라이닝하기 쉬움

 

-

반응형

댓글