
CUDA 코어와 텐서 코어: NVIDIA GPU의 핵심
AI 시대의 금광, 엔비디아 GPU. 도대체 게임용 그래픽카드로 왜 AI를 돌리는 걸까? 단순 노동자(CUDA)와 행렬 계산 천재(Tensor)의 차이로 파헤쳐봤습니다.

AI 시대의 금광, 엔비디아 GPU. 도대체 게임용 그래픽카드로 왜 AI를 돌리는 걸까? 단순 노동자(CUDA)와 행렬 계산 천재(Tensor)의 차이로 파헤쳐봤습니다.
맥북 배터리는 왜 오래 갈까? 서버 비용을 줄이려면 AWS Graviton을 써야 할까? 복잡함(CISC)과 단순함(RISC)의 철학적 차이를 정리해봤습니다.

빠른 SSD를 샀는데 왜 느릴까요? 1차선 시골길(SATA)과 16차선 고속도로(NVMe). 인터페이스가 성능의 병목이 되는 이유.

LP판과 USB. 물리적으로 회전하는 판(Disc)이 왜 느릴 수밖에 없는지, 그리고 SSD가 어떻게 서버의 처리량을 100배로 만들었는지 파헤쳐봤습니다.

마더보드는 그냥 모든 부품을 꽂는 판때기인 줄 알았습니다. 하지만 '칩셋'이 무엇인지 알고 나서야 왜 비싼 메인보드가 필요한지 깨달았습니다.

제가 ChatGPT 열풍에 영향받아 Llama-2 모델을 로컬에서 돌려보려 했을 때의 일입니다.
M1 맥북 (CPU only):
>>> "Tell me about quantum physics in simple terms"
[10초 후] "Quantum"
[10초 후] "physics"
[10초 후] "is"
한 단어에 10초.
그래서 구형 RTX 3060 (CUDA + Tensor Cores) 를 빌렸습니다:
>>> "Tell me about quantum physics in simple terms"
[즉시] "Quantum physics is the study of very small particles..."
[1초 만에 한 문단 완성]
100배 차이.
"왜? 왜 GPU에만 이렇게 빠르지?"
그때부터 GPU 구조에 관심이 생겼습니다.
제가 한 질문들:
답을 찾다 보니, 엔비디아가 AI 시대를 예견하고 심어둔 전략적 하드웨어들이 보였습니다.
무엇보다 "왜 AMD GPU는 안 쓰지?"가 궁금했습니다.
시니어가 이렇게 설명해줬습니다:
CPU 코어 (8개): 박사님 8명
- 복잡한 논문 (단일 스레드 연산)을 빠르게 해결
- 하지만 인원이 적어서 단순 작업은 느림
GPU 코어 (5,000개): 초등학생 5,000명
- 복잡한 논문 못 품
- 하지만 단순 덧셈 5,000개 동시 계산은 박사보다 빠름
AI 학습이란:
1 + 1 = ?
2 + 3 = ?
4 + 5 = ?
... (10억 번 반복)
박사 8명이 이걸 순차적으로 풀기 vs 초등학생 5,000명이 동시에 풀기
당연히 후자가 빠릅니다.
이 비유를 듣고 나서야 GPU가 왜 AI에 적합한지 체감이 됐습니다. CPU는 복잡한 작업 하나를 빨리 끝내는 데 최적화되어 있고, GPU는 단순한 작업 수천 개를 동시에 처리하는 데 최적화되어 있습니다. AI 학습은 후자에 해당합니다.
CUDA (Compute Unified Device Architecture)는 엔비디아가 만든 병렬 컴퓨팅 플랫폼이자, GPU 안의 일개미 코어들의 이름입니다.
| GPU 모델 | CUDA 코어 수 | 가격 | 용도 |
|---|---|---|---|
| RTX 3060 | 3,584개 | $329 | 게임 + 가벼운 AI |
| RTX 3090 | 10,496개 | $1,499 | 게임 + 딥러닝 |
| A100 (데이터센터용) | 6,912개 | $10,000+ | 대규모 AI 학습 |
A100의 CUDA 코어 수가 RTX 3090보다 적은 게 의아할 수 있습니다. 하지만 A100은 텐서 코어 성능, 메모리 대역폭, NVLink 연결 등 AI에 특화된 다른 요소들이 훨씬 강력합니다. 단순 코어 수가 전부가 아닙니다.
AMD도 GPU를 만듭니다 (Radeon). 하지만 AMD GPU는 AI에 거의 안 씁니다.
이유: CUDA엔비디아는 2006년부터 CUDA라는 개발 도구를 무료로 뿌렸습니다.
// CUDA 코드 예시
__global__ void addKernel(int *c, const int *a, const int *b) {
int i = threadIdx.x;
c[i] = a[i] + b[i]; // 각 스레드가 동시 계산
}
이 코드의 핵심은 __global__ 키워드입니다. CPU가 아닌 GPU에서 실행될 함수를 정의하는 것이고, threadIdx.x는 수천 개의 스레드가 각각 자기 담당 데이터를 동시에 처리하게 합니다.
모든 AI 프레임워크(TensorFlow, PyTorch)가 CUDA 기반으로 만들어졌습니다. AMD의 대항마 ROCm은 2016년에야 나왔고, 지원 범위가 아직 제한적입니다.
결과: CUDA = 사실상 GPU AI 표준이것이 엔비디아의 가장 강력한 해자(moat)입니다. 하드웨어 성능이 비슷해도, 소프트웨어 생태계가 CUDA에 묶여있기 때문에 다른 GPU로의 전환이 어렵습니다.
2017년, 엔비디아가 Volta 아키텍처에 텐서 코어를 추가했습니다.
AI의 핵심은 행렬 곱셈 (Matrix Multiplication)입니다.
# 딥러닝의 기본 연산
output = weights @ inputs # 행렬 곱셈
이미지 인식 한 번에:
CUDA 코어로도 할 수 있지만, 한 땀 한 땀 계산합니다. 한 개의 CUDA 코어는 한 클럭에 하나의 부동소수점 곱셈(FMA)만 수행합니다.
텐서 코어는 4×4 행렬 덩어리를 한 번에 계산합니다.
CUDA 코어:
1 × 1 계산을 10,000개 동시 수행
텐서 코어:
4 × 4 블록(16개)을 한 번에 수행
→ 실질적으로 16배 효율
이것이 가능한 이유는 텐서 코어가 MMA(Matrix Multiply-Accumulate) 연산을 하드웨어 레벨에서 지원하기 때문입니다. D = A × B + C 형태의 행렬 연산을 하나의 명령어로 처리합니다.
2017년 Volta(V100)에서 처음 나온 텐서 코어는 계속 진화했습니다.
이것이 GPT-4 같은 괴물 AI가 나올 수 있었던 하드웨어적 배경입니다.
제가 Stable Diffusion (AI 이미지 생성)을 돌렸을 때:
RTX 2080 (텐서 코어 없음)512×512 이미지 1장 생성: 22초
RTX 3060 (텐서 코어 있음)
512×512 이미지 1장 생성: 8초 (2.75배 빠름)
같은 CUDA 코어 수급(약 3,500개)인데도 텐서 코어 유무로 속도 차이가 약 3배. AI 워크로드에서 텐서 코어의 존재감은 압도적입니다.
pi = 3.141592653589793 # 매우 정밀
과학 계산, 물리 시뮬레이션처럼 정확한 소수점이 필요한 곳에 씁니다.
pi = 3.14 # 덜 정밀하지만 충분
AI에겐 이 정도면 충분합니다.
"고양이일 확률: 99.123456%"
vs
"고양이일 확률: 99.12%"
→ 결과는 둘 다 "고양이"
핵심은 Mixed Precision Training입니다. 순전파(forward pass)와 역전파(backward pass)는 FP16으로 빠르게 계산하고, 가중치 업데이트는 FP32로 정밀하게 유지합니다. 속도와 정확도를 모두 잡는 전략입니다.
| 정밀도 | CUDA 코어 | 텐서 코어 |
|---|---|---|
| FP32 | 10 TFLOPS | - |
| FP16 | 20 TFLOPS | 80 TFLOPS |
| FP8 (최신) | - | 160 TFLOPS |
RTX 4090의 경우:
TFLOPS가 뭐냐면, 1초에 1조(Tera) 번의 부동소수점 연산을 한다는 뜻입니다. FP16 텐서 코어의 330 TFLOPS는, 1초에 330조 번의 행렬 연산을 처리한다는 것입니다. 이게 AI가 그토록 빠르게 학습할 수 있는 비밀입니다.
# CUDA 설치 확인
nvcc --version
# PyTorch (CUDA 지원)
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118
import torch
# FP16 모드 (텐서 코어 활용)
model = MyModel().half().cuda() # .half() = FP16
input = torch.randn(1, 3, 512, 512).half().cuda()
# 추론
with torch.cuda.amp.autocast(): # 자동 mixed precision
output = model(input)
.half()를 호출하면 모델의 가중치가 FP32에서 FP16으로 변환되고, 텐서 코어가 자동으로 활성화됩니다. autocast()는 어떤 연산을 FP16으로 하고 어떤 연산을 FP32로 할지 자동으로 결정해줍니다.
import time
# FP32 (CUDA 코어만)
start = time.time()
for _ in range(100):
output = model_fp32(input_fp32)
print(f"FP32: {time.time() - start:.2f}s")
# 출력: FP32: 12.34s
# FP16 (텐서 코어 활용)
start = time.time()
for _ in range(100):
output = model_fp16(input_fp16)
print(f"FP16: {time.time() - start:.2f}s")
# 출력 - FP16: 4.21s (2.9배 빠름)
코드 변경은 .half() 한 줄뿐인데 속도가 3배 가까이 차이 납니다.
이게 텐서 코어의 위력입니다.
AMD도 비슷한 기술(Matrix Cores)을 개발했습니다. 하지만 현실은 이렇습니다:
# 엔비디아
import torch
torch.cuda.is_available() # True (즉시 작동)
# AMD
import torch_directml # 별도 설치 필요
# 지원 안 되는 연산 많음, 에러 빈발
문제가 생겼을 때 CUDA는 Stack Overflow에서 5분이면 답을 찾지만, ROCm은 GitHub Issue에 등록하고 며칠을 기다려야 할 수도 있습니다.
OpenAI, Google, Meta 모두 엔비디아 A100/H100 사용. 클라우드 서비스(AWS, GCP, Azure)의 GPU 인스턴스도 대부분 엔비디아입니다.
AMD의 MI250/MI300 같은 데이터센터 GPU도 나오고 있고, ROCm도 빠르게 발전하고 있지만, 15년간 축적된 CUDA 생태계를 단기간에 따라잡기는 어렵습니다.
엔비디아가 AI 시대를 지배하는 이유:
AMD가 따라잡기 어려운 이유는 15년 선점 효과 때문입니다. 하드웨어 성능만으로는 이길 수 없고, 개발자 생태계(라이브러리, 튜토리얼, 커뮤니티)가 함께 따라와야 합니다.
제가 처음 GPU로 AI를 돌렸을 때의 감동을 잊을 수 없습니다.
"이래서 다들 엔비디아만 찾구나."