2012-01-18 108 views
0

以下程序使用'Cuda By Example'实现原子锁,但运行该程序会冻结我的机器。 有人能告诉我我的程序有什么问题吗?非常感谢CUDA中的原子操作

益肺

#include <stdio.h> 


__global__ void test() 
{ 
    __shared__ int i, mutex; 

    if (threadIdx.x == 0) { 
     i = 0; 
     mutex = 0; 
    } 
    __syncthreads(); 

    while(atomicCAS(&mutex, 0, 1) != 0); 
    i++; 
    printf("thread %d: %d\n", threadIdx.x, i); 
    atomicExch(&mutex,0); 
} 
+0

上面的程序只是我想要做的一个例子。我知道我可以在上面的例子中使用atomicAdd来增加i。然而,在我的真实情况下,关键部分更复杂 – user11869 2012-01-18 21:30:36

回答

3

这里是一个理论。我希望你对扭曲的概念很熟悉。 在while循环中,warp中的所有线程都将进入while循环。只有一个会退出,剩下的线程将驻留在while循环中。这将引入一个发散分支,使得退出while循环的线程停止,直到分支再次收敛。因为这个线程是唯一可以释放互斥量的线程,所以这绝不会发生,因为它等待其他线程收敛。