3
在CUDA内核,我具有类似于下面的代码。我试图计算每个线程一个分子,并在分块上累积分子以计算分母,然后返回比率。然而,CUDA被设置为任何值的块计算NUMER由线程拥有最大threadIdx.x,而不是在块穿过的所有线程计算的NUMER值的总和DENOM的价值。有谁知道发生了什么事?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,而是它等于1.0每个线程,其中threadIdx.x为最大,以及一些其他值并不局限于到块中其他线程的范围。
为了说明这一点,这里的逻辑被称为简化。在cuda sdk中有几个这样的例子。请参阅:cuda-sdk/C/src/reduction/reduction_kernel.cu – 2010-03-05 19:08:23