CUDA
[Wikipedia|▼Menu]
□記事を途中から表示しています
[最初から表示]

SDKとなるCUDA Toolkitには、CUDA実装によるC++向けのテンプレートベース並列アルゴリズムライブラリ「Thrust」も付属する[22]

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

CUDA FortranThe Portland Group (PGI) から提供されている[27]Fortran 2003 を拡張している[28]

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

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-X

NVIDIAはCUDA上で構築したライブラリの総称をCUDA-Xと呼んでいる。以下のものが含まれる。[30]

数学

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


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などを参照のこと。
開発ツール

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

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

CUDAはNVIDIAが独自に開発を進めているGPGPU技術であり、NVIDIA製のハードウェア性能を最大限引き出せるように設計されている[33]。CUDAを利用することで、NVIDIA製GPUに新しく実装されたハードウェア機能をいち早く活用することができる。例えばKepler世代以降のGPUで使用可能なWarpシャッフル命令を使用することで、共有メモリを介するよりもさらに高速な並列リダクションを実行することができる[34] [35]。CUDA同様の類似GPGPU技術として代表的なものはOpenCLDirectComputeが挙げられるが、いずれもハードウェアアーキテクチャを標準化しベンダーの違いを吸収するAPI層であるため、CUDAと比較すると抽象化の度合いは低いローレベルAPIではあるものの、ハードウェア特有の先進的機能を使った細やかなチューニングによりそのハードウェアの限界性能を引き出すのは難しい[36]

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

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

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

DirectX 10世代(G80世代)以降の統合型シェーダーアーキテクチャを採用したNVIDIA製GPUがCUDAに対応している[注釈 1]

NVIDIA GeForce 8シリーズ以降(一般/ゲーミング向け)


次ページ
記事の検索
おまかせリスト
▼オプションを表示
ブックマーク登録
mixiチェック!
Twitterに投稿
オプション/リンク一覧
話題のニュース
列車運行情報
暇つぶしWikipedia

Size:58 KB
出典: フリー百科事典『ウィキペディア(Wikipedia)
担当:undef