GPUコアに関して
前回コード書かずに終わったので今回はコードを書いて示しながら説明したいですね(希望)
ちなみに前回の話はこちら
CUDAコアに関して
GPUはSM(Streaming Multiprocessor)というのが内蔵されており、この中に
- 命令ユニット
- 演算器(ALU(Arithmetic Logic Unit)とか)
- レジスタ
- キャッシュ(シェアード・コンスタン・テクスチャメモリ)
が入っています。ちなみにTesla世代とFermi世代で相当構成が変わっているので、(FermiにはSMの外にL1, L2キャッシュがあるなど) 共通部分のみ記述しています。
さらにこのSMの下に、SP(Scalar Processor)と呼ばれる、ALUをまとめたものが存在します。
コードを書くにあたってBlockとThreadという概念も登場するのですが、後で説明します。
ここでTeslaK20のGPU情報を見てみましょう
--- General Information for device 0 --- Name: Tesla K20c Compute capability: 3.5 Clock rate: 705500 Device copy overlap: Enabled Kernel execution timeout : Disabled --- Memory Information for device 0 --- Total global mem: 5368512512 Total constant Mem: 65536 Max mem pitch: 2147483647 Texture Alignment: 512 --- MP Information for device 0 --- Multiprocessor count: 13 Shared mem per mp: 49152 Registers per mp: 65536 Threads in warp: 32 Max threads per block: 1024 Max thread dimensions: (1024, 1024, 64) Max grid dimensions: (2147483647, 65535, 65535)
この情報を見てみるとSMが13基あることがわかります。
そして見慣れないThreadとBlock, Gridが登場しました。(他にも見慣れない単語はたくさんあるのですが、とりあえず笑)
Thread
実際に計算を行う部分。つまりSPのことです
Block
Threadを束ねたもの。
Max threads per block: 1024
と書かれているとおり、TeslaK20では1024個のThreadを1Blockとしています
Grid
Blockを束ねたものです
・・・
さっきの出力結果を見てみると、以下のような記述に疑問を持つと思われます。
Max thread dimensions: (1024, 1024, 64) Max grid dimensions: (2147483647, 65535, 65535)
なんでカンマで区切られているんだ??そしてdimensions
ってなんだ??
dimensionという単語から推測出来る通り、これは次元を持ちます
(i)
ならば一次元(i, j)
ならば二次元(i, j, k)
ならば三次元
という記述をすることが可能です。
計算したい内容によって次元数は変わりますし、処理内容によっては二次元・三次元を一次元のように書くことが可能です
さて、コードを示そうと思いましたが、書くのにめっちゃ疲れたので今日はもうやめますorz
正直文字だけでは非常にわかりにくいと思われるので、また作図して載せます