CUDA

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索
CUDA
開発元 NVIDIA
最新版 6.0 / 2014年4月15日
対応OS Windows XP以降、LinuxMac OS X
種別 GPGPU
公式サイト NVIDIA CUDA zone
テンプレートを表示

CUDA(Compute Unified Device Architecture:クーダ)とは、NVIDIAが提供するGPU向けのC言語統合開発環境であり、コンパイラ (nvcc) やライブラリなどから構成されている。アプリケーションを実行する基盤となるプラットフォーム/アーキテクチャそのものをCUDAと呼ぶこともある[1]

概要[編集]

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

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

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

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

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

なお、CUDA 1.0の提供開始は2007年[5]であり、後発のGPGPU関連技術にはOpenCL (1.0仕様公開は2008年[6]) やDirectCompute (DirectXコンピュートシェーダー。Windows 7/DirectX 11.0と同時に2009年に一般提供開始[7]) などが存在するが、それぞれ技術用語は異なるものの全体としてはCUDAに非常に似通った特徴を持つ。先発技術であるCUDAは、2014年時点で教育・研究機関での採用事例が多い[8]ほか、機械学習などの分野で産業界でも採用への取り組みが進んでいる[9]

対応言語[編集]

CUDA C はC言語C++の一部の構文のみ対応。C言語を拡張している。CUDA C/C++のソースコードの拡張子には通例.cuが使われる[10]BLASインターフェイス経由でベクトル行列演算が可能。FFTライブラリも付属する。

CUDA Fortran は The Portland Group (PGI) から提供されている[11]Fortran 2003 を拡張している[12]

言語バインディング[編集]

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

他にも、Fortran, Perl, Ruby, Lua, MATLAB, IDL, Mathematica などもある。

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 などを参照のこと。

メリット・デメリット[編集]

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

メリット[編集]

CUDAはNVIDIAが独自に開発を進めているGPGPU技術であり、NVIDIA製のハードウェア性能を最大限引き出せるように設計されている[13]。CUDA同様の類似GPGPU技術として代表的なものはOpenCLDirectComputeが挙げられるが、いずれもハードウェアアーキテクチャを標準化しベンダーの違いを吸収するAPI層であるため、CUDAと比較すると抽象化の度合いは低いローレベルAPIではあるもののハードウェア特有の機能を使った細やかなチューニングによりそのハードウェアの限界性能を引き出すのは難しい[14]

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

デメリット[編集]

ハードウェアベンダーに依存しないOpenCLと比較すると、CUDAはNVIDIA製のGPUでしか使えないという制約がある。これにより、アプリケーションのポーティング・移植が困難になる可能性がある(ベンダーロックイン[15]

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

対応環境[編集]

ハードウェア[編集]

DirectX 10世代の統合型シェーダーアーキテクチャを採用したGeForce 8シリーズ以上 (ネットブック/トップ用のNVIDIA IONを含む) もしくは NVIDIA TeslaNVIDIA Quadro (Teslaはハイパフォーマンスコンピューティング用、Quadroはワークステーション用) 。実行には専用のデバイスドライバを必要とする。詳細は、 CUDA GPUs | NVIDIA Developer Zone を参照。なお、ハードウェアの世代/アーキテクチャ(Compute Capability, CC)によって利用可能なリソースサイズ上限などの制約が異なる。また、上位のCCを持つハードウェアでは、下位のCC向けにコンパイルされたCUDAコードを実行できるが、その逆は不可能となっている。

OS[編集]

2014年時点での対応OSは32bit版及び64bit版Windows XP以降、Fedora 7以降、Red Hat Enterprise Linux 3以降、SUSE Linux Enterprise Desktop 10-SP1、OpenSUSE 10.1以降、Ubuntu 7.04以降、Mac OS X 10.5.2以降である。

対応ソフトウェア[編集]

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

分散コンピューティング[編集]

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

MATLAB[編集]

MATLABとのコラボレーションもサポートされている。重いプログラムスクリプトの実行高速化に寄与する。公開されているプラグインと付属するデモスクリプトFFTでは、CUDAなしに比べて4分の1の実行時間になった。

OpenCV[編集]

OpenCV 2.2[19]でCUDAを使ったアクセラレータであるgpuモジュールが追加された。

出典[編集]

  1. ^ 第3回 CUDAとGPUコンピューティングの広がり | Think IT
  2. ^ 日経エレクトロニクス 2007/10/8 「プロセサはマルチ×マルチへ」
  3. ^ HPCシンポジウムで見えたTSUBAME2.0の設計思想 (1) ポストペタスケールへ向けGPUをどう活用していくのか
  4. ^ 第6回 CUDAプログラミングモデル(1) | G-DEP
  5. ^ NVIDIA CUDA 1.0、GPUコンピューティング向けに機能を強化 | NVIDIA
  6. ^ 並列プログラミング規格「OpenCL 1.0」が標準として批准 - @IT
  7. ^ 西川善司の3Dゲームファンのためのグラフィックス講座。台頭するDirectCompute技術 - GAME Watch
  8. ^ NVIDIA GPUコンピューティング応用事例のご紹介
  9. ^ 【GTC2014】NVIDIA、基調講演でCUDAを自動車にもたらす開発キット「JETSON TK1」の提供開始など発表 / NVLink、3Dメモリで、帯域幅問題を解消する新GPU「Pascal(パスカル)」も計画 - Car Watch
  10. ^ 第4回 実際にCUDAを使ってみる | G-DEP
  11. ^ NVIDIAのCUDAアーキテクチャGPUにおけるFortranサポート
  12. ^ PGI CUDA Fortran のコンパイル・オプション
  13. ^ コンパイラ、そしてもっと:アクセラレーター・プログラミング
  14. ^ 第3回 CUDAとGPUコンピューティングの広がり | Think IT
  15. ^ ASCII.jp:OpenCLでCUDAを追撃!? AMD「ATI Stream」が狙うものは
  16. ^ SIGGRAPH ASIA 2009 - 非プラットフォーム依存パラレルの本命、「OpenCL」最新事情 (6) OpenCLはCUDAやDirectComputeと競合するのか | マイナビニュース
  17. ^ 4Gamer.net ― NVIDIA製GPUが「Photoshop」「After Effects」「Premiere Pro」の最新版「CS4」アクセラレーションをサポート。ムービーでその効果をチェック
  18. ^ Doc:JA/2.6/Manual/Render/Cycles/GPU Rendering - BlenderWiki
  19. ^ OpenCV 2.2 Released - ROS robotics news

関連項目[編集]

関連書籍[編集]

  • 青木尊之・額田彰 『はじめてのCUDAプログラミング』 工学社〈I/O books〉、2009年11月ISBN 978-4777514779NCID BB00109838
  • 岡田賢治 『CUDA高速GPUプログラミング入門』 小山田耕二・監修、秀和システム、2010年3月ISBN 978-4-7980-2578-0NCID BB01650115
  • Jason Sanders; Edward Kandrot (2011). CUDA by example : an introduction to general-purpose GPU programming. Addison-Wesley. ISBN 0131387685. OCLC 535495666. 
  • 『GPUプログラミング入門 = Introduction to GPU Programming : CUDA5による実装』 伊藤智義・編、講談社、2013年5月ISBN 978-4-06-153820-7

外部リンク[編集]