1-D 配列の最初の k 要素のそれぞれをオフセットで移動する必要があります。ここで、オフセットは単調に増加します。つまり、要素 i のオフセットが offset1 の場合、要素 i+1 は次を満たすオフセット、offset2 を持ちます: offset2 >= オフセット 1。
最初の k 個の要素のそれぞれで実行されるカーネルを作成しました。
if (thread_id < k) {
// compute offset
if (offset) {
int temp = a[thread_id];
__synchthreads();
a[thread_id + offset] = temp;
}
}
ただし、k = 3 についてテストすると、オフセットは実際には 0、1、1 と単調に増加します。要素 0 は、期待どおりにその位置にとどまります。ただし、要素 1 は、(要素 1 のオフセットに従って) 要素 2 だけでなく、要素 3 にもコピーされます。
つまり、スレッド 1 が要素 1 から要素 2 へのコピーを完了した後でのみ、スレッド 2 が要素 2 を読み取り、temp のコピーに格納するように見えます。
何が間違っていて、どうすれば修正できますか?
ありがとうございました!