在 CUDA 内核中,我的代码类似于以下内容。我正在尝试为每个线程计算一个分子,并将分子累加到块上以计算分母,然后返回比率。但是,CUDA 将 denom 的值设置为块中具有最大 threadIdx.x 的线程为 numer 计算的任何值,而不是跨块中所有线程计算的 numer 值的总和。有谁知道发生了什么?
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,并且某些其他值不限于其他线程的范围在块中。