1

shuffle コマンドを使用して、2 つの異なるスレッドが同時に同じレジスタ値を更新しようとすると、競合状態/更新の消失はありますか?

4

1 に答える 1

3

これは、未回答のリストからこの質問を削除するためにここで提供された遅い回答です。

CUDA Cプログラミングガイドから

組み込み関数により、__shfl()共有メモリを使用せずにワープ内のスレッド間で変数を交換できます

スレッドは、スレッドに割り当てられiたレジスタの値を読み取ることはできますが、変更することはできないという考え方です。したがって、上記のコメントで指摘されているように、競合状態はありません。rj

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レジスタに割り当てられます。他のすべてのスレッドは、スレッドに割り当てられたレジスタの値を変更しようとはしていません(変更することもできません) 。value0

于 2014-06-05T21:31:42.997 に答える