現在地 >> メニュー >> CUDA >> CUDA編02 >> CUDA編02::組み込み変数

組み込み変数とアクセス方法


GPU上でデータアクセスに使う組み込み変数と関連するものは次の通り

gridDim

dim3型。グリッドの次元を持っている。

blockIdx

uint3型。ブロックのインデックスを持っている。(上の図でいう(0,1)とか(1,1)とか)

blockDim

dim3型。ブロックの次元数をもっている。

threadIdx

uint3型。スレッドのインデックスをもっている。

【例】
//GPU用にブロックとスレッドを用意
dim3 grid(2,2,1);//2×2のグリッドサイズ(1グリッドには4ブロック)
dim3 block(5,5,1);//5×5のブロックサイズ(1ブロック25スレッド)

cuAddValue<<<grid,block>>>(gpuAry);
これは以下のような状態となる



アクセス方法

1次元グリッド、1次元ブロック

dim3 grid(b,1,1);
dim3 block(a,1,1);
などのようにa、bの部分のみ変わる場合
スレッドId = blockIdx.x * blockDim.x + threadIdx.x 

2次元グリッド、1次元ブロック

dim3 grid(b,c,1);
dim3 block(a,1,1);
などのようにa、b、cの部分のみ変わる場合
スレッドId = (blockIdx.y * gridDim.x + blockIdx.x) * blockDim.x + threadIdx.x 

2次元グリッド、2次元ブロック

dim3 grid(c,d,1);
dim3 block(a,b,1);
などのようにa、b、c、dのが変わる場合
スレッドId
 = threadIdx.x+blockDim.x*threadIdx.y
 + (blockIdx.x*blockDim.x*blockDim.y)
 + (blockIdx.y*blockDim.x*blockDim.y*gridDim.x)

なおここまでになったら、
1次元配列風にアクセスしてもよいが、すなおに2つに分けた方がわかりやすい(と思う)。
... ...
unsigned int x = blockIdx.x*blockDim.x + threadIdx.x;
unsigned int y = blockIdx.y*blockDim.y + threadIdx.y;
... ...

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






▲よろしければ広告のクリックもお願いします


▲ランキングに参加しました

管理人/副管理人のみ編集できます