2012-03-25 7 views
2

は、マトリックス索引付けのこの正しい式です(dim3 threadBlock =(A、B、1)、dim3 blockGrid =(C、D、1)、A、B、C、Dはいくつかの数字です)。udaスレッド索引付け

int i = (blockIdx.y * gridDim.x + blockIdx.x) * blockDim.x + threadIdx.x; 
int j = (blockIdx.x * gridDim.y + blockIdx.y) * blockDim.y + threadIdx.y; 

答えて

1

これは、スレッドからマトリックスにインデックスを付ける1つの方法ですが、唯一の方法ではありません。たとえば、カーネルを変更して、各スレッドが複数の行列項目を扱うようにすることができます。

+0

1つのスレッド= 1つの行列アイテムが最速の方法ではありませんか? – user1281071

+1

user1281071:あなたはあなたの質問で最も速い方法を求めませんでした:-)いずれの場合でも、最も速いインデックスはスピードの唯一の要因ではなく、カーネルで計算しようとするものにも依存します。 –

+0

ok、sry :)私はシステムのようにしたいと思います:1つのスレッド= 1つの行列アイテムですが、上記の式が2次元ブロックとグリッドに対して正しいかどうかわかりません。 – user1281071

5

これは私の目には見えません。二次元CUDAグリッド内の任意のスレッドの(i,j)インデックスを使用すると、線形メモリに格納された配列にアクセスしている場合の等価(i,j)インデックスが

int mindex_colmajor = idx_i + idx_j * LDA; 

又は

int mindex_rowmajor = idx_j + idy_i * LDA; 
のいずれかである

int idx_i = blockIdx.x * blockDim.x + threadIdx.x; 
int idx_j = blockIdx.y * blockDim.y + threadIdx.y; 

あります配列がrow major or column major orderに格納されているかどうかによって、

になります。メモリ内の最初の次元(または同等のピッチ)はLDA。その後

value = array[mindex] 
mindexは、上記計算された列または行主要主要な指標のいずれかである

としてメモリにアクセスします。

+0

返信ありがとうございます。 グリッドに関する情報はありません。私は、NVIDIAフォーラムで2次元ブロックとグリッドの例を見つけたので混乱しています: UniqueBlockIndex = blockIdx.y * gridDim.x + blockIdx.x; UniqueThreadIndex = UniqueBlockIndex * blockDim.y * blockDim.x + threadIdx.y * blockDim.x + threadIdx.x; しかし、2つのインデックス(idx_iとidx_j)が必要です – user1281071

+1

"グリッドに関する情報はありません"とはどういう意味ですか?私があなたに与えた情報は、正確かつ容易にCUDAプログラミングガイドで見つけられます。それを探すために気を付ける必要があります...... – talonmies

+0

「グリッドに関する情報」とは、gridDim.x – user1281071