0
私はベクトル削減を行うカーネルに取り組んでいます。同じメモリバンクにアクセスする同じスレッドが競合を2回引き起こしますか?
コード:
それは基本的に0私は512フロート要素のブロックと、このスキームを以下だベクトルの全ての位置を加算した位置に結果を格納します
//scratch[] is a vector located in shared memory with all 512 elements
NUM_ELEMENTS = 512;
for(stride=NUM_ELEMENTS/2; stride>=1; stride = stride/2) {
if (threadIdx.x < stride){
scratch[threadIdx.x] += scratch[threadIdx.x + stride];
}
__syncthreads();
}
奇妙なことは、銀行間の競合が発生することを期待しています。私はそうではありません。最初の反復では、スレッド0は同じバンクにある位置0と位置256を合計しています。スレッド1は位置1と位置257を加算していきます。
これらの操作はすべて、同じバンクから、2つの異なる値を得るために、ワープの各スレッドを必要とし、まだ、私は一切の競合を取得しない:
私は何をしないのですか?
ありがとうございます。私はあなたが今何を言っているのかを見ると、恥ずかしいほど明らかです。ありがとうございました! – ismarlowe