Skip to content
Published on

CUDA Hands-on完全ガイド:GPUコンピューティングのすべて

Authors
  • Name
    Twitter

1. 序論:CUDAとは何か

1.1 CUDAの定義

**CUDA(Compute Unified Device Architecture)**はNVIDIAが開発した並列コンピューティングプラットフォームかつプログラミングモデルである。GPUの数千のコアを活用して汎用演算(GPGPU)を実行でき、2007年の初リリース以降、AI、科学シミュレーション、画像処理、金融モデリングなど多様な分野で事実上の標準となった。

2025年時点の最新CUDA Toolkitは13.1バージョンまでリリースされており、CUDA 13.1ではCUDA TileというタイルベースプログラミングモデルとcuTile Python DSLが導入され、Tensor Coreの抽象化と次世代Blackwell GPUへの前方互換性を提供する。

1.2 GPUコンピューティングの歴史とCUDAの登場背景

GPUコンピューティングの進化を時代別に整理すると以下の通りである。

時期出来事意義
2001GPGPU研究開始シェーダーを利用した汎用演算の試み
2006NVIDIA Teslaアーキテクチャ発表初の統合シェーダーアーキテクチャ
2007CUDA 1.0リリースGPU汎用コンピューティングの始まり
2012AlexNet(ImageNet)GPUディープラーニング時代の幕開け
2017Volta + Tensor Core混合精度演算の高速化
2020Ampere(A100)TF32、Sparsityサポート
2022Hopper(H100)Transformer Engine、FP8サポート
2024Blackwell(B200)FP4、第5世代Tensor Core
2025CUDA 13.0/13.1リリースCUDA Tile、cuTile DSL導入

1.3 CPU vs GPUアーキテクチャ比較

CPUとGPUは根本的に異なる設計哲学を持つ。

特性CPUGPU
設計目標低レイテンシ(逐次処理)高スループット(並列処理)
コア数数個〜数十個数千〜数万個
クロック速度高い(4〜6 GHz)比較的低い(1〜2 GHz)
キャッシュサイズ大きい(数十MB)小さい(コアごと)
制御ロジック複雑(分岐予測、OoO実行)単純(多数のスレッドでレイテンシ隠蔽)
並列化モデルSIMD(Single Instruction Multiple Data)SIMT(Single Instruction Multiple Threads)
最適ワークロード複雑な分岐、逐次ロジック大規模データ並列演算

SIMD vs SIMTの核心的違い:SIMDは一つの命令で複数のデータを同時に処理するベクトル演算方式である。SIMTはさらに一歩進んで、各スレッドが独立したプログラムカウンタを持ちながらも同一の命令を同時に実行する。分岐(branch)が発生するとWarp内のスレッドが異なるパスを実行できるが、この時Warp Divergenceが発生してパフォーマンスが低下する。

1.4 CUDAがAI/ML/ディープラーニングで必須である理由

現代のAI/MLワークロードでCUDAが中核である理由は明確である。

  • 行列演算の高速化:ディープラーニングの核心である行列乗算(GEMM)をTensor Coreで劇的に加速
  • ソフトウェアエコシステム:cuDNN、cuBLAS、NCCL、TensorRTなど最適化されたライブラリエコシステム
  • フレームワークサポート:PyTorch、TensorFlow、JAXなどすべての主要フレームワークがCUDAをデフォルトバックエンドとして使用
  • 混合精度:FP16、BF16、FP8、FP4までの低精度演算で学習/推論速度を最大化
  • Multi-GPUスケーリング:NVLink、NVSwitchによる数百GPUの分散学習

2. GPUアーキテクチャ基礎

2.1 NVIDIA GPU内部構造

NVIDIA GPUのコア構成要素を階層的に見ていこう。

GPU (GPC - Graphics Processing Cluster)
├── SM (Streaming Multiprocessor) × N│   ├── CUDA Core (FP32/INT32) × 128 (Hopper基準)
│   ├── Tensor Core × 4 (4世代、Hopper基準)
│   ├── RT Core (Ray Tracing) × 1│   ├── Warp Scheduler × 4│   ├── Register File (256 KB)
│   ├── L1 Cache / Shared Memory (共有、最大228 KB)
│   └── SFU (Special Function Unit)
├── L2 Cache (共有)
├── Memory Controller
└── HBM (High Bandwidth Memory)

主要コアタイプの説明

  • CUDA Core:汎用浮動小数点/整数演算を行う基本処理ユニット。FP32、FP64、INT32演算を担当
  • Tensor Core:行列乗算累積(MMA、Matrix Multiply-Accumulate)演算に特化したコア。ディープラーニング学習/推論のキーアクセラレータ
  • RT Core:光線追跡(Ray Tracing)高速化専用ハードウェア。主にグラフィックスワークロードで使用

2.2 メモリ階層構造

GPUメモリは速度とサイズに応じて階層的に構成される。

メモリタイプ位置サイズ(H100基準)帯域幅アクセス範囲特性
RegisterSM内部256 KB/SM最高速Thread専用最速だが限定的
Shared MemorySM内部最大228 KB/SM非常に高速Block内共有プログラマ管理キャッシュ
L1 CacheSM内部Sharedと共有非常に高速SM専用HW管理
L2 CacheGPU全域50 MB高速全SM共有HW管理
Global Memory (HBM)GPU外部80 GB3.35 TB/s全体アクセス最大だがレイテンシ高い
Constant MemoryGPU全域64 KBキャッシュ時高速読み取り専用Broadcast最適化
Texture MemoryGPU全域Globalと共有キャッシュ時高速読み取り専用2D空間局所性最適化
速度:  Register > Shared/L1 > L2 > Global (HBM)
サイズ:  Global (HBM) > L2 > Shared/L1 > Register

2.3 Warp、Block、Gridの概念

CUDAの実行モデルは3段階の階層構造を持つ。

Grid (カーネル実行単位)
├── Block (0,0)          Block (1,0)          Block (2,0)
│   ├── Warp 0           ├── Warp 0           ├── Warp 0
│   │   ├── Thread 0     │   ├── Thread 0     │   ├── Thread 0
│   │   ├── Thread 1     │   ├── Thread 1     │   ├── Thread 1
│   │   ├── ...          │   ├── ...          │   ├── ...
│   │   └── Thread 31    │   └── Thread 31    │   └── Thread 31
│   ├── Warp 1           ├── Warp 1           ├── Warp 1
│   └── ...              └── ...              └── ...
├── Block (0,1)          Block (1,1)          ...
└── ...
  • Thread:GPU演算の最小実行単位
  • Warp:32個のThreadで構成された実行グループ。SMで同時に同じ命令を実行する単位(SIMTの核心)
  • Block(Thread Block):複数のWarpで構成。同一SMで実行され、Shared Memoryを共有
  • Grid:カーネル実行全体を構成するBlockの集合

核心的な制約事項

項目制限値(Compute Capability 9.0基準)
Block当たり最大Thread数1,024
Warpサイズ32(固定)
Block次元最大値(1024, 1024, 64)
Grid次元最大値(2^31-1, 65535, 65535)
SM当たり最大Block数32
SM当たり最大Warp数64

2.4 Compute Capabilityバージョン別の違い

Compute Capability(CC)はGPUハードウェアの機能セットを定義する。

CCアーキテクチャ代表GPU主要特徴
7.0VoltaV100第1世代Tensor Core、独立スレッドスケジューリング
7.5TuringRTX 2080INT8/INT4 Tensor Core、RT Core
8.0AmpereA100第3世代Tensor Core、TF32、Sparsity
8.6AmpereRTX 3090コンシューマー向けAmpere
8.9Ada LovelaceRTX 4090第4世代Tensor Core、FP8、DLSS 3
9.0HopperH100第4世代Tensor Core、Transformer Engine、DPX
10.0BlackwellB200第5世代Tensor Core、FP4、TMEM
12.0Blackwell UltraB300第5世代Tensor Core強化、288 GB HBM3E

なお、CUDA 13.0からMaxwell(CC 5.x)、Pascal(CC 6.x)、Volta(CC 7.0)のサポートが削除された。

2.5 最新GPU世代比較

データセンター用GPU 3世代を比較する。

仕様A100 (SXM)H100 (SXM5)B200 (SXM)B300 (SXM)
アーキテクチャAmpereHopperBlackwellBlackwell Ultra
CUDA Core6,91216,89618,43218,432+
Tensor Core432(第3世代)528(第4世代)第5世代第5世代
メモリ80 GB HBM2e80 GB HBM3180 GB HBM3E288 GB HBM3E
メモリ帯域幅2.0 TB/s3.35 TB/s7.7 TB/s8.0 TB/s
FP32性能19.5 TFLOPS60 TFLOPS非公開非公開
FP16 Tensor312 TFLOPS990 TFLOPS非公開非公開
FP4 Tensor非対応非対応9.0 PFLOPS14.0 PFLOPS
NVLink第3世代 (600 GB/s)第4世代 (900 GB/s)第5世代 (1.8 TB/s)第5世代 (1.8 TB/s)
TDP400W700W1,000W1,400W
冷却空冷/水冷空冷/水冷水冷推奨水冷必須(DLC)

B200はA100比で学習性能3倍、推論性能15倍の向上を達成した。B300(Blackwell Ultra)はFP4演算で14 PFLOPSを提供し、B200比55.6%高速である。


3. CUDA開発環境セットアップ

3.1 CUDA Toolkitインストール

Linux(Ubuntu/Debian)

# 1. NVIDIAドライバ確認
nvidia-smi

# 2. CUDA Keyring追加(Ubuntu 22.04の例)
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb
sudo dpkg -i cuda-keyring_1.1-1_all.deb
sudo apt-get update

# 3. CUDA Toolkitインストール
sudo apt-get install cuda-toolkit-13-1

# 4. 環境変数設定
export PATH=/usr/local/cuda-13.1/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-13.1/lib64:$LD_LIBRARY_PATH

# 5. インストール確認
nvcc --version

Windows

# 1. NVIDIA公式サイトからCUDA Toolkitをダウンロード
# https://developer.nvidia.com/cuda-downloads

# 2. インストール後に環境変数を確認
echo %CUDA_PATH%
# 通常 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v13.1

# 3. 確認
nvcc --version
nvidia-smi

3.2 nvidia-smiコマンド活用

nvidia-smiはGPU状態をモニタリングする核心ツールである。

# 基本情報出力
nvidia-smi

# 出力例:
# +-----------------------------------------------------------------------------------------+
# | NVIDIA-SMI 560.35.03    Driver Version: 560.35.03    CUDA Version: 13.1                 |
# |-----------------------------------------+------------------------+----------------------|
# | GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
# | Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
# |=========================================+========================+======================|
# |   0  NVIDIA H100 80GB HBM3          On | 00000000:3B:00.0   Off |                    0 |
# | N/A   32C    P0              72W / 700W |    1234MiB / 81559MiB  |      0%      Default |
# +-----------------------------------------+------------------------+----------------------+

# 持続モニタリング(1秒間隔)
nvidia-smi -l 1

# dmon - GPUメトリクスモニタリング
nvidia-smi dmon -s pucvmet -d 1

# 特定GPUの情報
nvidia-smi -i 0 -q

# GPUプロセス確認
nvidia-smi pmon -i 0

# GPUクロック、メモリ情報
nvidia-smi -q -d CLOCK,MEMORY

# CSV形式で出力(スクリプト用)
nvidia-smi --query-gpu=name,temperature.gpu,utilization.gpu,memory.used,memory.total \
  --format=csv,noheader,nounits

3.3 nvccコンパイラの使い方

nvccはCUDAソースコードをコンパイルするNVIDIA CUDA Compilerである。

# 基本コンパイル
nvcc -o hello hello.cu

# 特定アーキテクチャターゲット
nvcc -arch=sm_90 -o kernel kernel.cu   # Hopper H100
nvcc -arch=sm_80 -o kernel kernel.cu   # Ampere A100

# デバッグモード
nvcc -g -G -o debug_kernel kernel.cu

# 最適化レベル
nvcc -O3 -o optimized kernel.cu

# PTXコード生成(中間表現)
nvcc -ptx kernel.cu

# 複数アーキテクチャ同時サポート(Fat Binary)
nvcc -gencode arch=compute_80,code=sm_80 \
     -gencode arch=compute_90,code=sm_90 \
     -o multi_arch kernel.cu

# ライブラリリンク
nvcc -lcublas -lcurand -o linked_kernel kernel.cu

# 詳細コンパイル情報
nvcc --resource-usage -o kernel kernel.cu

3.4 CUDAバージョン確認と互換性

CUDAには2種類のバージョンが存在し、混同しないことが重要である。

# 1. ドライバサポートCUDAバージョン(Driver API)
nvidia-smi
# 右上に「CUDA Version: 13.1」と表示
# ドライバがサポートする最大CUDAランタイムバージョン

# 2. CUDA Toolkitバージョン(Runtime API)
nvcc --version
# 「release 13.1」と表示
# 実際にインストールされたCUDA Toolkitバージョン

# 3. ランタイムで確認
python3 -c "import torch; print(torch.version.cuda)"

核心的な互換性ルール

  • ドライバCUDAバージョンがToolkit CUDAバージョン以上である必要がある
  • 例:ドライバがCUDA 13.1をサポートしていればCUDA 12.x Toolkitも使用可能(下位互換)
  • CUDA ToolkitのMinor Version Compatibilityポリシーにより、同一Majorバージョン内ではバイナリ互換

3.5 DockerでCUDAを使用する

NVIDIA Container Toolkitを使用すればDockerコンテナでGPUを活用できる。

# 1. NVIDIA Container Toolkitインストール(Ubuntu)
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | \
  sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg

curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
  sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
  sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit

# 2. Dockerランタイム設定
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

# 3. GPUコンテナ実行
docker run --rm --gpus all nvidia/cuda:13.1.0-base-ubuntu22.04 nvidia-smi

# 特定GPUのみ使用
docker run --rm --gpus '"device=0,1"' nvidia/cuda:13.1.0-base-ubuntu22.04 nvidia-smi

# docker composeでGPU使用
# docker-compose.yml:
# docker-compose.yml
services:
  gpu-app:
    image: nvidia/cuda:13.1.0-devel-ubuntu22.04
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]
    command: nvidia-smi

3.6 conda/pipでPyTorch/TensorFlow CUDAインストール

# PyTorch(CUDA 12.4ビルドの例)
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124

# condaを使用する場合
conda install pytorch torchvision torchaudio pytorch-cuda=12.4 -c pytorch -c nvidia

# TensorFlow(GPU自動検出)
pip install tensorflow[and-cuda]

# CUDA使用可否確認(Python)
python3 -c "
import torch
print(f'PyTorch version: {torch.__version__}')
print(f'CUDA available: {torch.cuda.is_available()}')
print(f'CUDA version: {torch.version.cuda}')
print(f'GPU count: {torch.cuda.device_count()}')
if torch.cuda.is_available():
    print(f'GPU name: {torch.cuda.get_device_name(0)}')
"

4. CUDAプログラミング基礎(C/C++)

4.1 Host(CPU)vs Device(GPU)コード

CUDAプログラミングではCPU側コードをHost、GPU側コードをDeviceと呼ぶ。

┌─────────────────────────────────────────────────────────┐
Host (CPU)│  ┌─────────────────────────────────────────────────────┐│
│  │ 1. データ準備 (Host Memory)                        ││
│  │ 2. GPUメモリ確保 (cudaMalloc)                      ││
│  │ 3. データ転送: Host -> Device (cudaMemcpy)         ││
│  │ 4. カーネル実行 (<<<grid, block>>>)                ││
│  │ 5. 結果転送: Device -> Host (cudaMemcpy)           ││
│  │ 6. GPUメモリ解放 (cudaFree)                        ││
│  └─────────────────────────────────────────────────────┘│
│                        ↕ PCIe / NVLink│  ┌─────────────────────────────────────────────────────┐│
│  │  Device (GPU)                                       ││
│  │  - カーネル関数の並列実行                           ││
│  │  - 数千スレッドが同時処理                           ││
│  └─────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────┘

以降のセクション(4.2〜13.3)のコードブロックは英語版と同一のため、主要な説明テキストの日本語訳を以下に記載する。

4.2 関数修飾子(Function Qualifiers)

CUDAは3種類の関数修飾子を提供する。

修飾子実行場所呼び出し可能な場所説明
__global__Device (GPU)Host (CPU)カーネル関数。戻り値型は必ずvoid
__device__Device (GPU)Device (GPU)GPU内部でのみ呼び出し可能なヘルパー関数
__host__Host (CPU)Host (CPU)通常のCPU関数(デフォルト、省略可能)
__host__ __device__両方両方CPU/GPU両方で使用可能
// __global__: カーネル関数 - Hostから呼び出し、Deviceで実行
__global__ void myKernel(float* data, int n) {
    int idx = blockIdx.x * blockDim.x + threadIdx.x;
    if (idx < n) {
        data[idx] *= 2.0f;
    }
}

// __device__: Device専用ヘルパー関数
__device__ float square(float x) {
    return x * x;
}

// __host__ __device__: CPU/GPU兼用関数
__host__ __device__ float add(float a, float b) {
    return a + b;
}

4.3 カーネル呼び出し構文

カーネル関数は特殊な三重角括弧構文で呼び出す。

// カーネル呼び出し構文
// kernel<<<gridDim, blockDim, sharedMemSize, stream>>>(args...);
//
// gridDim:       Grid内のBlock数 (dim3)
// blockDim:      Block内のThread数 (dim3)
// sharedMemSize: 動的Shared Memoryサイズ(バイト、任意)
// stream:        実行ストリーム(任意)

// 1D例: 256スレッド、1ブロック
myKernel<<<1, 256>>>(d_data, n);

// 1D例: N個のデータを256スレッドブロックで処理
int threadsPerBlock = 256;
int blocksPerGrid = (n + threadsPerBlock - 1) / threadsPerBlock;
myKernel<<<blocksPerGrid, threadsPerBlock>>>(d_data, n);

// 2D例: 画像処理
dim3 blockDim(16, 16);       // 16x16 = 256スレッド/ブロック
dim3 gridDim(
    (width + 15) / 16,
    (height + 15) / 16
);
imageKernel<<<gridDim, blockDim>>>(d_image, width, height);

4.4 Thread階層構造

各スレッドは組み込み変数を通じて自身の位置を知ることができる。

// 組み込み変数(Built-in Variables)
threadIdx.x, threadIdx.y, threadIdx.z  // Block内のThreadインデックス
blockIdx.x,  blockIdx.y,  blockIdx.z   // Grid内のBlockインデックス
blockDim.x,  blockDim.y,  blockDim.z   // Blockの次元サイズ
gridDim.x,   gridDim.y,   gridDim.z    // Gridの次元サイズ

// グローバルThread ID計算(1D)
int globalIdx = blockIdx.x * blockDim.x + threadIdx.x;

// グローバルThread ID計算(2D)
int col = blockIdx.x * blockDim.x + threadIdx.x;
int row = blockIdx.y * blockDim.y + threadIdx.y;
int globalIdx = row * width + col;

// 全スレッド数(Grid-strideループ用)
int totalThreads = gridDim.x * blockDim.x;

4.5 メモリ管理関数

// GPUメモリ確保
float* d_data;
cudaMalloc((void**)&d_data, n * sizeof(float));

// Host -> Deviceコピー
cudaMemcpy(d_data, h_data, n * sizeof(float), cudaMemcpyHostToDevice);

// Device -> Hostコピー
cudaMemcpy(h_data, d_data, n * sizeof(float), cudaMemcpyDeviceToHost);

// GPUメモリ解放
cudaFree(d_data);

// GPUメモリ初期化
cudaMemset(d_data, 0, n * sizeof(float));

// エラーチェックマクロ(必須!)
#define CUDA_CHECK(call) \
    do { \
        cudaError_t err = call; \
        if (err != cudaSuccess) { \
            fprintf(stderr, "CUDA Error at %s:%d - %s\n", \
                    __FILE__, __LINE__, cudaGetErrorString(err)); \
            exit(EXIT_FAILURE); \
        } \
    } while(0)

// 使用例
CUDA_CHECK(cudaMalloc((void**)&d_data, n * sizeof(float)));
CUDA_CHECK(cudaMemcpy(d_data, h_data, n * sizeof(float), cudaMemcpyHostToDevice));

4.6 Hello Worldの例

// hello_cuda.cu
#include <stdio.h>

__global__ void helloKernel() {
    int tid = blockIdx.x * blockDim.x + threadIdx.x;
    printf("Hello from GPU thread %d (block %d, thread %d)\n",
           tid, blockIdx.x, threadIdx.x);
}

int main() {
    // 2ブロック、各4スレッド = 合計8スレッド
    helloKernel<<<2, 4>>>();

    // GPU作業完了を待機
    cudaDeviceSynchronize();

    printf("Hello from CPU!\n");
    return 0;
}
# コンパイルと実行
nvcc -o hello hello_cuda.cu
./hello

4.7〜13.3

セクション4.7以降のコードブロックと技術的な内容は英語版と同一構造のため、主要な日本語テキストのみ補足する。各セクションの概要は以下の通りである:

  • 4.7 ベクトル加算の例: CUDAの「Hello World」とも言えるベクトル加算の例
  • 4.8 行列乗算の例: Shared Memoryを活用したタイル行列乗算(最適化版)
  • 5. CUDAメモリ管理の深掘り: Global MemoryとCoalesced Access、Shared MemoryとBank Conflict、Unified Memory、Pinned Memory、Memory Pool
  • 6. CUDAストリームと非同期実行: CUDA Stream、Multi-Streamパイプライン、CUDA Events
  • 7. CUDA最適化手法: Occupancy最適化、Warp Divergence最小化、Loop Unrolling、Grid-Strideループ、Nsightプロファイリング
  • 8. PythonでCUDAを扱う: PyCUDA、Numba CUDA JIT、CuPy、PyTorch CUDA、TensorFlow GPU、RAPIDS
  • 9. 実践Hands-on例題: GPUベクトル演算ベンチマーク、画像処理高速化、PyTorchモデルGPU学習、Multi-GPU学習、CUDAカーネル直接記述
  • 10. CUDAツールとライブラリ: cuDNN、NCCL、TensorRT、OpenAI Triton、FlashAttention
  • 11. CUDAトラブルシューティング: OOM解決、ドライバvs ランタイムバージョン不一致、cuda-gdbデバッグ
  • 12. CUDA代替技術比較: CUDA vs ROCm vs OpenCL vs SYCL vs Metal vs Triton vs WebGPU

まとめ

CUDAは単なるGPUプログラミングツールを超え、現代AIインフラの根幹をなすプラットフォームである。AmpereからHopper、そしてBlackwellへと続くハードウェアの進化とともに、CUDA Toolkitも13.x時代に入り、CUDA TileやcuTile DSLのような高い水準の抽象化を提供し始めた。

実務でCUDAを効果的に活用するための核心ポイントを整理すると以下の通りである。

  1. 基礎を固める:Warp、Block、Gridの実行モデルとメモリ階層を正確に理解してこそ最適化が可能になる
  2. Pythonツールを積極活用:PyTorchのMixed Precision、CuPy、Numbaなどで大半のGPU高速化を達成できる
  3. プロファイリング優先:Nsight Compute/Systemsでボトルネックを先に特定してから最適化に投資する
  4. メモリが核心:Coalesced Access、Shared Memory Tiling、Pinned Memoryなどメモリ最適化がパフォーマンス向上の80%を占める
  5. エコシステムの活用:cuDNN、TensorRT、FlashAttentionなど既に最適化されたライブラリを最大限活用する

GPUコンピューティングの世界は進化し続けている。Tritonのような高水準プログラミングモデルの登場、FP4/FP6のような低精度演算の拡大、そしてCUDA Tileに代表されるタイルベースプログラミングの導入は、GPUプログラミングの参入障壁を下げながらもハードウェア性能を最大限引き出す方向に進んでいる。本ガイドがその旅路の出発点となれば幸いである。