CUDA (Compute Unified Device Architecture) とは
CUDAは、
NVIDIAが開発したGPU(
Graphics Processing Unit)向けの汎用並列コンピューティングプラットフォームおよびプログラミングモデルです。GPUの高度な並列処理能力を、グラフィックス処理だけでなく、科学技術計算や
ディープラーニングなどの様々な分野で活用できるようにします。
CUDAは、専用のC/
[C++]]コンパイラ]やライブラリ(API)を提供します。これにより、開発者はGPUの並列処理能力を効率的に利用したプログラムを開発できます。[[NVIDIA製GPUでは、OpenCLやDirectComputeなどの類似のAPIも内部的にはCUDAを経由して処理されます。
CUDAの歴史と背景
NVIDIAは元々、
ゲームグラフィックス用途に特化したGPUを開発していました。しかし、プログラマブルシェーダーの発展により、GPUのプログラマビリティが向上したため、
NVIDIAはこの高い処理性能をグラフィックス以外の分野にも活用するためにCUDAを開発しました。このように、GPUを汎用計算に利用する技術を
GPGPU (General-Purpose computing on
Graphics Processing Units) と呼びます。
CUDAのプログラミング環境
GPU向けのプログラミング環境としては、HLSLやGLSL、
NVIDIA Cgなどがありますが、これらはDirect3DやOpenGLをバックエンドとするリアルタイムCG描画専用です。CUDAは、より
C言語に近い構文とポインタなどの言語機能を持ち、Direct3D/OpenGLに依存せずにプログラムロジックを記述できます。これにより、汎用的な計算処理に適しています。
GPUの特性とCUDAの活用
GPUは、多数のシンプルな演算ユニットを搭載しており、理論演算性能(
FLOPS)は
CPUを上回る場合があります。そのため、並列性が高く演算密度の高い処理では、GPUは
CPUよりも高い処理性能を発揮します。しかし、複雑な分岐処理や演算密度の低い処理は
CPUの方が得意です。また、GPUと
CPU間のデータ転送は、接続バス(PCI-Express)がボトルネックとなる可能性があります。そのため、CUDAの適用分野やアルゴリズムの選択は慎重に行う必要があります。
CUDAで作成したプログラムを最大限に最適化するには、Warpや共有メモリなど
NVIDIA GPUのアーキテクチャに関する深い知識が必要です。
CUDAの登場とGPGPU技術の発展
CUDAは2006年11月に発表され、2007年7月にCUDA 1.0がリリースされました。その後、OpenCLやDirectComputeなどの
GPGPU技術が登場しましたが、CUDAは教育・研究機関での採用事例が多く、機械学習などの分野で産業界でも広く利用されています。
対応言語
CUDA C/
C++は、
C言語と
C++の一部構文に対応しており、
C言語を拡張したものです。ソースコードの拡張子は.cu、ヘッダーの拡張子は.cuhが使われます。cuBLASによるベクトル・
行列演算や、cuFFTによるFFTも利用できます。CUDA Toolkitには、並列アルゴリズムライブラリ「Thrust」も付属しています。
CUDAバージョン7では、
C++11規格のサポートが強化され、ラムダ式が利用可能になりました。バージョン8では、機械学習向けのライブラリが強化され、Pascalアーキテクチャの機能拡張が追加されました。
CUDA Fortranは、The Portland Group (PGI)から提供されています。
NVIDIAのCUDA
コンパイラnvccはLLVMベースであり、新しい言語やプロセッサをサポートする
コンパイラSDKも提供されています。
言語バインディング
CUDAは、
C言語以外の言語からも利用できるバインディングが提供されています。
Java: JCuda (JCublas, JCufft, JCurandなど)
Python: PyCUDA
Perl: KappaCUDA, CUDA::Minimal
その他:
Ruby, Lua, MATLAB, IDL, Mathematicaなど
CUDA-X ライブラリ
NVIDIAはCUDA上で構築されたライブラリの総称をCUDA-Xと呼んでいます。CUDA-Xには、以下のようなライブラリが含まれます。
数学: cuBLAS, cuFFT, CUDA Math Library, cuRAND, cuSOLVER, cuSPARSE, cuTENSOR, cuDSS, 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との連携を可能にする相互運用APIが用意されています。
開発ツール
CUDA Toolkitには、Visual Profilerというパフォーマンス計測ツールが付属しています。これにより、GPUの処理時間を計測し、パフォーマンス改善に役立てることができます。CUDA Toolkit 7.5では、命令レベルでのプロファイリングがサポートされました。また、統合開発環境向けのアドインとしてNsight (旧Parallel Nsight) も提供されています。
CUDAのメリット・デメリット
CUDAは、
NVIDIA製のハードウェア性能を最大限に引き出すように設計されています。CUDAを利用することで、
NVIDIA製GPUの最新機能をいち早く活用できます。例えば、Kepler世代以降のGPUで使用可能なWarpシャッフル命令を利用することで、共有メモリを介するよりも高速な並列リダクションを実行できます。
一方、CUDAは
NVIDIA製GPUでのみ利用可能です。そのため、CUDAに依存したプログラムは移植が困難になる可能性があります。AMDは、CUDAアプリケーションを他のGPUプラットフォームに移植するためのAPIとしてHIP (Heterogeneous-Compute Interface for Portability) を提供していますが、CUDAと完全な互換性はありません。
また、DirectComputeと比較すると、GPU演算結果をグラフィックス用途に直接利用する場合のオーバーヘッドが大きくなります。
対応環境
ハードウェア
DirectX 10世代(G80世代)以降の統合型シェーダーアーキテクチャを採用した
NVIDIA製GPUがCUDAに対応しています。
NVIDIA GeForce 8シリーズ以降 (一般/ゲーミング向け)
NVIDIA Quadro G80ベース以降 (
ワークステーション向け)
NVIDIA Tesla (ハイパフォーマンスコンピューティング/データセンター向け)
NVIDIA Jetson (組み込み用)
NVIDIA Tegra K1以降 (モバイル向けプロセッサ)
NVIDIA ION (ネットブック/ネットトップデバイス用、サポート終了)
実行には専用の
デバイスドライバーが必要です。ハードウェアの世代/アーキテクチャ(Compute Capability, CC)によって利用可能なGPU命令やリソースサイズ、倍精度浮動小数点対応などが異なります。
PTX (Parallel Thread Execution)
CUDAは、実行環境デバイスの世代に応じた専用バイナリコードを生成できるだけでなく、PTXと呼ばれる
NVIDIA独自のGPU中間命令を生成できます。PTXを利用することで、実行時にCUDAドライバーが最適なコードを生成できます。
OS
CUDA Toolkitは、複数のOSに対応しています。対応OSはバージョンによって異なります。
Windows: XP(32bit), 7, 8.1, 10, 11, Server 2008 R2, 2012 R2, 2016, 2019, 2022
Linux:
Fedora,
OpenSUSE, RHEL, CentOS, SLES,
Ubuntu, Debian, KylinOS, Rocky
macOS: 10.8〜10.13 (CUDA Toolkit 11.0以降は非対応)
NVIDIAは、CUDA基盤上に構築されたプログラマブルGPUレイトレーシングエンジンとしてOptiXを公開しています。OptiXのバージョンによって対応するGPU世代が異なります。
対応ソフトウェア
CUDAの演算処理技術を利用するには、対応するハードウェアとOSに加えて、アプリケーションがCUDAに対応している必要があります。一部のアプリケーションベンダーより対応ソフトウェアが提供されています。
動画編集/変換: Freemake Video Converter, MediaCoder, LoiLoTouch, Super LoiLoScope, EDIUS, VideoStudio, WinDVD, PowerDirector,
PowerDVD, TMPGEnc
画像処理: Adobe Photoshop, Adobe After Effects, Adobe Premiere Pro
3DCG:
Blender
その他: Vegas Pro, パスゲッター, Any Video Converter
CUDAは、BOINCクライアント上で分散コンピューティングにも利用できます。
SETI@Home
MilkyWay@home
GPUGRID (PS3GRID)
AQUA@home
Folding@Home
MATLAB
MATLABでは、Parallel Computing Toolboxを介してGPUを使用できます。CUDAを利用することで、重い処理スクリプトの高速化に貢献しますが、スクリプトによっては
CPUのみを使用するよりも遅くなる場合があります。
OpenCV
OpenCV 2.2でCUDAを使ったアクセラレータであるgpuモジュールが追加され、OpenCV 3.0ではcudaモジュールに改称されました。
関連項目
NVIDIA Tesla
NVIDIA Quadro
NVIDIA GeForce
ハイパフォーマンスコンピューティング
コンパイラ
GPGPU
OpenCL
DirectCompute
Metal (API)
Vulkan (API)
AMD Stream (旧ATI Stream)
関連書籍
Programming Massively Parallel Processors: A Hands-on Approach
CUDA Application Design and Development
CUDA Programming: A Developer's Guide to Parallel Computing with GPUs
CUDA C プロフェッショナルプログラミング
CUDA Fortran for Scientists and Engineers
外部リンク
CUDA Zone | NVIDIA Developer
CUDA Toolkit Documentation