在CUDA内核中,我具有类似于以下代码。我正在尝试为每个线程计算一个分子,并在该块上累加分子以计算分母,然后返回比率。但是,CUDA会将denom的值设置为具有最大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;
“结果”应始终在0到1之间,并且在整个块中应合计为1,但对于其中threadIdx.x为最大值的每个线程,它的值等于1.0,而其他线程的值不限于该范围在街区。
最佳答案
您没有将汇总正确同步到blockDim.x
位置。在加总和之前,没有一个线程等待其他人写的内容。有点像
我想,高threadId赢得b / c的可能性很大,那就是最后采取行动。
为了快速求和,您要做的是对
s_shared[threadIdx.x]
这需要O(n)的工作和O(log n)的时间。