CUDA

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

1. 概要
-----

thumb|300px|right|CUDAの処理の流れ
1. メインメモリからデータをGPU用メモリにコピーする。
2. CPUがGPUに対して処理を指示する。
3. GPUが必要なデータを取り込み各コアで並列実行する。
4. 結果をGPU用メモリからメインメモリにコピーする。

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

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

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

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

なお、CUDAの発表は2006年11月、CUDA 1.0の提供開始は2007年7月であり、後発のGPGPU関連技術にはOpenCL  やDirectCompute  などが存在するが、それぞれ技術用語は異なるものの全体としてはCUDAに非常に似通った特徴を持つ。先発技術であるCUDAは、2014年時点で教育・研究機関での採用事例が多いほか、機械学習などの分野で産業界でも採用への取り組みが進んでいる。

2. 対応言語
-------

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

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

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

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

2.1. 言語バインディング
--------------

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

Java - [1]
Python - [2]
Perl - [3]、[4]他にも、Ruby, Lua, MATLAB, IDL, Mathematica などもある。

3. OpenGL/Direct3D相互運用
----------------------

CUDAにはOpenGLおよびDirect3D 9/10/11との連携を可能にする相互運用APIが用意されている。詳しくは[5],[6] などを参照のこと。

4. 開発ツール
--------

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

5. メリット・デメリット
-------------

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

5.1. メリット
---------

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++における通常の関数呼び出しに近い形で記述できるなど、より本質的なアプリケーションコードやアルゴリズムの実装のみに注力できるようになっている。

5.2. デメリット
----------

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

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

6. 対応環境
-------

6.1. ハードウェア
-----------

DirectX 10世代以降の統合型シェーダーアーキテクチャを採用したNVIDIA製GPUがCUDAに対応している2023年現在、これらのブランドは消失してNVIDIAブランドに統合されているものもあるが、便宜上ここでは旧ブランド名を用いている。}}。

NVIDIA GeForce 8シリーズ以降
NVIDIA Quadro G80ベース以降
NVIDIA Tesla
NVIDIA Jetson
NVIDIA Tegra K1Keplerアーキテクチャ採用。}}以降
NVIDIA ION実行には専用のデバイスドライバーを必要とする。詳細は、[7] を参照。なお、ハードウェアの世代／アーキテクチャによって利用可能なGPU命令やリソースサイズ上限、倍精度浮動小数点対応可否などの制約が異なる。また、上位のCCを持つハードウェアでは、下位のCC向けにコンパイルされたCUDAコードを実行できるが、その逆は不可能となっている。

6.1.1. PTX 
--------------------------------------

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

6.2. OS
-------

CUDA Toolkit 6.5の対応OSは、Windows XP 、Windows 7、Windows 8.1、Windows Server 2008 R2、Windows Server 2012 R2、Fedora 20、OpenSUSE 13.1、RHEL  5/6、CentOS 5/6、SLES  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、Kylin  10、Rocky 8/9、WSL-Ubuntu 2.0である。CUDA Toolkit 11.0以降、macOSはサポート対象外となったmacOS 10.14以降ではCUDAドライバーがインストールできなくなっているため、旧バージョンの利用も不可能である。}}。ただしリモートデバッグ用のツールだけは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である。

7. NVIDIA OptiX
---------------

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

8. 対応ソフトウェア
-----------

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

Freemake Video Converter 
MediaCoder 
LoiLoTouch 
Super LoiLoScope 
EDIUS
VideoStudio 
WinDVD 
PowerDirector 
PowerDVD 
TMPGEnc 
Adobe Photoshop CS4
Adobe After Effects CS4
Adobe Premiere Pro CS4
Blender 
Vegas Pro 10 
パスゲッター
Any Video Converter

8.1. 分散コンピューティング
----------------

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

SETI@Home
MilkyWay@home
GPUGRID 
AQUA@home
Folding@Home

8.2. MATLAB
-----------

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

8.3. OpenCV
-----------

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

9. 脚注
-----

9.1. 注釈
-------

9.2. 出典
-------

10. 関連項目
--------

NVIDIA Tesla
NVIDIA Quadro
NVIDIA GeForce
ハイパフォーマンスコンピューティング
コンパイラ
GPGPU
OpenCL
DirectCompute
Metal 
Vulkan 
AMD Stream  - AMD  のRadeon、FirePro、FireStreamを使用したGPGPUの競合テクノロジー

11. 関連書籍
--------

12. 外部リンク
---------

[8]
[9]