CUDA

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の発表は2006年11月、CUDA 1.0の提供開始は2007年7月であり、後発の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を呼べるようにしたバインディングがある。 Java - JCuda（JCublas, JCufft, JCurand, JCusparse, JCusolver, JNvgraph, JCudpp, JNpp, JCudnn） Python - PyCUDA Perl - KappaCUDA、CUDA::Minimal 他にも、Ruby, Lua, MATLAB, IDL, Mathematica などもある。 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コードを実行できるが、その逆は不可能となっている。 CUDAは実行環境デバイスの世代（Compute Capability）に応じた専用バイナリコードを生成できるほかに、PTX (Parallel Thread Execution) と呼ばれるNVIDIA独自のGPU中間命令（中間言語）を生成することができる。PTXを利用することで、実行時にCUDAドライバーによって実行環境に合わせた最適なコードを生成することができるようになる。 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である。 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ではParallel Computing Toolboxを介してGPUを使用できる。重いプログラムスクリプト実行の高速化に寄与する。ただしCUDAの初期化およびメインメモリ-VRAM間のデータ転送に時間がかかるため、短いスクリプトの場合は逆にトータル処理時間でみるとCPUだけ使用するときよりも遅くなる場合もある。Intel Xeon X5650を使った場合と比べて、NVIDIA Tesla C2050を使うことでFFTが最大3.5倍高速化されたとの説明がある。 OpenCV 2.2でCUDAを使ったアクセラレータであるgpuモジュールが追加された。OpenCV 3.0ではcudaモジュールに改称された。