この記事の対象読者
- 「CUDAコア数」がGPUスペックに書いてあるけど、何のことかわからない方
- CPUとGPUの違いを理解したい方
- AIやディープラーニングでGPUが使われる理由を知りたい方
この記事で得られること
- CUDAコアの役割と動作原理の理解
- CPUコアとの根本的な違い
- CUDAコア数がAI処理速度に与える影響
この記事で扱わないこと
- CUDAプログラミングの詳細な書き方
- Tensorコアとの比較(別記事で解説)
- 具体的なGPU製品のベンチマーク
1. 「CUDAコア4096個」って言われてもピンとこない
「RTX 4070 Ti SUPERはCUDAコア8448個搭載!」
GPUのスペック表を見ると、こういう数字が出てきます。でも正直、最初は「だから何?」って思いませんでした?
私も最初はそうでした。CPUが「8コア16スレッド」と言われれば「おお、結構多いな」と思える。でも「8448コア」と言われると、もはや数字の暴力。何がどうすごいのかわからない。
この疑問を解消するには、まず「コア」という概念がCPUとGPUで全く違うことを理解する必要があります。
CUDAコアは、「めちゃくちゃ単純な計算しかできないけど、数の暴力で押し切る小さな作業員」 です。
この比喩を具体的に説明していきましょう。
ここまでで、CUDAコアの立ち位置がなんとなく見えてきたでしょうか。次は、CPUとGPUの設計思想の違いを見ていきます。
2. 前提知識の確認
本題に入る前に、この記事で使う用語を整理しておきます。
2.1 コア(Core)とは
プロセッサの中で実際に計算を実行するユニットです。コアが1つあれば1つの計算を、コアが8つあれば(理論上)8つの計算を同時に実行できます。
2.2 並列処理(Parallel Processing)とは
複数の計算を同時に実行することです。たとえば「1+1」「2+2」「3+3」を順番に計算する代わりに、3つ同時に計算すれば3倍速くなります。これが並列処理の基本的な考え方です。
2.3 CUDA(Compute Unified Device Architecture)とは
NVIDIAが2007年に発表した、GPUで汎用計算を行うためのプラットフォームです。もともとゲームのグラフィックス専用だったGPUを、科学計算やAIに使えるようにした革命的な技術です。
2.4 スレッド(Thread)とは
CPUやGPUが実行する処理の最小単位です。1つのコアが複数のスレッドを切り替えながら処理することで、効率を上げる仕組みもあります。
これらの用語が押さえられたら、次に進みましょう。
3. CPUとGPUの設計思想の違い
3.1 CPUは「優秀な少数精鋭」
CPUは「何でもできる優等生」として設計されています。
┌─────────────────────────────────────────────┐
│ CPU(8コアの例) │
├─────────────────────────────────────────────┤
│ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ │
│ │Core1│ │Core2│ │Core3│ │Core4│ │
│ │ │ │ │ │ │ │ │ │
│ │複雑な│ │複雑な│ │複雑な│ │複雑な│ │
│ │命令OK│ │命令OK│ │命令OK│ │命令OK│ │
│ └─────┘ └─────┘ └─────┘ └─────┘ │
│ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ │
│ │Core5│ │Core6│ │Core7│ │Core8│ │
│ │ │ │ │ │ │ │ │ │
│ │分岐 │ │予測 │ │キャ │ │ッシュ│ │
│ │処理OK│ │処理OK│ │大容量│ │高速 │ │
│ └─────┘ └─────┘ └─────┘ └─────┘ │
└─────────────────────────────────────────────┘
特徴:
- コア数は少ない(4〜64個程度)
- 各コアが高性能で複雑な処理が可能
- 分岐予測、投機的実行など高度な機能
- 大容量キャッシュでメモリアクセスを高速化
CPUは、「if文で分岐」「ループの最適化」「複雑な依存関係のある処理」など、どんな処理でもこなせます。その代わり、コア数は限られています。
3.2 GPUは「単純作業の大群」
GPUは「同じ計算を大量に並列実行する」ために設計されています。
┌─────────────────────────────────────────────────────────┐
│ GPU(数千CUDAコアの例) │
├─────────────────────────────────────────────────────────┤
│ ┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐ │
│ │C1││C2││C3││C4││C5││C6││C7││C8││C9││10││11││12│ ... │
│ └──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘ │
│ ┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐ │
│ │13││14││15││16││17││18││19││20││21││22││23││24│ ... │
│ └──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘ │
│ × 数百行 = 数千コア │
└─────────────────────────────────────────────────────────┘
特徴:
- コア数が非常に多い(数千〜数万個)
- 各コアは単純な計算しかできない
- 同じ命令を大量のデータに適用(SIMT)
- 複雑な分岐処理は苦手
GPUのCUDAコアは、個々の能力はCPUコアに比べて非常に限定的です。複雑な分岐処理は苦手だし、キャッシュも小さい。でも、数の暴力で押し切ります。
CPUとGPUの違いがわかったところで、抽象的な概念を具体的な例で見ていきましょう。
4. CUDAコアの動作原理
4.1 SIMT(Single Instruction, Multiple Threads)
CUDAコアは「SIMT」という方式で動作します。これは「1つの命令を、複数のスレッドで同時に実行する」という意味です。
# CPUでの処理イメージ(逐次処理)
for i in range(10000):
result[i] = a[i] + b[i] # 1つずつ順番に計算
# GPUでの処理イメージ(並列処理)
# 10000個のCUDAコアが一斉に「a[自分の担当] + b[自分の担当]」を計算
# → 1回の命令で10000個の計算が完了
これが「並列処理」の威力です。
4.2 Warp(ワープ)という実行単位
実際のCUDA実行では、32スレッドが1つの「Warp」としてまとめて実行されます。
┌─────────────────────────────────────────────┐
│ Streaming Multiprocessor (SM) │
├─────────────────────────────────────────────┤
│ ┌──────────────────────────────────────┐ │
│ │ Warp 0(32スレッド) │ │
│ │ Thread 0-31 が同じ命令を同時実行 │ │
│ └──────────────────────────────────────┘ │
│ ┌──────────────────────────────────────┐ │
│ │ Warp 1(32スレッド) │ │
│ │ Thread 32-63 が同じ命令を同時実行 │ │
│ └──────────────────────────────────────┘ │
│ ... 多数のWarp ... │
└─────────────────────────────────────────────┘
この「同じ命令を同時実行」という特性が、GPUが行列計算を得意とする理由です。
4.3 なぜAIで威力を発揮するのか
ディープラーニングの計算の大部分は行列演算です。
# ニューラルネットワークの基本演算
output = weight_matrix @ input_vector + bias
# これは「掛け算して足す」の繰り返し
# 例:1000×1000の行列同士の掛け算
# = 1,000,000回の「掛けて足す」演算
# CPUで逐次実行:1,000,000ステップ
# GPUで並列実行:数千ステップ(CUDAコア数に依存)
この「同じ計算を大量に」というパターンが、CUDAコアの並列処理能力と完璧にマッチしているのです。
理論がわかったところで、実際のCUDAプログラミングがどう動くか見ていきましょう。
5. 実際のCUDA処理フロー
5.1 GPUでの計算実行の流れ
"""
CUDA処理フローの概念図(擬似コード)
実際のCUDAプログラミングではC++を使うことが多いですが、
ここではPythonライクな擬似コードで説明します
"""
# Step 1: CPUからGPUへデータを転送
gpu_data_a = transfer_to_gpu(host_data_a)
gpu_data_b = transfer_to_gpu(host_data_b)
# Step 2: GPU上で並列計算を実行
# → 数千のCUDAコアが一斉に動く
gpu_result = gpu_add_kernel(gpu_data_a, gpu_data_b)
# Step 3: GPUからCPUへ結果を転送
host_result = transfer_to_cpu(gpu_result)
5.2 PyTorchでの実際の使用例
PyTorchを使えば、CUDAを意識せずにGPUを活用できます。
"""
PyTorchでGPUを使う実際のコード例
必要なパッケージ: pip install torch
"""
import torch
# GPUが使えるか確認
print(f"CUDA available: {torch.cuda.is_available()}")
print(f"CUDA device count: {torch.cuda.device_count()}")
if torch.cuda.is_available():
print(f"CUDA device name: {torch.cuda.get_device_name(0)}")
# データをGPUに転送
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# CPU上でテンソルを作成
a = torch.randn(10000, 10000)
b = torch.randn(10000, 10000)
# GPUに転送(ここでCUDAコアが使える状態になる)
a_gpu = a.to(device)
b_gpu = b.to(device)
# GPUで行列演算(CUDAコアが並列で計算)
result_gpu = torch.matmul(a_gpu, b_gpu)
# 結果をCPUに戻す
result_cpu = result_gpu.to("cpu")
print(f"Result shape: {result_cpu.shape}")
5.3 実行結果の例
上記のコードを実行すると、以下のような出力が得られます。
CUDA available: True
CUDA device count: 1
CUDA device name: NVIDIA GeForce RTX 4090
Result shape: torch.Size([10000, 10000])
10000×10000の行列演算(1億回の計算)が、GPUなら数秒で完了します。CPUで同じ計算をすると数十秒かかることもあります。
5.4 よくあるエラーと対処法
| エラー | 原因 | 対処法 |
|---|---|---|
CUDA out of memory |
VRAMが足りない | バッチサイズを小さくする、またはtorch.cuda.empty_cache()を呼ぶ |
CUDA driver version is insufficient |
ドライバが古い | NVIDIA公式から最新ドライバをインストール |
torch.cuda.is_available() returns False |
CUDAがインストールされていない | PyTorchをCUDA対応版で再インストール |
RuntimeError: CUDA error: device-side assert triggered |
不正な値(NaN等)がGPUに渡された | 入力データを確認し、数値の範囲を検証 |
実践的な使い方がわかったところで、ユースケース別の活用方法を見ていきましょう。
6. ユースケース別ガイド
6.1 ユースケース1: ローカルLLM実行(Ollama)
- 想定読者: ChatGPTのようなAIを自分のPCで動かしたい人
- 必要CUDAコア数目安: 3000以上推奨
- サンプルコード:
# Ollamaのインストール(Linux)
curl -fsSL https://ollama.ai/install.sh | sh
# モデルのダウンロードと実行
ollama run llama3.2:3b
# GPU使用状況の確認(別ターミナルで)
nvidia-smi
# 期待される出力例:
# GPU Memory Usage: 3GB / 24GB
# GPU Utilization: 80%
"""
OllamaをPythonから呼び出す例
必要なパッケージ: pip install ollama
"""
import ollama
response = ollama.chat(model='llama3.2:3b', messages=[
{
'role': 'user',
'content': 'CUDAコアって何ですか?簡潔に教えてください。'
}
])
print(response['message']['content'])
6.2 ユースケース2: 画像生成(Stable Diffusion)
- 想定読者: AIで画像を生成したい人
- 必要CUDAコア数目安: 2500以上(生成速度に直結)
- サンプルコード:
"""
Stable Diffusionで画像を生成する例
必要なパッケージ: pip install diffusers transformers accelerate torch
"""
from diffusers import StableDiffusionPipeline
import torch
# パイプラインの初期化(CUDA使用)
pipe = StableDiffusionPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5",
torch_dtype=torch.float16 # FP16で VRAM節約
)
pipe = pipe.to("cuda") # CUDAコアを使用
# 画像生成
prompt = "a beautiful sunset over mountains, digital art"
image = pipe(prompt, num_inference_steps=30).images[0]
# 保存
image.save("generated_image.png")
print("Image saved!")
6.3 ユースケース3: ディープラーニング学習
- 想定読者: 機械学習モデルをトレーニングしたい人
- 必要CUDAコア数目安: 5000以上(学習時間短縮のため)
- サンプルコード:
"""
簡単なニューラルネットワークの学習例
必要なパッケージ: pip install torch torchvision
"""
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader
from torchvision import datasets, transforms
# デバイス設定
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f"Using device: {device}")
# シンプルなモデル定義
class SimpleNet(nn.Module):
def __init__(self):
super().__init__()
self.fc1 = nn.Linear(784, 256)
self.fc2 = nn.Linear(256, 10)
def forward(self, x):
x = x.view(-1, 784)
x = torch.relu(self.fc1(x))
return self.fc2(x)
# モデルをGPUに転送
model = SimpleNet().to(device)
# 学習ループ(簡略版)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters())
# MNISTデータセットで学習
transform = transforms.ToTensor()
train_data = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
train_loader = DataLoader(train_data, batch_size=64, shuffle=True)
# 1エポックの学習
model.train()
for batch_idx, (data, target) in enumerate(train_loader):
data, target = data.to(device), target.to(device)
optimizer.zero_grad()
output = model(data)
loss = criterion(output, target)
loss.backward()
optimizer.step()
if batch_idx % 100 == 0:
print(f"Batch {batch_idx}, Loss: {loss.item():.4f}")
print("Training complete!")
ユースケースが把握できたところで、この記事を読んだ後の学習パスを確認しましょう。
7. 学習ロードマップ
この記事を読んだ後、次のステップとして以下をおすすめします。
初級者向け(まずはここから)
- PyTorch公式チュートリアル - CUDA入門
- OllamaやLM StudioでローカルLLMを体験
中級者向け(実践に進む)
- Tensorコアってなんだ? - AI専用回路の仕組みを学ぶ
- cuDNNってなんだ? - ライブラリレベルの最適化を理解
- llama.cppをCUDAビルドして速度比較
上級者向け(さらに深く)
- NVIDIA CUDA C++ Programming Guide
- CUDAカーネルを自分で書いてみる
- NVIDIA Nsight - GPUプロファイリングツール
8. まとめ
この記事では、CUDAコアについて以下を解説しました。
- CUDAコアは「単純計算の数の暴力」 - 個々の性能は低いが、数千個が並列動作
- SIMTアーキテクチャ - 同じ命令を複数スレッドで同時実行
- AI計算との相性 - 行列演算の並列化にぴったり
私の所感
CUDAコアの数字を見ると「多ければ多いほど良い」と思いがちですが、実際はアーキテクチャの世代も重要です。RTX 3080の8704コアとRTX 4080の9728コアを比較すると、後者のほうがコア数は少なめでも世代が新しく効率が良いため、性能は上回ります。
「コア数」だけでなく「世代」と「VRAM」を総合的に見ることが、GPU選びのコツです。
次の記事「Tensorコアってなんだ?」では、CUDAコアとは別にAI専用に設計された「Tensorコア」について解説します。