ここでは,GPUアーキテクチャとcudaを使用する際のスレッドの関係について述べる.
(ここに記述していることに間違いなどありましたら,ご鞭撻のして頂けると幸いです)
GPUは画像処理などの並列処理に長けている.その理由としてはGPU自身に処理を行うコアが多く搭載されている事に起因する.このコア数と,一度に計算をおこなうスレッドの限界数に密接な関係があることは言うまでもない.以下,GeForce 8800 GTXを例に,GPUのアーキテクチャとcudaのスレッドの関係を少しだけ見ていく.
GeForce 8800GTX(以下G80)は16コアの処理系をもつGPUである.実際のG80のブロックダイヤは以下の通りになっている.
これを見ると,1コアあたりにSPが8個格納されている事がわかる.このSPが演算ユニットになっており,32ビットの整数演算,浮動小数点乗算,浮動小数点積和算を行う.このSPは同じ演算を4サイクルにわたり実行する事が可能となっている.つまり,一度の命令により1コアに処理を投げれるスレッドの数は8(SP数)×4(1回の処理でSPが処理を行えるサイクル数)=32となる.この1コアで1度に処理を行えるスレッド数の単位をcudaではwarpと称している.
僕のmacではモバイル版のGPUであるGeForce 9400 Mを搭載している.このコア数をNvidiaのサイトから調べると16個となっていた.他のサイトではSP数が16個と記述しており,コアとSPの区別がつけられていない状態の情報がネット上で蔓延しているようである.
実際に自身のマシンのGPUの情報そ知りたいとき,cudaのSDKのdeviceQueryを実行するとメモリ数,コア数,warpサイズ,スレッド数(ブロックやグリッドのサイズ)や速度がわかる.
ちなみに,GeForce 9400 Mでは以下のようになった.