1

共有メモリにデータをロードするためにグローバル メモリにアクセスしていますが、バンクの競合があるかどうかを知りたいです。セットアップは次のとおりです。

グローバル メモリ内: g_array. サイズ (256, 64) の 2D 行列

これは、配列データをグローバル メモリから共有メモリにロードする方法です。gridDim (4, 1) と blockDim (16, 16) でカーネルを呼び出しました。

d_j = (blockIdx%x-1) * blockDim%x + threadIdx%x-1
d_l = (blockIdx%y-1) * blockDim%y + threadIdx%y-1
tIdx = threadIdx%x -1 
tIdy = threadIdx%y -1

real, shared :: s_array(0:15,0:15)

s_array(tIdx,tIdy) = g_array(d_j,d_l)
doSomthingwithMySharedMemoryData()
.....
4

1 に答える 1

2

私はあなたのコードを実際に実行したことはなく、私の fortran は私の c/c++ ほど良くはありませんが、一般的に言えば、あなたのコードは (グローバル メモリ アクセスで) うまく結合し、(共有メモリ アクセスで) バンクの競合が発生しないはずだと思います。

重要な要素は、threadIdx%xインデックスを急速に変化する行列添え字と一致させたことです。これは、fortran では最初のインデックスであり (fortran は列優先順で格納されるため)、c/c++ では 2 番目 (または最後) のインデックスです。 (c/c++ 行列は行優先順で格納されるため)。

スレッド インデックスを直接使用する以外に、subsript で他に何もしていないので、問題はないはずです。

一般に、このようなアクセスでは、グローバル メモリ結合アクセスを実現するために使用するのと同じルールを使用して、共有メモリでのバンク競合を回避することもできます。

于 2013-09-07T19:56:34.700 に答える