1편. CPU vs GPU 구조 — 왜 딥러닝은 GPU에서 동작할까?

Gyullbb·2026년 8월 7일

LLM

목록 보기
1/7

"같은 행렬곱인데 왜 CPU는 느리고 GPU는 빠를까?"

ChatGPT에게 질문을 보내면 GPU 수천 개가 동시에 계산을 수행하며 답을 만들어낸다.

그렇다면 이런 궁금증이 생긴다.

CPU도 계산을 하는데, 왜 AI는 굳이 GPU를 사용할까?

많은 사람들이

"GPU는 병렬 처리를 잘하니까."

라고 설명한다.

물론 맞는 말이다.

하지만 이것은 결과일 뿐이다.

진짜 이유는 CPU와 GPU가 애초에 다른 목적을 가지고 설계되었기 때문이다.

이번 글에서는 CPU와 GPU의 내부 구조를 살펴보며, 왜 Transformer와 같은 딥러닝 모델이 GPU에서 압도적인 성능을 내는지 이해해보자.


CPU와 GPU는 처음부터 목적이 달랐다

컴퓨터가 수행하는 작업은 크게 두 가지로 나눌 수 있다.

첫 번째는 복잡한 판단이다.

예를 들어,

  • 운영체제 실행
  • 웹 브라우저
  • 게임 로직
  • if, for, while
  • 함수 호출

처럼 다음에 무엇을 할지 계속 결정해야 하는 작업이다.

두 번째는 같은 계산을 엄청나게 많이 반복하는 작업이다.

CPU는 첫 번째 작업을 잘하도록 만들어졌고, GPU는 두 번째 작업을 잘하도록 만들어졌다.

이것이 두 프로세서를 이해하는 가장 중요한 출발점이다.


CPU는 어떤 일을 하는 프로세서일까?

우리가 컴퓨터를 사용할 때 CPU가 처리하는 작업을 떠올려 보자.

  • 운영체제 실행
  • 웹 브라우저 실행
  • 게임 로직 처리
  • 프로그램 실행
  • 파일 복사
  • 데이터베이스 조회

이 작업들의 공통점은 무엇일까?

계속해서 다음에 무엇을 해야 하는지 판단해야 한다는 것이다.

예를 들어 아주 간단한 코드 하나를 보자.

if (score >= 90)
    grade = "A";
else
    grade = "B";

이 프로그램은 먼저 score >= 90이라는 조건의 결과를 알아야만 다음 명령을 실행할 수 있다.

이렇듯 CPU가 처리하는 대부분의 프로그램은 판단 => 다음 명령 결정 => 실행의 과정을 수십억 번 반복한다.

그래서 CPU는 단순히 계산을 잘하는 프로세서가 아니라, 복잡한 판단을 빠르게 수행하는 프로세서라고 이해하는 것이 맞다.


CPU는 어떻게 구성되어 있을까?

CPU 내부에는 수많은 회로가 있지만, 가장 중요한 구성 요소는 크게 네 가지다.

                CPU Core

        ┌─────────────────┐
        │ Control Unit    │
        ├─────────────────┤
        │ ALU             │
        ├─────────────────┤
        │ Register        │
        ├─────────────────┤
        │ L1 Cache        │
        └─────────────────┘

                ↓

          L2 / L3 Cache

                ↓

              DRAM

CPU에서 가장 중요한 구성 요소는 다음 네 가지다.

구성 요소역할
Control Unit명령어 해석 및 실행 순서 결정
ALU덧셈, 곱셈, 비교 등 실제 계산 수행
Register현재 계산 중인 데이터를 저장하는 가장 빠른 메모리
Cache메모리 병목을 줄이기 위한 고속 메모리

1. Control Unit (제어장치)

Control Unit은 CPU의 지휘자다.

프로그램의 명령어를 읽고,

  • 무엇을 계산할지
  • 어떤 데이터를 가져올지
  • 다음에 어떤 명령을 실행할지

를 결정한다.

예를 들어

a = b + c;

라는 코드가 실행되면 Control Unit은

명령어 읽기

↓

b와 c를 Register로 가져오기

↓

ALU에게 덧셈 요청

↓

결과 저장

이라는 흐름을 관리한다.

실제 계산은 ALU가 하지만,

무엇을 계산할지는 Control Unit이 결정한다.


2. ALU (Arithmetic Logic Unit)

ALU는 CPU에서 실제 계산을 수행하는 장치다.

덧셈, 뺄셈, 비교, 논리 연산 등이 모두 여기에서 이루어진다.

쉽게 말하면 CPU 안의 계산기다.


3. Register

Register는 CPU 안에서 가장 빠른 저장 공간이다.

현재 계산 중인 데이터를 잠시 저장한다.

예를 들어

result = a + b;

를 계산한다고 해보자.

만약 ab를 매번 RAM에서 읽어온다면 계산보다 데이터를 가져오는 시간이 훨씬 오래 걸린다.

그래서 CPU는 계산에 필요한 값을 Register에 올려놓고 연산을 수행한다.

RAM

↓

Register

↓

ALU 계산

↓

Register

↓

RAM

CPU는 가능한 한 Register 안에서 계산을 끝내려고 한다.


4. Cache

Register는 매우 빠르지만 용량이 작다.

반대로 DRAM은 용량은 크지만 속도가 느리다.

그래서 CPU는 둘 사이에 Cache를 둔다.

CPU

↓

Register
(가장 빠름)

↓

L1 Cache

↓

L2 Cache

↓

L3 Cache

↓

DRAM
(가장 느림)

CPU는 자주 사용하는 데이터를 Cache에 저장해 느린 메모리에 접근하는 횟수를 줄인다.

Cache는 CPU 성능을 결정하는 가장 중요한 요소 중 하나다.

여기까지 보면 CPU도 성능을 높이기 위해서는 GPU처럼 코어를 수천개 넣으면 되는 것 아닌가? 라는 의문이 생길 수 있다.

문제는 앞서 말한 것 처럼 CPU가 처리하는 작업은 대부분 순서가 중요하다는 것이다.

이런 작업에서는 코어를 무한히 늘려도 성능이 크게 향상되지 않는다.

그래서 CPU는 코어를 늘리는 대신 하나의 코어를 더 효율적으로 만드는 방향으로 발전했다.


CPU는 계산을 어떻게 빠르게 처리할까?

트랜지스터는 CPU를 구성하는 가장 작은 전자 스위치다.

CPU 설계자는 트랜지스터를 하나씩 배치하는 것이 아니라, 수십억 개의 트랜지스터를 조합해 더 큰 기능을 가진 회로를 만든다.

Transistor
      │
      ▼
Logic Gate
(AND / OR / NOT)

      │
      ▼
Adder
(가산기)

      │
      ▼
ALU

      │
      ▼
Execution Unit

      │
      ▼
Pipeline

      │
      ▼
CPU Core

이런 트랜지스터 조합을 통해 CPU 설계자는 고성능 계산과, 계산이 효율적으로 관리하는 기술 즉,

  • 앞으로 무엇을 실행할지 예측하고(Branch Predictor),
  • 기다리는 시간을 줄이고(Out-of-Order Execution & Register Renaming),
  • 실행 순서를 조정하고(Reorder Buffer),
  • 메모리 접근을 최소화하는 데(대용량 Cache)

막대한 트랜지스터를 투자한다.

즉 CPU 성능은 단순히 ALU 개수보다 복잡한 제어 회로를 얼마나 잘 설계했는가에 더 큰 영향을 받는다.

CPU는 "계산을 많이 하는 프로세서" 보다는 "계산이 멈추지 않도록 끊임없이 판단하는 프로세서" 라고 이해하는 편이 더 정확하다.


GPU는 왜 만들어졌을까?

GPU(Graphics Processing Unit)는 원래 AI를 위해 만들어진 프로세서가 아니다.

처음의 목적은 그래픽을 빠르게 렌더링하는 것이었다.

예를 들어 Full HD 화면은 1920 × 1080, 약 200만 개의 픽셀로 이루어져 있다.

화면을 그리려면 각 픽셀의 색상을 계산해야 하는데, 대부분의 픽셀은 서로 독립적이므로 여러 픽셀을 동시에 계산해도 문제가 없다.

이를 위해 GPU는 수많은 픽셀에 대해 동일한 연산을 병렬로 수행할 수 있도록 설계되었다.

CPU의 목적은 하나의 작업을 최대한 빠르고 효율적으로 처리하는 것이기 때문에 복잡한 제어 기능을 발전시킨 반면,

GPU는 수백만 개의 동일하거나 유사한 계산을 동시에 처리하는 것이 핵심이므로, 복잡한 제어 회로를 최소화하는 대신 수많은 산술연산장치(ALU)를 배치하여 병렬 연산 성능을 극대화하는 방향으로 발전했다.


GPU 구조

GPU는 하나의 거대한 코어가 아니다.

여러 개의 계산 블록으로 구성된다.

NVIDIA GPU에서는 이를 SM(Streaming Multiprocessor) 이라고 부른다.

                  GPU

      ┌─────┐  ┌─────┐  ┌─────┐
      │ SM  │  │ SM  │  │ SM  │
      └─────┘  └─────┘  └─────┘

      ┌─────┐  ┌─────┐  ┌─────┐
      │ SM  │  │ SM  │  │ SM  │
      └─────┘  └─────┘  └─────┘

SM 하나를 열어보면

                  SM

┌────────────────────────────┐
│ Warp Scheduler             │
├────────────────────────────┤
│ 연산 유닛                  │
│ CUDA Core / Tensor Core    │
│ CUDA Core / Tensor Core    │
│ CUDA Core / Tensor Core    │
├────────────────────────────┤
│ Register File              │
├────────────────────────────┤
│ Shared Memory              │
├────────────────────────────┤
│ L1 Cache                   │
└────────────────────────────┘

CPU와 비슷하게 Register와 Cache도 존재한다.

하지만 CPU처럼

  • Branch Predictor
  • Out-of-Order Execution
  • Reorder Buffer
  • Register Renaming

같은 복잡한 회로는 거의 사용하지 않는다.

대신

                 GPU

┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐
│ ALU  │ │ ALU  │ │ ALU  │ │ ALU  │
├──────┤ ├──────┤ ├──────┤ ├──────┤
│ ALU  │ │ ALU  │ │ ALU  │ │ ALU  │
├──────┤ ├──────┤ ├──────┤ ├──────┤
│ ALU  │ │ ALU  │ │ ALU  │ │ ALU  │
└──────┘ └──────┘ └──────┘ └──────┘

처럼 수많은 연산 유닛을 반복적으로 배치한다.

이것이 GPU가 같은 계산을 동시에 엄청나게 많이 수행할 수 있는 이유다.


GPU는 어떻게 수백만 개의 계산을 동시에 처리할까?

GPU는 큰 작업을 아주 작은 작업으로 나눈다.

4096 × 4096 행렬곱을 생각해 보자. 결과 행렬에는 16,777,216 개의 원소가 존재한다.

GPU는 이 엄청나게 많은 작업을 다음과 같은 계층으로 관리한다.


Thread

가장 작은 작업 단위로, 결과 행렬의 원소 하나를 계산한다.

문제는 행렬 하나만 계산해도 Thread가 수천만 개 생긴다.

이걸 하나씩 관리하면 관리 비용이 너무 커진다.

그래서 GPU는 여러개의 Thread를 Warp라는 단위로 묶는다.


Warp

NVIDIA GPU의 경우 Thread 32개를 하나의 Warp로 GPU가 자동으로 묶는다.

Warp 안의 Thread는 같은 명령어를 동시에 실행한다.

이 방식이 바로 SIMT(Single Instruction Multiple Thread) 다.


Block

Warp 여러 개를 하나로 묶으면 Block이 된다.

Block은 GPU의 한 개 SM에 배정된다.

Block 내부 Thread들은 Shared Memory를 함께 사용할 수 있다.

그래서 같은 데이터를 여러 번 읽지 않아도 된다.


Grid

마지막으로 Block들을 모두 합친 것이 Grid다. 이는 GPU에 전달되는 하나의 작업 전체를 의미한다.

즉 GPU는 거대한 계산 하나를 수백만 개의 Thread로 나눈 뒤 Warp -> Block -> SM 순으로 배치해 실행한다.


GPU는 Thread를 어떻게 실행할까?

Thread를 만드는 것은 GPU가 아니다.

CUDA와 같은 프로그래밍 플랫폼에서 개발자가 커널(Kernel)을 실행할 때 Grid와 Block의 크기를 지정하면, CUDA Runtime이 그에 맞는 Thread들을 생성한다.

생성된 Thread들은 GPU에 전달되고, GPU는 이를 32개씩 하나의 Warp(NVIDIA 기준)로 자동으로 묶는다.

이후 여러 Warp를 포함한 Block이 하나의 SM에 할당된다.

SM 내부의 Warp Scheduler는 실행 가능한 Warp를 선택해 CUDA Core에 배정한다. CUDA Core는 Thread를 실행하는 실제 연산 하드웨어(ALU)로, Thread가 수행해야 하는 계산을 처리한다.

또한 GPU는 어떤 Warp가 메모리 접근 등으로 인해 실행을 잠시 기다리게 되면, 해당 Warp를 기다리지 않고 즉시 다른 준비된 Warp로 전환하여 CUDA Core를 계속 동작시킨다. 이러한 빠른 Warp 전환 덕분에 GPU는 연산 장치가 쉬는 시간을 최소화하며 매우 높은 처리량을 달성할 수 있다.


결국 CPU와 GPU의 차이는 무엇일까?

한 장으로 정리하면 이렇다.

CPUGPU
복잡한 제어에 많은 트랜지스터 사용연산 유닛에 많은 트랜지스터 사용
적은 수의 강력한 코어많은 수의 단순한 연산 유닛
지연 시간(Latency) 최소화처리량(Throughput) 최대화
운영체제, 웹 브라우저, 게임그래픽, AI, 과학 계산

CPU는 복잡한 문제 하나를 빠르게 해결하도록 설계되었고,

GPU는 단순한 문제 수백만 개를 동시에 해결하도록 설계되었다.


마무리

이제 왜 딥러닝이 GPU에서 동작하는지 이해할 수 있다.

Transformer의 핵심 연산은 대부분 거대한 행렬곱이다.

행렬곱은 다시 수많은 독립적인 곱셈과 덧셈으로 나눌 수 있다.

GPU는 이 계산을 Thread → Warp → Block → SM 구조로 병렬 실행하며, 수천 개의 연산 유닛을 동시에 활용한다.

다음 편에서는 이 GPU 위에서 실제로 어떤 연산이 수행되는지, 그리고 왜 Transformer가 RNN을 대체하게 되었는지를 살펴보겠다.


참고문헌

0개의 댓글