0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

CUDAコアってなんだ?〜GPU並列処理の心臓部を完全理解〜

0
Posted at

この記事の対象読者

  • 「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. 学習ロードマップ

この記事を読んだ後、次のステップとして以下をおすすめします。

初級者向け(まずはここから)

  1. PyTorch公式チュートリアル - CUDA入門
  2. OllamaやLM StudioでローカルLLMを体験

中級者向け(実践に進む)

  1. Tensorコアってなんだ? - AI専用回路の仕組みを学ぶ
  2. cuDNNってなんだ? - ライブラリレベルの最適化を理解
  3. llama.cppをCUDAビルドして速度比較

上級者向け(さらに深く)

  1. NVIDIA CUDA C++ Programming Guide
  2. CUDAカーネルを自分で書いてみる
  3. NVIDIA Nsight - GPUプロファイリングツール

8. まとめ

この記事では、CUDAコアについて以下を解説しました。

  1. CUDAコアは「単純計算の数の暴力」 - 個々の性能は低いが、数千個が並列動作
  2. SIMTアーキテクチャ - 同じ命令を複数スレッドで同時実行
  3. AI計算との相性 - 行列演算の並列化にぴったり

私の所感

CUDAコアの数字を見ると「多ければ多いほど良い」と思いがちですが、実際はアーキテクチャの世代も重要です。RTX 3080の8704コアとRTX 4080の9728コアを比較すると、後者のほうがコア数は少なめでも世代が新しく効率が良いため、性能は上回ります。

「コア数」だけでなく「世代」と「VRAM」を総合的に見ることが、GPU選びのコツです。

次の記事「Tensorコアってなんだ?」では、CUDAコアとは別にAI専用に設計された「Tensorコア」について解説します。


参考文献

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?