CUDA

整理箱

情報源

 * NVIDIA official site http://developer.nvidia.com/object/gpucomputing.html
 * bioinformaticsへの応用 http://www.nvidia.co.jp/object/tesla_bio_workbench_jp.html
 * jCUDA official site: http://www.jcuda.org/
 * javadoc: http://www.jcuda.de/jcuda/doc/index.html

インストール

 * CUDA, JCUDAを遺伝研スパコンにインストール

利用例

 * CUDAのインストール
 * CUDA / インストール / CUDA 2.3, Ubuntu 9.10
 * CUDA / インストール / CUDA 3.2, Ubuntu 10.04
 * $$a_1>a_2 > \cdots > a_n$$をどの程度満たすかの計算 ( CUDA / vec_comp )

概略
細かいことを抜きにするとCUDAのプログラムは概略以下のように動作すると考えてよい.




 * GPUの各コア(streaming processorともいう）の上では同じ内容のプログラムが並列に動作する. 各コア上で動作しているプログラムのことをスレッドと呼ぶ.
 * 各スレッドは、自分が動作している「仮想的な」コアの位置を知っている. 仮想的なコアの位置は((blockIdx.x, blockIdx.y, blockIdx.z), (threadIdx.x, threadIdx.y,threadIdx.z))という座標で表される. 上記の図を参照.
 * 上記の図におけるグリッドの形、ブロックの形はプログラマが決める. つまりgridDim, blockDimはプログラマが目的に合わせて決める. この形を決めることによりループ(for文に相当するロジック）を表現するのである. gridDim.x, gridDim.yの最大値は65535で、全体として最大65535x65535x512個のスレッドを作ることができる.
 * 各スレッドは、GPUのグローバルメモリ（ビデオメモリともいう）の上に置いてあるデータを読んだり書いたりできる.
 * グローバルメモリ上のデータは浮動小数点数の配列である. 各スレッドが動作する座標をもとに、各スレッドは配列のどの要素にアクセスするかを決める. ここで「配列」とは一次元配列のことと考えて差し支えない. 
 * こうやって各スレッドが配列の各部分についての計算を実行することにより、全体として目的の計算を行うようプログラムする.