Я пытаюсь создать программу 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 и завершает суммированиеЭто будет частью более крупного проекта, в котором данные уже находятся на графическом процессоре, поэтому имеет смысл выполнять вычисления там, если они работают правильно.