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 などもある。 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 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モジュールに改称された。 ^ 2023年現在、これらのブランドは消失してNVIDIAブランドに統合されているものもあるが、便宜上ここでは旧ブランド名を用いている。 ^ Keplerアーキテクチャ採用。 ^ macOS 10.14以降ではCUDAドライバーがインストールできなくなっているため、旧バージョンの利用も不可能である。 ^ "NVIDIA CUDA Toolkit Release Notes" (PDF). NVIDIA. NVIDIA. 1 August 2024. 2024年8月11日閲覧。 ^ NVIDIA CodeWorks for Android | NVIDIA Developer ^ NVIDIA GameWorks Documentation - NVIDIA CUDA for Android ^ What Is CUDA | NVIDIA Official Blog ^ Accelerated Computing | NVIDIA Developer ^ 開発者向けのCUDA並列コンピューティングプラットフォーム | NVIDIA ^ 第3回 CUDAとGPUコンピューティングの広がり | Think IT ^ 日経エレクトロニクス 2007/10/8 「プロセサはマルチ×マルチへ」 ^ 第７回　CUDAプログラミングモデル② | G-DEP: ^ HPCシンポジウムで見えたTSUBAME2.0の設計思想 (1) ポストペタスケールへ向けGPUをどう活用していくのか ^ 第６回　CUDAプログラミングモデル① | G-DEP ^ Press Release | NVIDIA ^ NVIDIA CUDA 1.0、GPUコンピューティング向けに機能を強化 | NVIDIA ^ 並列プログラミング規格「OpenCL 1.0」が標準として批准 － ＠IT ^ 西川善司の3Dゲームファンのためのグラフィックス講座。台頭するDirectCompute技術 - GAME Watch ^ NVIDIA GPUコンピューティング応用事例のご紹介 ^ 【GTC2014】NVIDIA、基調講演でCUDAを自動車にもたらす開発キット「JETSON TK1」の提供開始など発表 / NVLink、3Dメモリで、帯域幅問題を解消する新GPU「Pascal（パスカル）」も計画 - Car Watch ^ CUDA プロジェクト | CLion ^ cuBLAS - NVIDIA CUDA ZONE ^ cuFFT - NVIDIA CUDA ZONE ^ Thrust - NVIDIA CUDA ZONE ^ NVIDIA Pushes CUDA 7 RC With C++11 Features, Runtime Compilation - Phoronix ^ The Power of C++11 Programming in CUDA 7 | Parallel Forall ^ CUDA 8 PERFORMANCE OVERVIEW - November 2016, NVIDIA ^ CUDA 8.0 新機能のご紹介 - GTC Japan 2016 ^ NVIDIAのCUDAアーキテクチャGPUにおけるFortranサポート ^ PGI CUDA Fortran のコンパイル・オプション ^ CUDA LLVM Compiler | NVIDIA Developer ^ “CUDA-X”. NVIDIA Developer. 11 March 2024閲覧。 ^ 第3回 CUDAとGPUコンピューティングの広がり | Think IT（シンクイット） ^ CUDA 7.5: Pinpoint Performance Problems with Instruction-Level Profiling | Parallel Forall ^ コンパイラ、そしてもっと：アクセラレーター・プログラミング ^ Faster Parallel Reductions on Kepler | Parallel Forall ^ Kepler GPUアーキテクチャとプログラム最適化 (10) Keplerから搭載されたレジスタ内のデータの入れ替え命令 | マイナビニュース ^ 第3回 CUDAとGPUコンピューティングの広がり | Think IT ^ ASCII.jp：OpenCLでCUDAを追撃!?　AMD「ATI Stream」が狙うものは ^ AMDがSC15にて、「Boltzmann Initiative」を発表 – AMD GPU用C++とCUDAコンパイラー - 株式会社エーキューブ ^ HIP : C++ Heterogeneous-Compute Interface for Portability - GPUOpen ^ SIGGRAPH ASIA 2009 - 非プラットフォーム依存パラレルの本命、「OpenCL」最新事情 (6) OpenCLはCUDAやDirectComputeと競合するのか | マイナビニュース ^ "GeForceの父" David Kirk博士、東大で並列コンピューティングについて講演 (4) CUDAの動作の仕組み | マイナビニュース ^ CUDA Toolkit 6.5 ^ CUDA 7.0 Downloads | NVIDIA Developer ^ CUDA 7.5 Downloads Archive | NVIDIA Developer ^ CUDA Toolkit 8.0 - Feb 2017 | NVIDIA Developer ^ CUDA Toolkit 9.2 Download | NVIDIA Developer ^ CUDA Toolkit 10.2 Download | NVIDIA Developer ^ CUDA Toolkit 11.8 Downloads | NVIDIA Developer ^ a b Release Notes :: CUDA Toolkit Documentation (v11.0) ^ “NVIDIA CUDA Toolkit Release Notes”. CUDA Toolkit Documentation. 2020年7月26日閲覧。 ^ Installation Guide Mac OS X :: CUDA Toolkit Documentation ^ NVIDIA CUDA Toolkit - Developer Tools for macOS | NVIDIA Developer ^ CUDA Toolkit 12.1 Downloads | NVIDIA Developer ^ NVIDIA® OptiX™ Ray Tracing Engine ^ NVIDIA OptiX™ Legacy Downloads | NVIDIA Developer ^ How to Get Started with OptiX 7 | NVIDIA Technical Blog ^ GPU changes (for CUDA and OpenGL) in After Effects CC (12.1) | After Effects region of interest ^ 4Gamer.net ― NVIDIA製GPUが「Photoshop」「After Effects」「Premiere Pro」の最新版「CS4」アクセラレーションをサポート。ムービーでその効果をチェック ^ Premiere Pro CCでは、2基のNVIDIA Quadro M6000上でCUDAを活用することで、1基のIntel Xeon E5-2697 v3を用いる場合と比較して、最大で24倍の速度性能向上を提供できるとしている。Adobe Premiere Pro CC – さらにスピーディーなビデオ編集 | NVIDIA ^ ただし、CUDAによって必ずしも処理が高速化するわけではない。CUDA/OpenCL/Mercury Playback Engine について（Adobe Premiere Pro） ^ Doc:JA/2.6/Manual/Render/Cycles/GPU Rendering - BlenderWiki ^ NVIDIA CUDA に対応した GPU に対する MATLAB GPU 演算のサポート - MATLAB & Simulink ^ Using GPUs in MATLAB » Loren on the Art of MATLAB ^ OpenCV 2.2 Released - ROS robotics news NVIDIA Tesla NVIDIA Quadro NVIDIA GeForce ハイパフォーマンスコンピューティング コンパイラ GPGPU OpenCL DirectCompute Metal (API) Vulkan (API) AMD Stream (旧ATI Stream) - AMD (旧ATI社) のRadeon、FirePro、FireStreamを使用したGPGPUの競合テクノロジー 青木尊之、額田彰『はじめてのCUDAプログラミング』工学社〈I/O books〉、2009年11月。ISBN 978-4777514779。 NCID BB00109838。  岡田賢治 著、小山田耕二・監修 編『CUDA高速GPUプログラミング入門』秀和システム、2010年3月。ISBN 978-4-7980-2578-0。 NCID BB01650115。  Jason Sanders; Edward Kandrot (2011). CUDA by example : an introduction to general-purpose GPU programming. Addison-Wesley. ISBN 978-0-13-138768-3. OCLC 535495666  Jason Sanders, Edward Kandrot:『CUDA by Example: An Introduction to General-Purpose GPU Programming：汎用GPUプログラミング入門』, インプレスジャパン、ISBN 978-4-8443-2978-7 (2011年2月11日). 伊藤智義・編 編『GPUプログラミング入門 = Introduction to GPU Programming : CUDA5による実装』講談社、2013年5月。ISBN 978-4-06-153820-7。  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). ウィキメディア・コモンズには、CUDAに関連するカテゴリがあります。 CUDA Zone | NVIDIA Developer CUDA Toolkit Documentation