CUDA

 

はじめに

アクセス禁止の巻き添え食ってるのに気付かずに書いたレスを無駄にしないためにこちらに避難。
追い追い真面目に整理します。

現行スレ

【GPGPU】くだすれCUDAスレ【NVIDIA】
【GPGPU】NVIDIA CUDA質問スレッド

言語の特徴

NVIDIAのGPUを演算用に使うための言語。
拡張部分以外はまんまC++と思っていい。但し、例外は使えないのとnew/deleteに癖があるので注意。
まぁ、詳しいことは公式サイトを見てくださいな、と。

gridとblockとthreadの関係

threadが一つのデータ処理単位とするとそれらを集めたのがblockで、blockを集めたのがgrid。

例えばfunc<<<blocks, threads>>>()で呼ぶ場合で考えると、概念上はblocks * threadsのデータを並列に処理するイメージ。
仮に、こんな感じの関数を用意しておいて。

 __global__ void func(float r[], const float a[], const float b[], unsigned size)
 {
   for (unsigned ic = threadIdx + blockDim * blockIdx; ic < size; ic += blockDim * gridDim) {
     r[ic] = a[ic] + b[ic];
   }
 }


こんな感じに呼べば、128thread*1000blockを並列に使いつつ、1億個処理できる。

 func<<<1000, 128>>>(r, a, b, 1億);


これで、coalescedアクセスを維持しつつ、threadも余すことなく使えるはず。 まぁ、実際にはblocksやthreadsをいくつにするかが悩ましいのだけれど。