denom numer 按块中最大的线程 threadIdx.x ,而不是
denom
numer
threadIdx.x
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;
result 应该始终在0和1之间,并且整个块的总和应该为1,但对于每个线程,它都等于1.0,其中 threadIdx。X
result
threadIdx。X
您没有将求和正确同步到 blockDim.x 位置。没有一个线程在加和之前等待看到其他线程写了什么。有点像
blockDim.x
高线程ID赢得b/c,我想它很有可能最后行动。
s_shared[threadIdx.x]