Cuda:有什么方法可以阻止其他线程更改共享或全局变量?

时间:2014-12-23 08:10:27

标签: cuda deadlock atomic

说,我有一个共享变量 checker ,程序的工作密度不同,即。每个线程都适用于一种密度

  __shared__ int Checker;
  int TID = blockDim.x * blockIdx.x + threadIdx.x;

因此每个线程的密度为:density [TID]

****几个计算*****

所以在某些时候,如果密度增加超过阈值,我需要改变检查器的值。

类似的东西:

 if( density[TID] > threshold)
        Checker=density[TID];

但是如果超过1个线程满足条件,那么可能存在竞争条件,那么我该怎样做才能避免竞争条件。

我可以使用syncthreads并使用它来循环检查它1,但这将是巨大的序列化和缓慢。

我没找到任何原子操作。 那么,我如何在这里避免竞争?

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
    }
}