「各ワープには連続したスレッドIDが含まれ、最初のワープにはスレッド0が含まれているため、最初の32スレッドを最初のワープに含める必要があります。また、1つのワープ内のすべてのスレッドが、使用可能なストリーミングマルチプロセッサで同時に実行されることも知っています。
私が理解したように、そのため、ワープが1つだけ実行されている場合は、スレッドの同期は必要ありません。__syncthreads()
しかし、最後から2番目のif
ブロックのいずれかを削除すると、以下のコードは間違った答えを生成します。私は原因を見つけようとしましたが、何もできませんでした。私は本当にあなたの助けを願っています、それであなたはこのコードの何が悪いのか教えてくれますか?なぜ私は最後だけを残し__syncthreads()
て正しい答えを得ることができないのですか?
#define BLOCK_SIZE 128
__global__ void reduce ( int * inData, int * outData )
{
__shared__ int data [BLOCK_SIZE];
int tid = threadIdx.x;
int i = blockIdx.x * blockDim.x + threadIdx.x;
data [tid] = inData [i] + inData [i + blockDim.x / 2 ];
__syncthreads ();
for ( int s = blockDim.x / 4; s > 32; s >>= 1 )
{
if ( tid < s )
data [tid] += data [tid + s];
__syncthreads ();
}
if ( tid < 32 )
{
data [tid] += data [tid + 32];
__syncthreads ();
data [tid] += data [tid + 16];
__syncthreads ();
data [tid] += data [tid + 8];
__syncthreads ();
data [tid] += data [tid + 4];
__syncthreads ();
data [tid] += data [tid + 2];
__syncthreads ();
data [tid] += data [tid + 1];
__syncthreads ();
}
if ( tid == 0 )
outData [blockIdx.x] = data [0];
}
void main()
{
...
reduce<<<dim3(128), dim3(128)>>>(dev_data, dev_res);
...
}
PS私はGT560Tiを使用しています