私は次のことをしようとしています(単純化):編集セクションを読んでください!
__shared__ int currentPos = 0;
__global__ myThreadedFunction(float *int, float *out)
{
// do calculations with in values
...
// now first thread reach this:
//suspend other threads up here
out += currentPos;
for (int i = 0; i < size; ++i)
{
*(currentPos++) = calculation[i];
}
currentPos += size;
// now thread is finish, other threads can
// go on with writing
}
では、同じメモリに書き込む前にスレッドを一時停止するにはどうすればよいですか? 各計算配列のサイズ (calculation[i] - サイズ) がわからないため、同時に書き込むことはできません。
syncthreadsとthreadfenceがあることは知っていますが、この問題に対してそれらを正しく使用する方法がわかりません。
編集: 私がやりたいことは:
2 つのスレッドがあります (たとえば)。各スレッドは、float * を新しい配列で計算しています。
計算されたスレッド 1: { 1, 3, 2, 4 }
計算されたスレッド 2: { 3, 2, 5, 6, 3, 4 }
これらの配列のサイズは、計算後にわかります。これらの配列を float *out に書きたいと思います。
最初のスレッド 1 またはスレッド 2 が書き込みを行っている場合、私には必要ありません。出力は次のようになります: * { 1, 3, 2, 4, 3, 2, 5, 6, 3, 4 } または { 3, 2, 5, 6, 3, 4, 1, 3, 2, 4} *
では、出力配列の位置を計算する方法は?
出力が次のようになるように、固定の「配列サイズ」を使用したくありません: * { 1, 3, 2, 4, ?, ?, 3, 2, 5, 6, 3, 4 } *
次の書き込み位置の共有変数 POSITION を使用できると思います。
スレッド 1 は書き込みポイントに到達します (計算後、新しい配列)。スレッド 1 は、共有変数 POSITION 彼の配列サイズ (4) に書き込みます。
スレッド 1 が一時配列を出力配列に書き込んでいる間に、スレッド 2 は変数 POSITION を読み取り、自分の tmp を追加します。配列サイズ (6) をこの変数に代入し、スレッド 1 が終了した位置から書き込みを開始します。
スレッド 3 がある場合、彼は POSITION も読み取り、配列サイズを追加して、スレッド 2 が終了する出力に書き込みます。
それで、誰かアイデアはありますか?