CUDAカーネルでは、次のようなコードがあります。私はスレッドごとに1つの分子を計算しようとしており、分母を計算して比を返すようにブロックに分子を累積しています。しかし、CUDAは、denomの値を、ブロック内のすべてのスレッドで計算されたnumer値の合計ではなく、最大のthreadIdx.xを持つブロック内のスレッドによって計算された値に設定しています。誰が何が起こっているか知っていますか?CUDA共有メモリ配列 - 奇妙な動作
extern __shared__ float s_shared[];
float numer = //calculate numerator
s_shared[threadIdx.x] = numer;
s_shared[blockDim.x] += numer;
__syncthreads();
float denom = s_shared[blockDim.x];
float result = numer/denom;
「結果」は常に0と1の間であるべきであり、ブロックを横切っ1に合計する必要があり、その代わりにそれはthreadIdx.xが最大であるすべてのスレッドの1.0に等しく、他のいくつかの値は限定されませんブロック内の他のスレッドの範囲に設定します。
これをメモするだけで、ここでのロジックは削減と呼ばれます。このサンプルはcuda sdkにいくつかあります。参照:cuda-sdk/C/src/reduction/reduction_kernel.cu –