2012-01-18 154 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循環的線程停止,直到分支再次收斂。因爲這個線程是唯一可以釋放互斥量的線程,所以這絕不會發生,因爲它等待其他線程收斂。