【发布时间】:2010-10-14 23:17:37
【问题描述】:
我正在尝试创建一个 cuda 程序,该程序通过缩减算法计算长向量中真值(由非零值定义)的数量。我得到了有趣的结果。我得到 0 或 (ceil(N/threadsPerBlock)*threadsPerBlock),都不正确。
__global__ void count_reduce_logical(int * l, int * cntl, int N){
// suml is assumed to blockDim.x long and hold the partial counts
__shared__ int cache[threadsPerBlock];
int cidx = threadIdx.x;
int tid = threadIdx.x + blockIdx.x*blockDim.x;
int cnt_tmp=0;
while(tid<N){
if(l[tid]!=0)
cnt_tmp++;
tid+=blockDim.x*gridDim.x;
}
cache[cidx]=cnt_tmp;
__syncthreads();
//reduce
int k =blockDim.x/2;
while(k!=0){
if(threadIdx.x<k)
cache[cidx] += cache[cidx];
__syncthreads();
k/=2;
}
if(cidx==0)
cntl[blockIdx.x] = cache[0];
}
然后主机代码收集 cntl 结果并完成求和。这将是一个更大项目的一部分,其中数据已经在 GPU 上,因此如果它们工作正常,那么在那里进行计算是有意义的。
【问题讨论】:
标签: c++ parallel-processing cuda