<< 12345678910111213141516171819202122232425262728293031>>
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
--/--/--(--)--:-- スポンサー広告 edit
しっくりこない
ブロックをx、スレッドをyとして考えたけど、
何か強引にやった気がする。


配列Aの水平方向座標mはm=blockDim.x ×blockIdx.x+threadIdx.xで算出でき,
垂直方向座標nはn=blockDim.y×blockIdx.y+threadIdx.y で算出できます.
配列AはN×Nの要素を持つので,配列中のある1要素へはA[n×N+m]でアクセスできます。

う~ん。
このmとnから求めようとすると、少々無理がある気がする。
(NもスレッドIDやブロックIDなどで表現すると、さらに並列処理が増えて効率的になる?)


最終的には、
threadIdx.x
+ threadIdx.y * blockDim.x
+(blockIdx.x *blockDim.x * blockDim.y)
+(blockIdx.y *blockDim.x * blockDim.y * gridDim.x)

こんな式になる。


個人的に考えたのが、
ブロック内の座標(x,y) = (threadIdx.x, threadIdx.y)
配列中の要素→threadIdx.x + threadIdx.y * blockDim.x(ブロック幅)

グリッド内の座標(x,y) = (blockIdx.x, blockIdx.y)
配列中の要素→blockIdx.x + blockIdx.y * gridDim.x(グリッド幅)

ここまではいい。

ここでブロック内の座標をx、グリッド内の座標をyとしてみたが、
結果は合っているものの、
x、yと置き換えることはできなくない?と。

グリッド内の座標を出したら、
今度はどの位置のグリッドか知りたいので、
ブロックの面積をかけてあげる。

( blockIdx.x + blockIdx.y * gridDim.x ) * blockDim.x * blockDim.y
ここにブロック内の要素を足してあげると、結果は出るが・・・やはり何か無理矢理出した感がある。

何かしっかりした説明がないものか。。。
(一応こんな感じの考え方でも、一次元になったときでも使える)
スポンサーサイト
2009/10/27(火)00:25 PC trackback:0 comment:0 edit
trackback url
http://daihouko.blog4.fc2.com/tb.php/1203-5f9067a4
trackback
comment
post a message






上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。