CUDA(Compute Unified Device Architecture:クーダ)とは、NVIDIAが開発・提供している、GPU向けの汎用並列コンピューティングプラットフォーム(並列コンピューティングアーキテクチャ)およびプログラミングモデルである。専用のC/C++コンパイラ (nvcc) やライブラリ (API) などが提供されている。なおNVIDIA製GPUにおいては、OpenCL/DirectComputeなどの類似APIコールは、すべて共通のGPGPUプラットフォームであるCUDAを経由することになる。

## 概要

もともとリアルタイムグラフィックス表示用途、特にゲームグラフィックス用途に特化したGPUを開発していたのがNVIDIAやATI (現AMD) であるが、プログラマブルシェーダーの発展によるプログラマビリティの向上を受け、その高い処理性能をグラフィックス以外にも活用できるようにするためにNVIDIAが開発した技術がCUDAである。このような汎用コンピューティング向けのGPU活用技術をGPGPU (General-Purpose computing on Graphics Processing Units) と呼ぶ。

GPU向けのプログラミング環境としてはHLSLやGLSL、NVIDIA Cgを用いたものもあるが、こちらはDirect3DもしくはOpenGLをバックエンドとするリアルタイムCG描画専用のプログラミング環境となっており、変数の型にGPU特有の型しか使えない(特に出力として用いるテクスチャメモリのフォーマットに制約が大きい)など汎用的なプログラムの記述は困難である。CUDAでは、HLSLやGLSLと異なり、よりC言語に近い構文および言語機能(ポインタなどを含む)を採用しており、またDirect3D/OpenGLといったバックエンドを使うことなくプログラムロジックを記述できるため、汎用コンピューティングに適している。

GPUはシンプルな演算ユニットを多数搭載しており、ピーク理論演算性能 (FLOPS) は同一価格帯のCPUをしのぐものもある。そのため、並列性や演算密度の高い処理を行なう場合、少数で複雑な構成を備えた同規模のCPUと比べて高い処理性能が出せる。
その逆に複雑な分岐処理(演算密度の低い処理)はCPUと比較して苦手であり、またGPUへ入力データを供給する、あるいはGPUによる演算結果をCPU側へリードバックするには接続バス (PCI-Express) を通してデータを転送する必要があり、これがボトルネックとなりうる可能性もあるため、適用分野や問題を解くアルゴリズムを慎重に選ぶ必要がある。

また、CUDAで作成したプログラムを最大限最適化するためには、Warpや共有メモリなどのNVIDIA GPUデバイスアーキテクチャに関する深い知識も必要となる。

なお、CUDAと初対応のGeForce 8 シリーズ(G8x)の発表は2006年11月8日、最初のCUDA SDKのβ版のリリース日は2007年2月16日、CUDA 1.0の提供開始は2007年7月17日であり、後発のGPGPU関連技術にはOpenCL (1.0仕様公開は2008年) やDirectCompute (DirectXコンピュートシェーダー。Windows 7/DirectX 11.0と同時に2009年に一般提供開始) などが存在するが、それぞれ技術用語は異なるものの全体としてはCUDAに非常に似通った特徴を持つ。先発技術であるCUDAは、2014年時点で教育・研究機関での採用事例が多いほか、機械学習などの分野で産業界でも採用への取り組みが進んでいる。

## 対応言語

CUDA C はC言語とC++の一部の構文のみ対応。C言語を拡張している。CUDA C/C++のソースコードの拡張子には通例.cuが使われ、ヘッダーの拡張子には.cuhが使われる。BLASインターフェイス経由でベクトル・行列演算が可能(cuBLAS)。FFTライブラリ(cuFFT)も付属する。SDKとなるCUDA Toolkitには、CUDA実装によるC++向けのテンプレートベース並列アルゴリズムライブラリ「Thrust」も付属する。

なおCUDAバージョン7では、C++11規格のサポートが強化され、デバイスコードにおけるラムダ式の利用などが可能となっている。
CUDAバージョン8では、機械学習向けのライブラリが強化され、Pascalアーキテクチャの固有機能を利用した拡張が多数追加された。

CUDA Fortran は The Portland Group (PGI) から提供されている。Fortran 2003 を拡張している。

NVIDIAのCUDAコンパイラnvcc自体はLLVMベースであり、新しいプログラミング言語や新しいプロセッサのサポートを追加するコンパイラSDKも提供されている。

### 言語バインディング

C++以外からCUDAを呼べるようにしたバインディングがある。

- Python - CUDA Python、PyCUDA、Numba CUDA
- Java - JCuda(JCublas, JCufft, JCurand, JCusparse, JCusolver, JNvgraph, JCudpp, JNpp, JCudnn)
- Julia - CUDA.jl

他にも、Ruby, Lua, MATLAB, IDL, Mathematica などもある。

## CUDA-X

NVIDIAはCUDA上で構築したライブラリの総称をCUDA-Xと呼んでいる。以下のものが含まれる。

- 数学
  - cuBLAS - BLASのライブラリ
  - cuFFT - 高速フーリエ変換
  - CUDA Math Library
  - cuRAND - 疑似乱数生成
  - cuSOLVER - LAPACKに対応
  - cuSPARSE - 疎行列
  - cuTENSOR - テンソル(多次元配列)
  - cuDSS - 疎行列の AX = B を解くライブラリ
  - AmgX
- 並列アルゴリズム
  - Thrust
- 計算機リソグラフィ
  - cuLitho
- 画像と動画
  - CV-CUDA
  - nvJPEG
  - NVIDIA Performance Primitives
  - NVIDIA Video Codec SDK
  - NVIDIA Optical Flow SDK
- 通信ライブラリ
  - NVSHMEM
  - NCCL
- ディープラーニング
  - NVIDIA cuDNN
  - NVIDIA TensorRT
  - NVIDIA Riva
  - NVIDIA DeepStream SDK
  - NVIDIA DALI

## OpenGL/Direct3D相互運用

CUDAにはOpenGLおよびDirect3D 9/10/11との連携を可能にする相互運用APIが用意されている。詳しくは
CUDA Runtime API :: CUDA Toolkit Documentation - 3.10. OpenGL Interoperability,
CUDA Runtime API :: CUDA Toolkit Documentation - 3.16. Direct3D 11 Interoperability
などを参照のこと。

## 開発ツール

CUDA ToolkitにはVisual Profilerと呼ばれるパフォーマンス計測ツールが付属し、アプリケーションにおけるGPUの処理時間などの情報を収集して、性能改善に役立てることができる。CUDA Toolkit 7.5では命令レベルでのプロファイリングがサポートされた。Nsight (旧称Parallel Nsight) と呼ばれる統合開発環境向けのアドインも提供されている。

## メリット・デメリット

ここでは従来のCPUベースのプログラミングとの比較ではなく、類似のGPGPU関連技術とCUDAとの比較を行なう。

### メリット

CUDAはNVIDIAが独自に開発を進めているGPGPU技術であり、NVIDIA製のハードウェア性能を最大限引き出せるように設計されている。CUDAを利用することで、NVIDIA製GPUに新しく実装されたハードウェア機能をいち早く活用することができる。例えばKepler世代以降のGPUで使用可能なWarpシャッフル命令を使用することで、共有メモリを介するよりもさらに高速な並列リダクションを実行することができる。CUDA同様の類似GPGPU技術として代表的なものはOpenCLやDirectComputeが挙げられるが、いずれもハードウェアアーキテクチャを標準化しベンダーの違いを吸収するAPI層であるため、CUDAと比較すると抽象化の度合いは低いローレベルAPIではあるものの、ハードウェア特有の先進的機能を使った細やかなチューニングによりそのハードウェアの限界性能を引き出すのは難しい。

また、OpenCLやDirectComputeでは、カーネルと呼ばれるデバイス用並列処理プログラムコード片(並列実行の最小単位)を専用のOpenCL-CやHLSLといった言語で記述した上で、OpenCL APIやDirect3D APIを使用してカーネルを発行する必要があるため、準備のための手間が必要となるが、CUDAの場合はより抽象化されており、カーネルコードの発行をC/C++における通常の関数呼び出しに近い形で記述できるなど、より本質的なアプリケーションコードやアルゴリズムの実装のみに注力できるようになっている。

### デメリット

ハードウェアベンダーに依存しないOpenCLやDirectComputeと比較すると、CUDAはNVIDIA製のGPUでしか使えないという制約がある。このため、CUDAの機能に過度に依存したプログラムを書くと、アプリケーションのポーティング・移植が困難になる可能性がある(ベンダーロックイン)。AMDはCUDAアプリケーションをAMDおよび他のGPUプラットフォーム向けにソースコードレベルで移植しやすくするためのC++用APIとして、HIP (Heterogeneous-Compute Interface for Portability) の提供を開始したが、CUDAと完全な互換性を持っているわけではない。

また、最初からグラフィックス連携用途を想定して設計されたDirectComputeと比較すると、(相互運用APIが用意されているとはいえ)GPU演算結果をグラフィックス用途に直接利用する場合はオーバーヘッドが大きくなる。

## 対応環境

### ハードウェア

DirectX 10世代(G80世代)以降の統合型シェーダーアーキテクチャを採用したNVIDIA製GPUがCUDAに対応している。

- NVIDIA GeForce 8シリーズ以降(一般/ゲーミング向け)
- NVIDIA Quadro G80ベース以降(ワークステーション向け)
- NVIDIA Tesla(ハイパフォーマンスコンピューティング/データセンター向け)
- NVIDIA Jetson(組み込み用)
- NVIDIA Tegra K1以降(モバイル向けの統合型プロセッサ)
- NVIDIA ION(ネットブック/ネットトップデバイス用、サポート終了)

実行には専用のデバイスドライバーを必要とする。詳細は、
CUDA GPUs | NVIDIA Developer Zone を参照。なお、ハードウェアの世代/アーキテクチャ(Compute Capability, CC)によって利用可能なGPU命令やリソースサイズ上限、倍精度浮動小数点対応可否などの制約が異なる。また、上位のCCを持つハードウェアでは、下位のCC向けにコンパイルされたCUDAコードを実行できるが、その逆は不可能となっている。

#### PTX (Parallel Thread Execution)

CUDAは実行環境デバイスの世代(Compute Capability)に応じた専用バイナリコードを生成できるほかに、PTX (Parallel Thread Execution) と呼ばれるNVIDIA独自のGPU中間命令(中間言語)を生成することができる。PTXを利用することで、実行時にCUDAドライバーによって実行環境に合わせた最適なコードを生成することができるようになる。

### OS

CUDA Toolkit 6.5の対応OSは、Windows XP (32bit版のみ)、Windows 7、Windows 8.1、Windows Server 2008 R2、Windows Server 2012 R2、Fedora 20、OpenSUSE 13.1、RHEL (Red Hat Enterprise Linux) 5/6、CentOS 5/6、SLES (SUSE Linux Enterprise Server) 11-SP3、Ubuntu 12.04/14.04、Mac OS X 10.8/10.9/10.10である。

CUDA Toolkit 7.0の対応OSは、Windows 7、Windows 8.1、Windows Server 2008 R2、Windows Server 2012 R2、Fedora 21、OpenSUSE 13.1/13.2、RHEL 6/7、CentOS 6/7、SLES 11/12、Ubuntu 12.04/14.04/14.10、OS X 10.9/10.10である。

CUDA Toolkit 7.5の対応OSは、Windows 7、Windows 8.1、Windows 10、Windows Server 2008 R2、Windows Server 2012 R2、Fedora 21、OpenSUSE 13.2、RHEL 6/7、CentOS 6/7、SLES 11/12、SteamOS 1.0-beta、Ubuntu 14.04/15.04、OS X 10.9/10.10/10.11である。

CUDA Toolkit 8.0 GA2の対応OSは、Windows 7、Windows 8.1、Windows 10、Windows Server 2008 R2、Windows Server 2012 R2、Windows Server 2016、Fedora 23、OpenSUSE 13.2、RHEL 6/7、CentOS 6/7、SLES 11/12、Ubuntu 14.04/16.04、OS X 10.11/10.12である。

CUDA Toolkit 9.2の対応OSは、Windows 7、Windows 8.1、Windows 10、Windows Server 2012 R2、Windows Server 2016、Fedora 27、OpenSUSE Leap 42.3、RHEL 6/7、CentOS 6/7、SLES 12、Ubuntu 16.04/17.10、OS X 10.13である。

CUDA Toolkit 10.2の対応OSは、Windows 7、Windows 8.1、Windows 10、Windows Server 2012 R2、Windows Server 2016、Windows Server 2019、Fedora 29、OpenSUSE 15、RHEL 6/7/8、CentOS 6/7/8、SLES 1512 SP4、Ubuntu 16.04/18.04、OS X 10.13である。

CUDA Toolkit 11.8の対応OSは、Windows 10、Windows 11、Windows Server 2016、Windows Server 2019、Windows Server 2022、Fedora 35、OpenSUSE 15、RHEL 7/8/9、CentOS 7、SLES 15、Ubuntu 18.04/20.04/22.04、Debian 11、KylinOS 10、Rocky 8/9、WSL-Ubuntu 2.0である。CUDA Toolkit 11.0以降、macOSはサポート対象外となった。ただしリモートデバッグ用のツールだけはmacOS上でもサポートされている。

CUDA Toolkit 12.1の対応OSは、Windows 10、Windows 11、Windows Server 2019、Windows Server 2022、Fedora 37、OpenSUSE 15、RHEL 7/8/9、CentOS 7、SLES 15、Ubuntu 18.04/20.04/22.04、Debian 10/11、KylinOS 10、Rocky 8/9、WSL-Ubuntu 2.0である。

## NVIDIA OptiX

CUDA基盤上に実装されたプログラマブルGPUレイトレーシングエンジンとして、NVIDIAはOptiXを公開している。OptiX 3.xまではFermi世代以降、OptiX 4.xはKepler世代以降のNVIDIA GPU上で利用可能。OptiX 6/7はMaxwell世代以降のNVIDIA GPU上で利用可能。なお、After Effects CCではレイトレーシングエンジンにOptiXを採用している。

## 対応ソフトウェア

CUDAの演算処理技術を利用するには、上述のハードウェア・OSのサポートに加えて、アプリケーションが対応していることが必要。一部アプリケーションベンダーより対応ソフトが出ている。

- Freemake Video Converter (Free Make)(自由ソフトウェア)
- MediaCoder (MediaCoder)(自由ソフトウェア)
- LoiLoTouch (LoiLo)
- Super LoiLoScope (LoiLo)
- EDIUS
- VideoStudio (COREL)
- WinDVD (COREL)
- PowerDirector (CyberLink)
- PowerDVD (CyberLink)
- TMPGEnc (ペガシス)
- Adobe Photoshop CS4(アドビ)
- Adobe After Effects CS4(アドビ)
- Adobe Premiere Pro CS4(アドビ)
- Blender (GPLの自由ソフトウェア)
- Vegas Pro 10 (Sony Creative Software)
- パスゲッター(インターナル)
- Any Video Converter(自由ソフトウェア・シェアソフトウェア)

### 分散コンピューティング

これらはBOINCクライアント上でCUDAを利用する。

- SETI@Home
- MilkyWay@home
- GPUGRID (PS3GRID)
- AQUA@home
- Folding@Home(このプロジェクトのみ、オリジナルのクライアントで動作)

### MATLAB

MATLABとのコラボレーションもサポートされている。MATLABではParallel Computing Toolboxを介してGPUを使用できる。重いプログラムスクリプト実行の高速化に寄与する。ただしCUDAの初期化およびメインメモリ-VRAM間のデータ転送に時間がかかるため、短いスクリプトの場合は逆にトータル処理時間でみるとCPUだけ使用するときよりも遅くなる場合もある。Intel Xeon X5650を使った場合と比べて、NVIDIA Tesla C2050を使うことでFFTが最大3.5倍高速化されたとの説明がある。

### OpenCV

OpenCV 2.2でCUDAを使ったアクセラレータであるgpuモジュールが追加された。OpenCV 3.0ではcudaモジュールに改称された。

## 関連書籍

- Jason Sanders, Edward Kandrot:『CUDA by Example: An Introduction to General-Purpose GPU Programming:汎用GPUプログラミング入門』, インプレスジャパン、ISBN 978-4-8443-2978-7 (2011年2月11日).

- David B. Kirk, Wen-mei W. Hwu: Programming Massively Parallel Processors: A Hands-on Approach, Morgan Kaufmann, ISBN 978-0-12-381472-2 (2010).
- Rob Farber: CUDA Application Design and Development, Morgan Kaufmann, ISBN 978-0-12-388426-8 (2011).
- Shane Cook: CUDA Programming: A Developer's Guide to Parallel Computing with GPUs, Morgan Kaufmann, ISBN 978-0-12-415933-4 (2013).
- John Cheng, Max Grossman, Ty Mckercher: 『CUDA C プロフェッショナルプログラミング』, インプレス、ISBN 978-4-8443-3891-8 (2014年9月21日).
- Gregory Ruetsch, Massimiliano Fatica: CUDA Fortran for Scientists and Engineers, Morgan Kaufmann, ISBN 978-0-12-416970-8 (2014).