使用shuffle命令,当两个不同的线程同时尝试更新相同的寄存器值时,是否存在竞争条件/丢失更新?
答案 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
寄存器的值}}