2016-07-05 16 views
-1

最初は自分のコードでblockIdx.xを使用しましたが、削除する代わりにグローバル値を使用して、blockidx.xではなくそのブロックで使用します。私のコードが大きすぎて、大きな入力サイズで実行するとハングするので、私は助けてくれると思った。私はカウンターを原子的にインクリメントしますが、コードを実行するとハングします。誰かが私のコードを見て、私が何か間違っているかどうかを見ることができますか?blockIdをカウンタに置き換えます

__device__ int counter = 0; 

__global__ void kernel(int * ginput, int * goutput) 
{ 
    const int tid = threadIdx.x; 
    const int id = threadIdx.x + blockIdx.x * blockDim.x; 
    in myval = ginput[id]; 

    if (tid == 0) { 
    atomicAdd(&counter, 1); 
    } 

    __syncthreads(); 
    if (counter == 0) { 
    goutput[tid] = ...; 
    } 
    if (counter > 0) { 
    ... 
    } 

} 

私は私のコードでは代わりにカウンターのblockIdx.xを使用している場合、それは動作しますが、私はちょうどカウンターで

答えて

1

それを交換したいあなたはcounterblockIdx.x(すなわちの使用状況を交換したい場合はあなたが欲しいです各ブロックは、それがcounterから読み込む固有の値)を持つように、このような作業をする必要があります:

__device__ int counter = 0; 

__global__ void kernel(int * ginput, int * goutput) 
{ 
    const int tid = threadIdx.x; 
    const int id = threadIdx.x + blockIdx.x * blockDim.x; 
    __shared__ int my_block_id; 


    if (tid == 0) { 
    my_block_id = atomicAdd(&counter, 1); 
    } 

    __syncthreads(); 
    if (my_block_id == 0) { 
    goutput[tid] = ...; 
    } 
    if (my_block_id > 0) { 
    ... 
    } 

} 
あなたの方法は、あなたがこのような何かをすればするので、面倒なことになるだろう

if (counter > 5) .... 

あなたは潜在的にグローバルメモリからcounterの新しい更新された値を読んでいると、任意の数のブロックは、その値を更新したことがあり、その動作は予測できません。

関連する問題