この用語をシェア
概要
CUDA(Compute Unified Device Architecture)は、NVIDIAが開発したGPU並列計算プラットフォームです。機械学習の高速化に広く利用され、TensorFlow、PyTorchなどのAIフレームワークと統合されています。数千のコアを持つGPUの並列処理能力を活用し、CPUと比較して大幅な計算速度向上を実現します。
詳細説明
主な特徴
- 並列処理:数千のコアによる大規模並列計算
- 高速化:CPUと比較して数十倍から数百倍の高速化
- 柔軟性:C、C++、Python、FortranなどのプログラミングUniverseを利用可能
- 統合性:主要な機械学習フレームワークでサポート
- スケーラビリティ:単一GPUから複数GPUクラスター環境まで対応
アーキテクチャ
- ストリーミングマルチプロセッサ(SM):複数のCUDAコアを含む処理単位
- CUDAコア:実際の計算を行う演算ユニット
- メモリ階層:グローバル、共有、レジスター、コンスタントメモリ
- スレッド階層:スレッド、ブロック、グリッドの3階層構造
- Tensor コア:AI計算に特化した演算ユニット(新世代GPU)
使用例
基本的なCUDAプログラム(C++)
#include
#include
// CUDAカーネル関数
__global__ void vectorAdd(float *a, float *b, float *c, int n) {
int i = blockIdx.x * blockDim.x + threadIdx.x;
if (i < n) {
c[i] = a[i] + b[i];
}
}
int main() {
const int n = 1000000;
size_t size = n * sizeof(float);
// ホストメモリの確保
float *h_a = (float*)malloc(size);
float *h_b = (float*)malloc(size);
float *h_c = (float*)malloc(size);
// データの初期化
for (int i = 0; i < n; i++) {
h_a[i] = i;
h_b[i] = i * 2;
}
// デバイスメモリの確保
float *d_a, *d_b, *d_c;
cudaMalloc(&d_a, size);
cudaMalloc(&d_b, size);
cudaMalloc(&d_c, size);
// ホストからデバイスへデータ転送
cudaMemcpy(d_a, h_a, size, cudaMemcpyHostToDevice);
cudaMemcpy(d_b, h_b, size, cudaMemcpyHostToDevice);
// カーネルの実行
int blockSize = 256;
int numBlocks = (n + blockSize - 1) / blockSize;
vectorAdd<<>>(d_a, d_b, d_c, n);
// デバイスからホストへデータ転送
cudaMemcpy(h_c, d_c, size, cudaMemcpyDeviceToHost);
// メモリの解放
cudaFree(d_a);
cudaFree(d_b);
cudaFree(d_c);
free(h_a);
free(h_b);
free(h_c);
return 0;
}
PyCUDAを使ったPythonプログラム
import pycuda.driver as cuda
import pycuda.autoinit
from pycuda.compiler import SourceModule
import numpy as np
# CUDAカーネルコード
mod = SourceModule(\"\"\"
__global__ void matrix_multiply(float *a, float *b, float *c, int n) {
int row = blockIdx.y * blockDim.y + threadIdx.y;
int col = blockIdx.x * blockDim.x + threadIdx.x;
if (row < n && col < n) {
float sum = 0.0f;
for (int i = 0; i < n; i++) {
sum += a[row * n + i] * b[i * n + col];
}
c[row * n + col] = sum;
}
}
\"\"\")
# カーネル関数の取得
matrix_multiply = mod.get_function("matrix_multiply")
# 行列のサイズ
n = 1024
# ホストメモリの確保と初期化
a = np.random.randn(n, n).astype(np.float32)
b = np.random.randn(n, n).astype(np.float32)
c = np.zeros((n, n), dtype=np.float32)
# デバイスメモリの確保
a_gpu = cuda.mem_alloc(a.nbytes)
b_gpu = cuda.mem_alloc(b.nbytes)
c_gpu = cuda.mem_alloc(c.nbytes)
# データ転送
cuda.memcpy_htod(a_gpu, a)
cuda.memcpy_htod(b_gpu, b)
# カーネル実行
block_size = 16
grid_size = (n + block_size - 1) // block_size
matrix_multiply(
a_gpu, b_gpu, c_gpu, np.int32(n),
block=(block_size, block_size, 1),
grid=(grid_size, grid_size)
)
# 結果の取得
cuda.memcpy_dtoh(c, c_gpu)
print(f"行列乗算完了: {n}x{n}")
TensorFlowでのCUDA使用
import tensorflow as tf
import numpy as np
# GPUの確認
print("利用可能なGPU:", tf.config.list_physical_devices('GPU'))
# GPU使用の設定
if tf.config.list_physical_devices('GPU'):
print("GPUが利用可能です")
tf.config.experimental.set_memory_growth(
tf.config.list_physical_devices('GPU')[0], True
)
else:
print("GPUが利用できません")
# 大きな行列の作成
with tf.device('/GPU:0'):
a = tf.random.normal([5000, 5000])
b = tf.random.normal([5000, 5000])
# GPU上での行列乗算
c = tf.matmul(a, b)
print(f"行列乗算結果のサイズ: {c.shape}")
print(f"GPU上で計算実行: {c.device}")
PyTorchでのCUDA使用
import torch
import time
# CUDA利用可能性の確認
print(f"CUDA利用可能: {torch.cuda.is_available()}")
print(f"CUDA デバイス数: {torch.cuda.device_count()}")
if torch.cuda.is_available():
device = torch.device('cuda')
print(f"使用デバイス: {torch.cuda.get_device_name(0)}")
else:
device = torch.device('cpu')
# 大きなテンソルの作成
size = 5000
a = torch.randn(size, size).to(device)
b = torch.randn(size, size).to(device)
# GPU上での行列乗算
start_time = time.time()
c = torch.matmul(a, b)
torch.cuda.synchronize() # GPU処理の完了を待つ
end_time = time.time()
print(f"計算時間: {end_time - start_time:.4f}秒")
print(f"結果のサイズ: {c.shape}")
print(f"計算デバイス: {c.device}")
関連技術
- cuDNN:深層学習用のCUDAライブラリ
- cuBLAS:線形代数演算ライブラリ
- cuFFT:高速フーリエ変換ライブラリ
- Thrust:C++テンプレートライブラリ
- NCCL:マルチGPU通信ライブラリ
- TensorRT:推論の最適化・高速化
適用分野
- 深層学習モデルの訓練・推論
- 科学計算・数値シミュレーション
- 画像・動画処理
- 暗号通貨マイニング
- 金融リスク計算
- バイオインフォマティクス
- 気象予測・気候モデリング
対応GPU・システム要件
対応GPU
- GeForce RTX 40シリーズ:Ada Lovelace アーキテクチャ
- GeForce RTX 30シリーズ:Ampere アーキテクチャ
- GeForce RTX 20シリーズ:Turing アーキテクチャ
- Tesla/Quadro シリーズ:プロフェッショナル用途
- A100, H100:データセンター向け
システム要件
- CUDA対応NVIDIA GPU
- 適切なNVIDIA ドライバー
- CUDA Toolkit のインストール
- 十分なGPUメモリ
メリット・デメリット
メリット
- 大幅な計算速度向上
- 豊富なライブラリとツール
- 主要フレームワークとの統合
- 活発なコミュニティサポート
- 継続的な技術進歩
デメリット
- NVIDIA GPU限定
- 高いハードウェアコスト
- 学習コスト
- メモリ制限
- 電力消費が大きい