与CUDA洗牌的比赛条件?

时间:2012-08-16 09:34:22

标签: cuda

使用shuffle命令,当两个不同的线程同时尝试更新相同的寄存器值时,是否存在竞争条件/丢失更新?

1 个答案:

答案 0 :(得分:3)

这是一个迟到的答案,用于从未答复的列表中删除此问题。

来自CUDA C编程指南

  

__shfl()内在函数允许在其中的线程之间交换变量   不使用共享内存的warp

这个想法是线程i可以读取但不改变分配给线程r的寄存器j的值。所以,正如上面的评论所指出的,没有竞争条件。

“CUDA C编程指南”还提供了以下示例,用于在warp

中广播单个值
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();
}

在此示例中,分配给warp中的线程value的{​​{1}}寄存器的值将广播到warp中的所有其他线程并分配给本地0寄存器。所有其他线程未尝试但也不能更改分配给线程{{1}的value寄存器的值}}