공통 · 2026-09-10
CPU와 GPU: 모델의 계산을 실행하는 두 장치
GPU를 사용하는 이유와 CPU·GPU의 구조 차이를 살펴보고, Host·Device의 실행 흐름과 데이터 공급의 중요성을 설명합니다.
지금까지는 모델 안에서 입력 벡터가 어떤 계산을 거쳐 출력으로 바뀌는지 살펴봤습니다. 이제는 그 계산을 실제 하드웨어에서 어떻게 수행하는지 살펴보겠습니다. 먼저 모델의 많은 계산을 처리하기 위해 GPU를 사용하는 이유와 CPU·GPU의 구조 차이를 알아보고, 두 장치가 함께 작업하는 흐름을 따라가 보겠습니다.
많은 계산을 나누어 처리하기
앞서 MLP에서는 입력 벡터에 가중치 행렬을 곱해 새로운 벡터를 만들었습니다. 출력의 각 성분은 입력 성분과 가중치를 곱한 뒤 더한 값입니다. 실제 모델에서는 이런 계산을 큰 행렬에 적용하고, 여러 층에 걸쳐 반복합니다. 모델을 빠르게 실행하려면 많은 곱셈과 덧셈을 처리해야 합니다.
이 계산에는 동시에 진행할 수 있는 부분이 있습니다. 토큰 T개의 입력을 행으로 쌓은 X에 가중치 W를 곱하는 경우를 다시 살펴보겠습니다. X가 T × d이고 W가 d × m이면 출력 Y는 T × m입니다. 그림 1에서는 T = 3, d = 4, m = 8인 작은 행렬을 사용했습니다.
그림의 A는 첫 번째 입력 행 [1, 2, −1, 0]과 W의 세 번째 열을 사용해 계산합니다. 네 쌍의 값을 곱하고 더하면 0.5가 됩니다. B와 C도 같은 입력 행을 사용하지만, 각각 W의 첫 번째 열과 여섯 번째 열을 사용합니다. B를 계산할 때 A의 결과를 기다릴 필요는 없습니다. 필요한 입력과 가중치가 있으면 세 출력 칸의 계산을 함께 진행할 수 있습니다.
이처럼 여러 계산을 동시에 진행하는 것을 병렬 처리라고 합니다. 특정한 종류의 작업을 빠르게 수행하도록 설계한 장치를 가속기라고 부르며, GPU는 많은 데이터에 대한 병렬 계산에 활용하는 대표적인 가속기입니다. CPU에서도 모델을 실행할 수 있지만, 계산할 양이 많고 이를 충분히 나누어 처리할 수 있다면 GPU의 많은 연산 장치를 활용할 수 있습니다.
CPU와 GPU는 무엇이 다를까요?
CPU는 Central Processing Unit, GPU는 Graphics Processing Unit의 약자입니다. GPU는 그래픽 처리에 사용해 온 장치로, 같은 종류의 계산을 많은 데이터에 적용하는 데 강점이 있습니다. 이 특성을 행렬 곱 같은 모델의 계산에도 활용합니다.
CPU와 GPU에는 모두 계산을 수행하는 연산 장치, 실행을 제어하는 부분, 데이터를 저장하는 메모리가 있습니다. 차이는 이 자원을 어떻게 구성하고 어떤 작업에 초점을 맞추는지에 있습니다. 그림 2는 두 장치의 설계 방향을 단순화한 모습입니다.
왼쪽의 CPU에서는 각 코어가 제어와 연산을 수행하고, 가까운 곳에 둔 캐시에서 데이터를 가져옵니다. 캐시는 자주 사용하거나 곧 사용할 데이터를 빠르게 읽을 수 있도록 가까이 보관하는 메모리입니다. CPU는 조건에 따라 실행 경로가 바뀌거나 앞선 계산 결과를 받아 다음 작업을 진행하는 등 다양한 일을 처리합니다. 이런 작업에서 개별 작업이 끝날 때까지의 시간인 지연 시간을 줄이는 것이 중요합니다.
오른쪽의 GPU에는 주황색으로 표시한 연산 유닛들이 여러 묶음 안에 반복됩니다. GPU는 이 많은 연산 장치에 작업을 나누어, 일정 시간 동안 처리하는 계산의 양인 처리량을 높이는 데 초점을 둡니다. NVIDIA의 CUDA 가이드도 CPU와 GPU의 설계 차이를 지연 시간과 처리량의 관점에서 설명합니다.
CPU도 여러 코어와 코어 내부의 연산 장치로 병렬 계산을 수행합니다. 그림은 실제 코어 수나 면적 비율을 나타낸 것이 아니며, CPU 코어 하나와 GPU의 연산 유닛 하나도 같은 단위가 아닙니다. 이 비교에서 볼 점은 GPU가 많은 계산을 함께 처리하도록 구성되어 있고, 이를 활용하려면 나누어 맡길 계산이 충분해야 한다는 것입니다.
CPU가 작업을 요청하고 GPU가 계산합니다
모델을 GPU에서 실행하더라도 CPU가 맡는 일이 있습니다. 입력을 준비하고, GPU에서 어떤 계산을 수행할지 요청하며, 필요한 결과를 사용하는 일입니다. CUDA에서는 CPU와 호스트 메모리로 이루어진 시스템을 Host, 계산을 맡기는 GPU를 Device라고 부릅니다. 여기서는 CPU와 GPU가 각각의 메모리를 사용하는 경우를 살펴보겠습니다.
그림 3의 ①에서는 CPU가 입력을 준비하고, ②에서는 그 입력을 GPU 메모리로 전달합니다. 모델의 가중치는 미리 GPU 메모리에 준비되어 있다고 가정하겠습니다. ③에서는 CPU가 GPU에 수행할 계산을 요청합니다. 데이터를 전달하는 것과 계산을 실행하도록 요청하는 것은 서로 다른 작업이므로, 그림에서도 실선과 점선으로 구분했습니다.
④에서는 GPU가 입력과 가중치를 읽어 계산합니다. 연산 A의 결과는 다음 연산 B의 입력이 됩니다. 이때 중간 데이터를 GPU에 유지한 채 다음 연산을 이어갈 수 있습니다. 예를 들어 MLP의 행렬 곱 결과를 GPU에서 활성화 함수에 바로 전달할 수 있습니다. 매 연산이 끝날 때마다 중간 결과를 CPU로 가져올 필요는 없습니다.
CUDA의 실행 모델에서 GPU에 실행을 요청하는 것과 GPU의 계산이 끝나는 것은 별개의 시점입니다. CPU에서 결과를 사용하려면 GPU의 계산이 끝날 때까지 기다려야 합니다. 그런 다음 ⑤처럼 필요한 결과를 호스트 메모리로 가져와 사용합니다.
연산 장치가 일하려면 데이터가 필요합니다
그림 3에서는 CPU와 GPU 사이의 데이터 이동을 살펴봤습니다. GPU 안에서도 데이터 이동이 필요합니다. 가중치와 입력이 GPU 메모리에 저장되어 있어도, 연산 장치가 계산하려면 그 값을 가져와야 합니다. 계산한 결과는 저장하거나 다음 연산에 전달해야 합니다.
그림 4의 왼쪽은 데이터가 공급되어 여러 연산 장치가 일하는 모습입니다. 오른쪽도 연산 장치의 수는 같지만, 일부 장치는 필요한 데이터를 기다리고 있습니다. 계산할 장치가 많아도 데이터를 충분히 공급하지 못하면 그 연산 능력을 모두 활용하기 어렵습니다. 따라서 모델의 실행 속도를 이해하려면 얼마나 빨리 계산할 수 있는지와 함께, 필요한 데이터를 얼마나 빨리 가져올 수 있는지도 살펴봐야 합니다.
GPU는 많은 계산을 병렬로 처리하고, CPU는 입력 준비와 실행 요청 등 전체 작업을 진행합니다. GPU의 연산 장치가 일을 계속하려면 데이터도 함께 공급되어야 합니다. 다음 글에서는 GPU 내부로 들어가, 연산 장치와 메모리가 어떻게 구성되어 있는지 살펴보겠습니다.



