用户
 找回密码
 立即注册
曹建伟 该用户已被删除
发表于 2013-7-24 16:38:33
21382
下面是关于CUDA4.0源文件reduction的doc里面reduct7的代码。有一点不懂的是blocksize是什么?难道是blockDim.x吗?
当我设blocksize=blockDim.x,时结果不正确,而且两处printf的结果居然也不一样,为什么呢?
template <unsigned int blockSize>__device__ void warpReduce(volatileint *sdata, unsigned int tid) {if (blockSize >= 64) sdata[tid] += sdata[tid + 32];if (blockSize >= 32) sdata[tid] += sdata[tid + 16];if (blockSize >= 16) sdata[tid] += sdata[tid + 8];if(blockSize >= 8) sdata[tid] += sdata[tid + 4];if (blockSize >= 4) sdata[tid] += sdata[tid + 2];if (blockSize >= 2) sdata[tid] += sdata[tid + 1];}template <unsigned int blockSize>__global__ voidreduce6(int *g_idata, int *g_odata, unsigned int n) {extern __shared__ int sdata[];unsigned int tid = threadIdx.x;unsigned int i = blockIdx.x*(blockSize*2) + tid;unsigned int gridSize = blockSize*2*gridDim.x;sdata[tid] = 0;while (i < n){sdata[tid] += g_idata + g_idata[i+blockSize]; i += gridSize; printf("%f\n",sdata[tid]);}__syncthreads();printf("%f\n",sdata[tid]);if (blockSize >= 512) { if (tid < 256) { sdata[tid] += sdata[tid + 256]; } __syncthreads(); }if (blockSize >= 256) { if (tid < 128) { sdata[tid] += sdata[tid + 128]; } __syncthreads(); }if (blockSize >= 128) { if (tid < 64) { sdata[tid] += sdata[tid + 64]; } __syncthreads(); }if (tid < 32)warpReduce(sdata, tid);if (tid == 0) g_odata[blockIdx.x] = sdata[0];}


使用道具 举报 回复
发表于 2013-7-24 16:39:13
本帖最后由 曹建伟 于 2013-7-24 19:56 编辑

已解决!
使用道具 举报 回复 支持 反对
发表于 2013-8-12 10:11:21

回帖奖励 +1 CUDA币

曹建伟 发表于 2013-7-24 16:39
已解决!

还能领不?
使用道具 举报 回复 支持 反对
发新帖
您需要登录后才可以回帖 登录 | 立即注册