CUDAを使って単純な並列処理プログラムを実行する

 

CUDAの単純なプログラムコード

CUDAの初期化と終了を行うだけのプログラムです。CUT_DEVICE_INITを実行するとデバイス名が表示されるようです。 私の場合は、使用するGPUとしてGeForce 8800 GTが認識されたようです。以下は実行結果。

Using device 0: GeForce 8800 GT

Press ENTER to exit...
 

メモリの転送

次は、実際にホストメモリのデータをGPUのデバイスメモリに転送します。

ただし、これだけでは動作している様子がわからないので次は実際にGPUを使った演算処理を行います。

CUDA_SAFE_CALL()

CUDA_SAFE_CALLは、_DEBUGが定義されていると、引数の関数を呼び出して、その戻り値のエラーを検査しまする エラーの場合はエラーメッセージが出力されます。

 

GPUを使った計算と計算結果の出力

GPUで計算してその結果を返すには「メインメモリからGPUメモリへの移動→GPUでの計算処理→GPUメモリからメインメモリへの移動」というプロセスが 必要になってきます。

実行結果は以下のようになります。GPU関数によって配列の要素の値が加算されているのがわかります。

Using device 0: GeForce 8800 GT
x[0] = 1
x[1] = 2
x[2] = 3
x[3] = 4
x[4] = 5
x[5] = 6
x[6] = 7
x[7] = 8
x[8] = 9
x[9] = 10

Press ENTER to exit...

ただし今回のは計算処理を行うスレッド数が1つで、並列処理をしているわけではないのでCUDAもといGPUの利点を活かしていません。

 

並列処理

GPU関数であるcudaOperateにforループがなくなっているのがわかります。代わりに配列を指定する変数が「threadIdx.x」 となっています。また、スレッド数がN個になっています。それぞれのスレッドが同時にgpu変数配列の値を加算処理することとなります。

スレッドは3次元まで指定可能で、各次元の最大スレッド数は、512,512,64となっています。

 

このカテゴリのその他の記事