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

概要 thumb|300px|right|CUDAの処理の流れ 1. メインメモリ(ホストメモリ)からデータをGPU用メモリ(デバイスメモリ)にコピーする。 2. CPUがGPUに対して処理を指示する。 3. GPUが必要なデータを取り込み各コアで並列実行する。 4. 結果をGPU用メモリからメインメモリにコピーする。日経エレクトロニクス 2007/10/8 「プロセサはマルチ×マルチへ」第7回 CUDAプログラミングモデル② | G-DEP:

もともとリアルタイムグラフィックス表示用途、特にゲームグラフィックス用途に特化した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では、よりC言語に近い構文およびポインタなどの言語機能を採用しており、またDirect3D/OpenGLといったバックエンドを使うことなくプログラムロジックを記述できるため、汎用コンピューティングに適している。

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

C++の場合、ほとんどの用途においてThrustなどのCUDA-Xで提供している高レベルAPIを使用すれば十分である。しかし、自前でCUDAカーネルを実装するなど、低レベルのAPIを使い始めると、作成したプログラムを最大限最適化するためには、Warpや共有メモリなどのNVIDIA GPUデバイスアーキテクチャに関する深い知識も必要となる第6回 CUDAプログラミングモデル① | G-DEP。行列積も並列scanも性能を最大限出すための並列アルゴリズムは複雑で、GPUの機種別の最適化も必要なため、専門的な実装が必要だが、NVIDIA側がそれらを提供している。

CUDAと初対応のGeForce 8 シリーズ(G8x)の発表は2006年11月8日NVIDIA Unveils CUDA™-The GPU Computing Revolution Begins | Press Release | NVIDIA、最初のCUDA SDKのβ版のリリース日は2007年2月16日、CUDA 1.0の提供開始は2007年7月17日NVIDIA CUDA 1.0、GPUコンピューティング向けに機能を強化 | NVIDIAであり、後発のGPGPU関連技術にはOpenCL (1.0仕様公開は2008年並列プログラミング規格「OpenCL 1.0」が標準として批准 - @IT) やDirectCompute (DirectXコンピュートシェーダー。Windows 7/DirectX 11.0と同時に2009年に一般提供開始西川善司の3Dゲームファンのためのグラフィックス講座。台頭するDirectCompute技術 - GAME Watch) などが存在するが、それぞれ技術用語は異なるものの全体としてはCUDAに非常に似通った特徴を持つ。先発技術であるCUDAは、2014年時点で教育・研究機関での採用事例が多いNVIDIA GPUコンピューティング応用事例のご紹介ほか、機械学習などの分野で産業界でも採用への取り組みが進んでいる【GTC2014】NVIDIA、基調講演でCUDAを自動車にもたらす開発キット「JETSON TK1」の提供開始など発表 / NVLink、3Dメモリで、帯域幅問題を解消する新GPU「Pascal(パスカル)」も計画 - Car Watch。

対応プログラミング言語 NVIDIAとしては以下のプログラミング言語に対応している。 C++ - これが主要なCUDAの対応プログラミング言語である。コンパイラは nvcc および nvc++。 C言語 - C++でないとCUDAの全ての機能が使えない。コンパイラは nvcc および nvc。 Fortran - コンパイラは nvfortran Python - 2025年現在実験段階。ディープラーニングからNVIDIA GPUを使用する人は主にPythonを使うこともあり、CUDAのPython対応も進められているが、C++には追いついていない。

SDKとしては以下の2種類を配布している。 NVIDIA HPC Software Development Kit - 概ねCUDA Toolkitの内容が含まれていて、Fortranのコンパイラなども含んでいる。 NVIDIA CUDA Toolkit - 付属するコンパイラはnvccのみ。

C/C++のライブラリとして、CUDA ToolkitやHPC SDKには、BLASインターフェイス経由でベクトル・行列演算が可能なcuBLAScuBLAS - NVIDIA CUDA ZONE、FFTライブラリcuFFTcuFFT - NVIDIA CUDA ZONE、STLベースの並列アルゴリズムライブラリThrustなどが付属しているThrust - NVIDIA CUDA ZONE。

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

CUDA C/C++のソースコードの拡張子には通例.cuが使われ、ヘッダーの拡張子には.cuhが使われる。

CUDAバージョン7では、C++11規格のサポートが強化され、デバイスコードにおけるラムダ式の利用などが可能となっているNVIDIA Pushes CUDA 7 RC With C++11 Features, Runtime Compilation - PhoronixThe Power of C++11 Programming in CUDA 7 | Parallel Forall。CUDAバージョン8では、機械学習向けのライブラリが強化され、Pascalアーキテクチャの固有機能を利用した拡張が多数追加されたCUDA 8 PERFORMANCE OVERVIEW - November 2016, NVIDIACUDA 8.0 新機能のご紹介 - GTC Japan 2016。

言語バインディング C++以外からCUDAを呼べるようにしたバインディングがある。ただし、CUDAの全ての機能が使えるのはC++である。一般にプログラミング言語のコンパイラはCPU上で動くバイナリしか生成されないので、GPU上で動くコードをどのようにして書くかという問題があり、そのプログラミング言語からC++に変換するか、LLVMのアセンブリ言語を生成するかなどが必要であるが、そのようなコンパイラ開発が行われているのはPython、Julia、Rustなどである。

Python NVIDIAが提供しているもの CUDA Python - 2025年現在、APIのほとんどにexperimentalがついているが、ThrustなどのPython対応が進められている。 Numba CUDA - CUDAカーネルをPythonで実装できる。 NVIDIA Warp - Numba CUDAとは別に、PythonをC++に変換してCUDAカーネルにコンパイルするプロジェクト。自動微分も実装している。NVIDIA PhysicsNeMoやNVIDIA Omniverseの併用によるシミュレーションも充実している。NVIDIA GPUでは32個単位で処理し、それをCUDA Warpと呼んでいるが、ややこしいが、NVIDIA Warpはそれとは別物である。 NVIDIA以外が提供しているもの CuPy - NumPyをCUDA対応させたものだが、自前のC++のCUDAカーネルも実行可能。 PyCUDA - PyCUDAもGPUArrayというNumPy相当のものを実装している。 Java - JCuda(JCublas, JCufft, JCurand, JCusparse, JCusolver, JNvgraph, JCudpp, JNpp, JCudnn) Julia - CUDA.jl Rust - Rust CUDA 他にも、Ruby, Lua, MATLAB, IDL, Mathematica などもある。

NVIDIAが開発しているNumba CUDAでは、PythonのNVIDIA GPU上の多次元配列(テンソル)が満たすべきAPI (CUDA Array Interface) を定義していて、TensorFlow以外のほとんどのライブラリがこれに対応しているため、相互に利用することが可能である。

CUDA Core Compute Libraries CUDA Core Compute Libraries (CCCL) はCUDAの標準ライブラリ。C++版とPython版がある。CUDA ToolkitやHPC SDKに同梱されている。

それぞれ以下のものが含まれている。 CUDA C++ Core Libraries libcu++ - 標準C++ライブラリのCUDA版。 Thrust - 並列アルゴリズムのライブラリ。CUBよりも高レベルAPI。NVIDIA GPUとCPUで動作する。 CUB - 並列アルゴリズムのライブラリ。Thrustよりも低レベルAPI。CUDA専用。細かい制御が必要でなければThrustで十分である。 CUDA Python Core Libraries - 2025年現在実験段階。 cuda.parallel - ThrustのPython対応 cuda.cooperative - CUBのcooperativeアルゴリズムのPython対応

Thrust Thrustは並列アルゴリズムのC++ライブラリ。C++17より並列アルゴリズムが標準C++ライブラリに追加になったが、それも、NVIDIAでは対応しているNVIDIA HPC Compilers C++ Parallel Algorithm。

以下の高階関数などが実装されている。関数は多数あるが、以下はごく一部の一例である。 並列map - thrust::transform (std::transform) 並列filter - thrust::copy_if (std::copy_if) 並列fold - thrust::reduce (std::reduce)。二項演算子が結合法則を満たすことが必要。 並列scan - thrust::inclusive_scan (std::inclusive_scan), thrust::exclusive_scan (std::exclusive_scan)。二項演算子が結合法則を満たすことが必要。詳細は累積和を参照。 並列sort - thrust::sort (std::sort)

高階関数のコールバック関数は関数オブジェクトを渡す。糖衣構文のラムダ式も使えるが2025年現在は制限事項だらけの不完全実装である。

並列foldや並列scanは、二項演算子の計算量が小さく、要素数が多い場合は、メモリ帯域がボトルネックとなり、メモリコピーの速度で動作する。これらの前後に並列mapがあると余計なメモリコピーが発生し遅くなるため、transform_iteratorを使用することで、並列map → 並列X → 並列mapという処理を1つにまとめることができて、メモリコピー1回分の計算時間になる。

CUDA-X NVIDIAはCUDA上で構築したライブラリの総称をCUDA-Xと呼んでいる。以下のものが含まれる。 数学 cuBLAS - BLASのライブラリ(C, Fortran) cuFFT - 高速フーリエ変換(C, Fortran) cuRAND - 疑似乱数生成(C, Fortran) cuSOLVER - LAPACKに対応(C, Fortran) cuSPARSE - 疎行列(C, Fortran) cuTENSOR - テンソル・多次元配列 (C, Fortran) cuDSS - 疎行列の AX = B を解くライブラリ (C言語) CUDA Math Library (C言語) AmgX (C言語) nvmath-python (Python) 並列アルゴリズム Thrust (C++) 計算機リソグラフィ cuLitho 量子コンピュータ cuQuantum cuPQC データ処理 RAPIDS RAPIDS cuDF - pandas (Python, C++, Java) RAPIDS Dask cuDF (Python, C++, Java) RAPIDS cuGraph (C, C++, Python) RAPIDS cuVS - ベクトル検索 (C, C++, Python, Rust) RAPIDS Accelerator for Apache Spark NVIDIA Merlin NVTabular NVIDIA Morpheus - サイバーセキュリティ NVIDIA GPUDirect Storage 画像と動画 RAPIDS cuCIM (Compute Unified Device Architecture Clara IMage) - Python CV-CUDA (C, C++, Python) NVIDIA Data Loading Library (DALI) - 画像の読み込みとデータ拡張 (Python) nvJPEG (C言語) NVIDIA Performance Primitives (C言語) NVIDIA Video Codec SDK (C言語) NVIDIA Optical Flow SDK (C言語) 通信ライブラリ NVSHMEM (C, Fortran) NCCL (C言語) ディープラーニング NVIDIA TensorRT - 推論用 (C++, Python) NVIDIA cuDNN (C, C++, Python) NVIDIA Riva (Python) NVIDIA DeepStream SDK (C, C++, Python)

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の処理時間などの情報を収集して、性能改善に役立てることができる第3回 CUDAとGPUコンピューティングの広がり | Think IT(シンクイット)。CUDA Toolkit 7.5では命令レベルでのプロファイリングがサポートされたCUDA 7.5: Pinpoint Performance Problems with Instruction-Level Profiling | Parallel Forall。Nsight (旧称Parallel Nsight) と呼ばれる統合開発環境向けのアドインも提供されている。

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

メリット CUDAはNVIDIAが独自に開発を進めているGPGPU技術であり、NVIDIA製のハードウェア性能を最大限引き出せるように設計されているコンパイラ、そしてもっと:アクセラレーター・プログラミング。CUDAを利用することで、NVIDIA製GPUに新しく実装されたハードウェア機能をいち早く活用することができる。例えばKepler世代以降のGPUで使用可能なWarpシャッフル命令を使用することで、共有メモリを介するよりもさらに高速な並列リダクションを実行することができるFaster Parallel Reductions on Kepler | Parallel ForallKepler GPUアーキテクチャとプログラム最適化 (10) Keplerから搭載されたレジスタ内のデータの入れ替え命令 | マイナビニュース。CUDA同様の類似GPGPU技術として代表的なものはOpenCLやDirectComputeが挙げられるが、いずれもハードウェアアーキテクチャを標準化しベンダーの違いを吸収するAPI層であるため、CUDAと比較すると抽象化の度合いは低いローレベルAPIではあるものの、ハードウェア特有の先進的機能を使った細やかなチューニングによりそのハードウェアの限界性能を引き出すのは難しい第3回 CUDAとGPUコンピューティングの広がり | Think IT。

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

デメリット ハードウェアベンダーに依存しないOpenCLやDirectComputeと比較すると、CUDAはNVIDIA製のGPUでしか使えないという制約がある。このため、CUDAの機能に過度に依存したプログラムを書くと、アプリケーションのポーティング・移植が困難になる可能性がある(ベンダーロックイン)ASCII.jp:OpenCLでCUDAを追撃!? AMD「ATI Stream」が狙うものは。AMDはCUDAアプリケーションをAMDおよび他のGPUプラットフォーム向けにソースコードレベルで移植しやすくするためのC++用APIとして、HIP (Heterogeneous-Compute Interface for Portability) の提供を開始したAMDがSC15にて、「Boltzmann Initiative」を発表 – AMD GPU用C++とCUDAコンパイラー - 株式会社エーキューブHIP : C++ Heterogeneous-Compute Interface for Portability - GPUOpenが、CUDAと完全な互換性を持っているわけではない。

また、最初からグラフィックス連携用途を想定して設計されたDirectComputeと比較すると、(相互運用APIが用意されているとはいえ)GPU演算結果をグラフィックス用途に直接利用する場合はオーバーヘッドが大きくなるSIGGRAPH ASIA 2009 - 非プラットフォーム依存パラレルの本命、「OpenCL」最新事情 (6) OpenCLはCUDAやDirectComputeと競合するのか | マイナビニュース。

対応環境 ハードウェア 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ドライバーによって実行環境に合わせた最適なコードを生成することができるようになる"GeForceの父" David Kirk博士、東大で並列コンピューティングについて講演 (4) 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 6.5。

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 7.0 Downloads | NVIDIA Developer。

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 7.5 Downloads Archive | NVIDIA Developer。

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 8.0 - Feb 2017 | NVIDIA Developer。

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 9.2 Download | NVIDIA Developer。

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 10.2 Download | NVIDIA Developer。