gpt4 book ai didi

c++ - CUDA 计数、缩减和线程扭曲

转载 作者:行者123 更新时间:2023-11-30 03:09:38 26 4
gpt4 key购买 nike

我正在尝试创建一个 cuda 程序,该程序通过归约算法计算长 vector 中真值(由非零值定义)的数量。我得到了有趣的结果。我得到 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 上,因此如果它们正常工作,在那里进行计算是有意义的。

最佳答案

您可以 count the nonzero-values使用一行代码 Thrust .下面是一个代码片段,用于计算 device_vector 中 1 的数量。

#include <thrust/count.h>
#include <thrust/device_vector.h>
...
// put three 1s in a device_vector
thrust::device_vector<int> vec(5,0);
vec[1] = 1;
vec[3] = 1;
vec[4] = 1;

// count the 1s
int result = thrust::count(vec.begin(), vec.end(), 1);
// result == 3

如果您的数据不在 device_vector 中,您仍然可以使用 thrust::count by wrapping the raw pointers .

关于c++ - CUDA 计数、缩减和线程扭曲,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3938337/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com