CUDA

AIフレームワーク | IT用語集

この用語をシェア

概要

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限定
  • 高いハードウェアコスト
  • 学習コスト
  • メモリ制限
  • 電力消費が大きい

関連Webサイト

この用語についてもっと詳しく

CUDAに関するご質問や、システム導入のご相談など、お気軽にお問い合わせください。