테키테크 TEKITECH

[컴퓨터구조] Ch05. CPU 제대로 쓰기 본문

그리고/스터디

[컴퓨터구조] Ch05. CPU 제대로 쓰기

TEKI 2023. 2. 10. 22:04

CPU를 이해하고 제대로 사용하기

  1. 빠른 CPU를 위한 설계 기법
  2. 명령어 병렬 처리 기법
  3. ISA와 CISC, RISC

 


 

1.  빠른 CPU를 위한 설계 기법

CPU 성능을 높이는 방법에는 3가지가 있다.

  1. 클럭 속도를 높이는 방법
  2. 코어를 늘리는 방법
  3. 스레드 수를 늘리는 방법

 

[1] 클럭 속도를 높이는 방법

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

즉, 클럭 속도가 높아지면 CPU는 명령어 사이클을 더 빠르게 반복하고, 다른 부품들도 그에 발맞춰 더 빠르게 작동할 것이다.
실제로 클럭 속도가 높은 CPU는 일반적으로 성능이 좋기 때문에 클럭 속도를 CPU 속도 단위로 간주하기도 한다.

클럭 속도는 헤르츠(㎐)단위로 측정한다.
*1㎐는 1초에 한 번을 의미한다.
*1㎓ = 1,000,000,000

클럭 속도는 일정하지 않다. 그래서 보통 기본 클럭 속도(Base)와 최대 클럭 속도(Max)로 나누어 표기한다.
최대 클럭 속도를 강제로 더 끌어올리는 것을 오버클럭킹(overclocking)이라고 한다.
단, 이때 무조건 CPU가 빨라지는 것은 아니며, 발열 문제가 심각해지기도 한다.

 

[2] 코어를 늘리는 방법

ALU, 제어장치, 레지스터 등을 포함하는 '코어'는 CPU 내에서 명령어를 실행하는 부품으로, CPU 안에 하나 또는 둘 이상이 있을 수 있다.
코어를 여러 개 포함하고 있는 CPU를 멀티코어(multi-core) CPU 또는 멀티코어 프로세서라고 부른다.

코어의 개수에 따라 듀얼 코어(2개), 쿼드코어(4개), 옥타코어(8개) 등으로 불리는데, 코어의 개수가 증가할수록 CPU의 성능이 더 좋아진다. 하지만 그렇다고 CPU의 연산 속도 증가율이 코어 개수에 비례하지는 않는다.

 

[3] 스레드 수를 늘리는 방법

스레드의 사전적 의미는 '실행 흐름의 단위'이다.
하지만 실제로 스레드에는 CPU에서 사용되는 하드웨어적 스레드가 있고, 프로그램에서 사용되는 소프트웨어적 스레드가 있으므로 구별하여 이해해야 한다.

◈  하드웨어적 스레드
→ 하나의 코어가 동시에 처리하는 명령어 단위

여러 스레드를 지원하는 CPU는 하나의 코어로도 여러 개의 명령어를 동시에 실행할 수 있다. 이런 CPU를 멀티스레드(multithread) 프로세서 또는 멀티스레드 CPU라고 한다.

◈  소프트웨어적 스레드
→ 하나의 프로그램에서 독립적으로 실행되는 단위

소프트웨어적 스레드를 이용하면 하나의 프로그램에서 여러 부분이 동시에 실행될 수 있다. 그리고 한 번에 하나씩 명령어를 처리하는 1코어 1스레드 CPU도 소프트웨어적 스레드를 수십 개 실행할 수 있다.

 

 

2. 명령어 병렬 처리 기법 

대표적인 명령어 병렬 처리 기법에는 다음과 같은 것들이 있다.

  1. 명령어 파이프라이닝
  2. 슈퍼스칼라
  3. 비순차적 명령어 처리

 

[1] 명령어 파이프라이닝

명령어 처리 과정을 클럭 단위로 나누어 보면 일반적으로 다음과 같이 나눌 수 있습니다.

각 단계가 겹치지만 않는다면, CPU는 각 단계를 '동시에' 실행할 수 있다.
전체 실행 시간을 비슷한 시간 간격으로 나눈 t1 ~ tn의 시간 동안 여러 개의 명령어를 동시에 실행한다면, 아래와 유사하게 명령어를 처리할 수 있다.

이렇게 명령어들을 명령어 파이프라인에 넣고 동시에 처리하는 기법을 명령어 파이프라이닝이라고 한다.

특정 상황에서는 성능 향상에 실패하는 경우가 있는데, 이러한 상황을 파이프라인 위험이라고 한다. 파이프라인 위험에는 크게 데이터 위험, 제어 위험, 구조적 위험이 있다.

◈  데이터 위험
명령어 간 데이터 의존성에 의해 발생하는 위험으로, 이전 명령어를 끝까지 실행해야만 비로소 실행할 수 있는 명령어와 같이 의존적인 명령어가 있는 경우에 모든 명령어를 동시에 처리할 수 없기 때문에 발생한다.

◈  제어 위험
분기 등으로 인한 프로그램 카운터의 갑작스러운 변화에 의해 발생하는 위험으로, 프로그램 카운터가 저장하고 있는 '현재 실행중인 명령어의 다음 주소'가 갑작스러운 변화로 처리 중인 명령어가 쓸모 없어지는 경우 발생한다. 이를 방지하기 위해 '분기 예측'과 같은 기술을 사용할 수 있다.

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

 

[2] 슈퍼스칼라

명령어 파이프라이닝을 단일 파이프라인이 아닌 둘 이상의 파이프라인으로 구현하여 CPU 내부에 여러 개의 명령어 파이프라인을 포함하는 구조를 슈퍼스칼라(superscalar)라고 한다.

슈퍼스칼라 구조로 명령어 처리가 가능한 CPU를 슈퍼스칼라 프로세서 또는 슈퍼스칼라 CPU라고 한다. 이론적으로 슈퍼스칼라 프로세서는 파이프라인 개수에 비례하여 프로그램 처리 속도가 빨라져야 하지만, 파이프라인이 증가할수록 여러 가지 위험이 증가하기 때문에 파이프라인 개수에 비례하여 성능이 향상되지는 않는다.

 

[3] 비순차적 명령어 처리

순서를 바꿔도 무방한 명령어를 먼저 실행하여 명령어 파이프라인이 멈추는 것을 방지하는 기법을 비순차적 명령어 처리라고 한다.

 

 

3. ISA와 CISC, RISC

명령어 집합 또는 명령어 집합 구조(ISA: Instruction Set Architecture)는 CPU가 이해할 수 있는 명령어들의 모음을 말한다. CPU마다 사용하는 명령어가 조금씩 다르므로 ISA도 다를 수 있다.
*명령어 집합 '구조'인 이유는 CPU가 어떤 명령어를 이해하는지에 따라 컴퓨터 구조 및 설계 방식이 달라지기 때문이다.

개발자들이 주로 사용하는 High-Level Language를 컴퓨터가 이해하는 Low-Level Language로 번역하기 위해서는 어셈블러와 컴파일러가 필요하다. Low-Level Language로 번역된 명령어는 하드웨어로 전달되어야 하는데, 이때 소프트웨어와 하드웨어를 연결해주는 것이 ISA이다.

출처: https://velog.io/@apphia39/%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0ISA-CISC-vs.-RISC

◈  ISA 명령어의 종류 (대표적으로)

  • 산술 논리 명령어(ADD, SUB)
  • 데이터 전송 명령어(LOAD, STORE)
  • 실행 흐름 제어 명령어(BRANH, CALL, TRAP)
  • 부동 소수점 연산 명령어

CISC(Complex Instruction Set Computer)은 직역하면 '복잡한 명령어 집합을 활용하는 컴퓨터'를 의미한다. CISC는 다양하고 강력한 기능의 명령어 집합을 활용하기 때문에 명령어의 형태와 크기가 다양한 가변 길이 명령어를 활용한다. x86, x86-64가 대표적인 CISC 기반의 ISA이다.

RISC(Reduced Instruction Set Computer)은 CISC에 비해 적은 명령어 집합을 사용한다. RISC는 아래와 같이 CISC의 한계에 대응한 원칙에 의거해 등장했다.

1) 원활한 파이프라이닝을 위해 명령어 길이와 수행 시간이 짧고 규격화 되어있어야 한다.
2) 어차피 자주 쓰이는 명령어만 줄곧 사용되니 자주 쓰이는 기본적인 명령어를 작고 빠르게 만드는 것이 중요하다.

RISC는 CISC와 달리 짧고 규격화된 명령어 즉, 1클럭 내외로 실행되는 명령어를 지향하며, 고정 길이 명령어를 사용한다.

 

반응형
Comments