shuffle コマンドを使用して、2 つの異なるスレッドが同時に同じレジスタ値を更新しようとすると、競合状態/更新の消失はありますか?
1 に答える
3
これは、未回答のリストからこの質問を削除するためにここで提供された遅い回答です。
CUDA Cプログラミングガイドから
組み込み関数により、
__shfl()
共有メモリを使用せずにワープ内のスレッド間で変数を交換できます
スレッドは、スレッドに割り当てられi
たレジスタの値を読み取ることはできますが、変更することはできないという考え方です。したがって、上記のコメントで指摘されているように、競合状態はありません。r
j
CUDA C Programming Guide は、ワープ全体で単一の値をブロードキャストする次の例も提供します
global__ void bcast(int arg) {
int laneId = threadIdx.x & 0x1f;
int value;
if (laneId == 0) // Note unused variable for
value = arg; // all threads except lane 0
value = __shfl(value, 0); // Get "value" from lane 0
if (value != arg) printf("Thread %d failed.\n", threadIdx.x); }
void main() {
bcast<<< 1, 32 >>>(1234);
cudaDeviceSynchronize();
}
この例では、ワープ内のvalue
スレッドに割り当てられたレジスタの値は0
、ワープ内の他のすべてのスレッドにブロードキャストされ、ローカルvalue
レジスタに割り当てられます。他のすべてのスレッドは、スレッドに割り当てられたレジスタの値を変更しようとはしていません(変更することもできません) 。value
0
于 2014-06-05T21:31:42.997 に答える