最終更新:2014-02-10 (月) 11:20:45 (3721d)  

CUDA
Top / CUDA

Compute Unified Device Architecture

http://developer.nvidia.com/cuda

http://www.nvidia.co.jp/object/cuda_home_new_jp.html

The CUDA Toolkit is a C language development environment for CUDA-enabled GPUs.

概要

  • CUDA はハードウェアとソフトウェアをカバーするアーキテクチャで、CC++FortranOpenCLDirectCompute などさまざまな言語で書かれたプログラムをNVIDIA GPU で実行することができます。
  • 3.20GHzのPentium DGeForce 8800 GTXを比較した場合、18~77倍もの性能差があり、扱うデータサイズが大きくなるほど、その差は広がる傾向にあるという。

特徴

  • C言語を独自に拡張 (とC++の一部の構文)
  • デバイス情報の取得
  • CPU(ホスト)、GPU(デバイス)間でのメモリ転送をサポート
  • DirectXOpenGLとの相互運用
  • スレッド管理
  • CUDAを使用するとGPUは並列演算コプロセッサ?として利用可能
  • 複数のGPUに対応
  • シェーダ言語に比べると簡単

Technology Features

  • Standard C programming language enabled on a GPU
  • Unified hardware and software solution for parallel computing on CUDA-enabled NVIDIA GPUs
  • CUDA compatible GPUs range from lower power notebook GPUs to high performance, multi-GPU systems
  • CUDA-enabled GPUs support the Parallel Data Cache and Thread Execution Manager
  • Standard numerical libraries for FFT (Fast Fourier Transform) and BLAS (Basic Linear Algebra Subroutines)
  • Dedicated CUDA driver for computing
  • Optimized direct upload and download path from the CPU to CUDA-enabled GPU
  • CUDA driver interoperates with OpenGL and DirectX graphics drivers Support for Linux 32/64-bit and Windows XP 32/64-bit operating systems
  • Direct driver and assembly level access through CUDA for research and language development

開発ツール

  • ランタイム用ドライバ - グラフィックドライバ?にCUDAのランタイムドライバは含まれている
  • Developer Drivers - CUDAのデバッグ実行するのに必要なドライバ
  • CUDA Toolkit - CUDAを使用可能なGPUのためのC言語開発環境
  • NVIDIA GPU Computing SDK(旧CUDA SDK) - サンプルコードとか。

CUDA/バージョン

CUDA/世代

Compute Capability

CUDA/ドキュメント

#include <stdio.h>
#include <cutil.h>
int main( int argc, char** argv) 
{
    CUT_DEVICE_INIT();
    CUT_EXIT(argc, argv);
    return 0;
}

CUDA/用語

ホスト

  • CPUシステムメモリ?

デバイス

CUDA/カーネル

  • デバイス上で実行される関数

スレッド/スレッドブロック?/グリッド

  • SP数より圧倒的に多いスレッドで計算することでGPUの高い性能を発揮できる
  • GPUスレッドを超並列実行する構造となっているので、多数をスレッドをどのように管理するかが問題になる。
  • CUDAでは、スレッドのまとまりをブロック?(スレッドブロック?)と呼ぶ。
    • CUDAでは最大3次元のスレッドの配列をブロックとすることができる。
  • 同じサイズのブロックをまとめたものをGridと呼び、グリッドは2次元のブロックの配列を含むことが出来る。
    • このグリッドがホストから実行を指令する単位で、グリッド内の全スレッドは同じプログラム(カーネルと呼ぶ)を実行する。

CUDA/メモリ

  • コンピュータ上のメインメモリには直接アクセスはできない。そのため、cudaMemcpyを使って、メインメモリからグラフィックカード上のメモリへ転送してやる必要がある。
    • グローバルメモリは同一グリッド内であれば、どのブロック、どのスレッドからもアクセスできる。
    • シェアードメモリは同一ブロック内のスレッドからしかアクセスできないものの、グローバルメモリに比べて、きわめて高速にアクセスできる。

プログラミングの流れ

  • GPUの初期化
  • GPU上のデバイス・メモリ領域の確保
  • ホストがGPUに計算させるデータを用意
  • CUDAのAPI(Application Programming Interface)を使用して,ホストからデバイス・メモリへデータを転送
  • スレッド数,ブロック数を指定してCUDA/カーネルを実行
  • ホストがCUDAのAPIを使用してデバイス・メモリ上の計算結果を回収

マルチプロセッサで実行できる最大のブロック数とスレッド

ハードウェア構成

関連

参考

参考