スレッドIDの使い方が分からなかったけど、
よく考えてみたら初歩的なことで悩んでいたようだ。
GPU関数呼び出すときに、
ブロック数とグリッド数を指定するが、まずはグリッド数を1のときのみ考える。
ブロック数を2次元x,yで考える。
座標で考えると、
(x,y)=(threadIdx.x, threadIdx.y)
となる。
1次元配列で考えると、
2行目は「threadIdx.xの最終列の次」からとなる。
そのため、ブロック数を2次元で指定している場合、
1次元配列の要素番号は
x + y*(xの大きさ)
となる。
1次元配列を2次元配列風に考えると、
01 02 03 04 05
06 07 08 09 10
11 12 13 14 15
こんな感じに並んでいるわけです。
ブロック数を2次元にし、
GPU側で1次元配列として使用する場合は、
Array[threadIdx.x + threadIdx.y*blockDim.x] = 代入したい値
と、こんな感じになる(blockDim.xはXのブロック幅)
→もしかして、blockDim.xの部分違ってる?
グリッド数も指定した場合の例は、後ほど。
(この記事が合っていることを確認できたらw)
よく考えてみたら初歩的なことで悩んでいたようだ。
GPU関数呼び出すときに、
ブロック数とグリッド数を指定するが、まずはグリッド数を1のときのみ考える。
ブロック数を2次元x,yで考える。
座標で考えると、
(x,y)=(threadIdx.x, threadIdx.y)
となる。
1次元配列で考えると、
2行目は「threadIdx.xの最終列の次」からとなる。
そのため、ブロック数を2次元で指定している場合、
1次元配列の要素番号は
x + y*(xの大きさ)
となる。
1次元配列を2次元配列風に考えると、
01 02 03 04 05
06 07 08 09 10
11 12 13 14 15
こんな感じに並んでいるわけです。
ブロック数を2次元にし、
GPU側で1次元配列として使用する場合は、
Array[threadIdx.x + threadIdx.y*blockDim.x] = 代入したい値
と、こんな感じになる(blockDim.xはXのブロック幅)
→もしかして、blockDim.xの部分違ってる?
グリッド数も指定した場合の例は、後ほど。
(この記事が合っていることを確認できたらw)
スポンサーサイト