说,我有一个共享变量 checker ,程序的工作密度不同,即。每个线程都适用于一种密度
__shared__ int Checker;
int TID = blockDim.x * blockIdx.x + threadIdx.x;
因此每个线程的密度为:density [TID]
****几个计算*****
所以在某些时候,如果密度增加超过阈值,我需要改变检查器的值。
类似的东西:
if( density[TID] > threshold)
Checker=density[TID];
但是如果超过1个线程满足条件,那么可能存在竞争条件,那么我该怎样做才能避免竞争条件。
我可以使用syncthreads并使用它来循环检查它1,但这将是巨大的序列化和缓慢。
我没找到任何原子操作。 那么,我如何在这里避免竞争?
答案 0 :(得分:1)
处理您提到的竞争条件的规范方法是使用原子比较和交换操作,支持CUDA的GPU支持共享和全局内存See atomicCAS in CUDA programming guide.。
__shared__ int Checker;
int TID = blockDim.x * blockIdx.x + threadId
int localChecker;
// Do some ops
if( density[TID] > threshold) {
localChecker = *(volatile int*)&Checker;
if (atomicCAS(&Checker, localChecker, density[TID]) == localChecker) {
// This thread won the write
}
}