[혼공컴운] Ch05 CPU 성능 향상 기법

Hyunjoon Choi·2023년 7월 15일
0

혼공컴운

목록 보기
5/15
post-thumbnail

📢 본 글은 혼공학습단 미션과 함께 정리해보는 글 입니다.

빠른 CPU를 위한 설계 기법

클럭 속도를 높이는 방법

CPU를 빠르게 하기 위한 방법으로는 클럭 속도를 높이는 방법이 있다.

컴퓨터 부품들은 클럭 신호에 맞춰 명령어 사이클이 진행되는데, 클럭 속도가 높아진다면 진행할 수 있는 명령어 사이클 횟수가 늘어날 것이기 때문이다.

클럭 속도의 단위는 헤르츠 (Hz) 이다. 헤르츠는 1초에 클럭이 반복되는 횟수를 뜻한다.

또한 클럭 속도는 일정하지 않다. 필요한 작업량에 따라서 유연하게 조절되며, 최대 클럭 속도를 강제로 끌어올리는 방법오버클럭킹 (overclocking)이라고 한다.

한계

클럭 속도를 너무 극단적으로 높이다보면 발열 문제를 초래한다.

코어 수를 늘리는 방법

코어 (Core)명령어를 실행하는 부품을 뜻한다.

원래 CPU의 뜻이었으나, 기술 발전으로 현대 CPU에는 명령어를 실행하는 부품이 여러 개 존재할 수 있게 되었다. 이때 여러 개의 코어를 가지고 있는 것을 멀티 코어 (= 멀티 코어 프로세서), 하나의 코어를 가지고 있는 것을 싱글 코어 (= 싱글 코어 프로세서)라고 한다.

한계

CPU의 연산 속도가 무조건 코어 수에 비례하여 증가하지는 않는다. 또한 처리하고자 하는 작업량보다 너무 코어가 많아도 성능에는 크게 영향이 없다. 더 중요한 것은 코어마다의 처리해야 할 연산이 적절히 분배되는 것이다.

스레드 수를 늘리는 방법

스레드

스레드 (Thread)란 실행 흐름의 단위를 의미하지만, CPU에서의 스레드와 프로그래밍에서의 스레드는 의미가 약간 다르다.

하드웨어적 스레드

하드웨어적 스레드는 하나의 코어가 동시에 처리하는 명령어 단위를 뜻한다. 하나의 코어가 하나의 명령어를 처리한다면 1코어 1스레드 CPU라 한다.

그런데 2코어 4스레드처럼, 하나의 코어에서 여러 개의 명령어를 동시에 처리할 수도 있다. 이러한 경우를 멀티 스레드 프로세서라 한다.

하나의 코어가 레지스터 세트 (하나의 명령어를 실행하기 위해 꼭 필요한 레지스터들의 모음)를 여러 개 가지고 있으면 하나의 코어에서 여러 명령어를 동시에 처리할 수 있다.

하드웨어 스레드를 논리 프로세서 (logical processor)라고 하기도 한다. 메모리가 보기에는 하드웨어 스레드가 한 번에 하나의 명령어를 처리할 수 있는 CPU처럼 보이기 때문이다.

소프트웨어적 스레드

소프트웨어적 스레드는 하나의 프로그램에서 독립적으로 실행되는 단위를 뜻한다. 워드 프로그램에서는 맞춤법 검사, 저장 등의 기능이 동시에 실행된다.

즉, 소프트웨어 스레드를 여러 개 만들면 하나의 프로그램에서 독립적으로 실행되는 게 많아져서 하나의 프로그램의 여러 군데를 동시에 실행할 수 있다.

여기서 중요한 것은 1코어 1스레드 CPU도 여러 개의 소프트웨어 스레드를 만들 수 있다. CPU는 프로그램을 실행할 때 매우 빠르게 번갈아가며 실행하기 때문에 사용자 눈에는 동시에 실행되는 것 처럼 보이기 때문이다.


명령어 병렬 처리 기법

CPU를 빠르게 만드는 것도 중요하지만, CPU의 유휴 시간 (대기 시간)을 줄이고 최대한 효율적으로 작동할 수 있도록 하는 것도 중요하다.

이때 쓰이는 기법이 명령어 병렬 처리 기법 (ILP)이며, 대표적인 명령어 병렬 처리 기법에는 명령어 파이프라이닝, 슈퍼스칼라, 비순차적 명령어 처리가 있다.

명령어 파이프라이닝

현대 컴퓨터에서 없어서는 안될 개념이다.

명령어가 처리되는 과정을 비슷한 시간 간격으로 나누면 명령어 인출 → 명령어 해석 → 명령어 실행 → 결과 저장으로 된다.

그런데, 각 단계가 겹치지 않게 된다면 CPU는 각 단계를 동시에 실행할 수 있다.

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

위험

특정 상황에서는 성능 향상에 실패하는 경우도 있다. (= 파이프라인 위험)

1️⃣ 데이터 위험

  • 특정 명령어는 이전 명령어를 끝까지 실행해야만 실행할 수 있는 경우가 있다.
  • 명령어 간 데이터 의존성에 의해 발생한다.

2️⃣ 제어 위험

  • 프로그램 카운터가 JUMP 등으로 인해 메모리 번지를 갑자기 옮겼을 때 그동안 진행되고 있던 다음 명령어들이 쓸모없게 되는 경우를 뜻한다.
  • 이러한 위험을 막기 위해 미리 프로그램 카운터의 다음 값을 예측하는 것 (프로그램이 어디로 분기할지 미리 예측하는 것)을 분기 예측이라 한다.

3️⃣ 구조적 위험 (= 자원 위험)

명령어들을 겹쳐 실행하는 과정에서 각 명령어들이 동시에 같은 CPU 부품을 사용하려고 할 때 발생한다.

슈퍼스칼라

슈퍼스칼라는 CPU 내부에 여러 개의 명령어 파이프라인을 가진 것을 뜻한다.

이 구조로 명령어 처리가 가능한 CPU를 슈퍼스칼라 프로세서 (= 슈퍼스칼라 CPU)라고 하지만, 단일 파이프라인을 가졌을 때 보다 더 파이프라인 위험 등에 대해 엄격하게 처리되어야 하므로 까다로운 구조이다. 그렇기 때문에 이론적으로는 파이프라인 갯수에 비례하여 성능이 좋아지지만, 실제로는 반드시 파이프라인 갯수에 비례하지 않는다.

비순차적 명령어 처리

파이프라인의 중단을 방지하기 위해 명령어를 순차적으로 처리하지 않는 명령어 병렬 처리 기법을 뜻한다.

앞서 말했던 파이프라이닝 위험을 줄이는 데 기여하며, 서로 간의 순서를 바꾸기 위해서는 서로 간의 데이터 의존성이 전혀 없어야 한다.


CISC와 RISC

명령어 파이프라이닝을 활용함으로써 명령어들을 병렬 처리할 수 있다고 하였다.

그렇다면 명령어 파이프라이닝을 어떻게 더 좋게 할 수 있을까? 어떻게 더 명령어 파이프라이닝에 최적화되어 있어야 할까?

결국 명령어의 구조가 명령어 파이프라이닝을 할 때 유리하게 생겨야 한다.

명령어 집합

CPU가 이해할 수 있는 명령어들의 모음을 뜻한다.

세상에는 많은 종류의 CPU가 있고, 이들이 이해하는 명령어들의 구조는 제각기 다르다.

또는 명령어 집합 구조 (ISA, Instruction Set Architecture)라고 한다.

즉 명령어 집합은 CPU간 소통할 수 있는 언어이기도 하다. 이게 다르다면 명령어를 해석하는 방식, 레지스터의 종류와 갯수 등이 다 달라지게 된다.

CISC (Complex Instruction Set Computer)

  • 복잡한 명령어 집합을 활용한 컴퓨터 (CPU)
  • 명령어의 크기와 형태가 가변적 → 가변 길이 명령어 활용
    • 적은 수의 명령어로도 프로그램 실행 가능
    • 명령어의 크기와 실행되기까지의 시간이 일정하지 않게 됨
    • 결론적으로 명령어 파이프라이닝에 불리함
  • 대다수의 복잡한 명령어는 사용 빈도가 낮음

RISC (Reduced Instruction Set Computer)

  • 명령어의 종류가 적으며, 짧고 규격화된 명령어를 사용한다. → 고정 길이 명령어 활용
  • 하나의 명령어가 1클럭 내외로 실행 → 명령어 파이프라이닝에 최적화
  • 메모리 접근 단순화 → CISC보다 주소 지정 방식의 종류가 적음
    • 그대신 레지스터를 적극적으로 활용함
특징CISCRISC
명령어복잡, 다양단순, 적음
명렁어 길이가변고정
주소 지정 방식다양적음
프로그램을 이루는 명령어의 수적음많음
명령어 처리 클럭여러 클럭 필요1클럭 내외
파이프라이닝에 유리/불리불리유리

명령어 파이프라이닝을 사용하는 것은 현대 컴퓨터에서 너무 중요하기 때문에 CISC 제조업체는 실제로 실행될 때 CPU 내부적으로 조금 더 잘게 쪼개서 실행되도록 한다. (마이크로 명령어) 그래서 CISC 구조라 하더라도 실제 CPU를 보면 내부적으로는 RISC처럼 처리되도록 하고 있다.


미션

  • 155p 확인 문제 4번: 멀티코어 CPU의 그림이 다음과 같을 때 빈칸에 알맞은 용어는?
    • 답: 코어이다. 연산을 위한 ALU, 제어 신호를 보내기 위한 제어장치, 메모리와 소통하기 위한 레지스터를 가지고 있는 집합 (즉, 명령어를 실행하는 부품)을 코어라고 한다.
  • 용어 정리
    • 코어: 위에서 정의했듯이 명령어를 실행하는 부품을 코어라고 한다. 원래는 CPU의 뜻이었지만 기술 발전으로 하나의 CPU 안에 여러 개의 코어를 가질 수 있게 되었다.
    • 스레드: 사전적 의미는 실행 흐름의 단위를 뜻한다. 하드웨어적 스레드와 소프트웨어적 스레드로 구분되며, 하드웨어적 스레드는 하나의 코어가 동시에 처리할 수 있는 명령어의 단위를 뜻한다. 소프트웨어적 스레드는 하나의 프로그램에서 독립적으로 실행되는 단위를 뜻한다.
    • 멀티 코어: 하나의 CPU 안에 여러 개의 코어가 담긴 구조를 뜻한다.
    • 멀티 스레드: 하나의 코어 안에서 여러 개의 명령어를 동시에 실행할 수 있는 구조를 뜻한다.

부족하거나 보완할 점이 있다면 댓글 부탁드립니다 😃

profile
개발을 좋아하는 워커홀릭

0개의 댓글