2012-01-18 11 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

答えて

3

ここでは理論です。あなたがワープのコンセプトに精通していることを願っています。 whileループでは、ワープ内のすべてのスレッドがwhileループに入ります。 1つだけが終了し、残りのスレッドはwhileループ内に常駐します。これにより分岐が分岐し、whileループを終了したスレッドは、分岐が再び収束するまで停止します。このスレッドはmutexを解放できる唯一のスレッドなので、他のスレッドが収束するのを待つため、これは起こりません。

関連する問題