对于GPU上的经典缩减算法,如果向量的大小是2的幂,它就能很好地工作。如果不是这样的话怎么办?在某些时候,我们将不得不找到奇数个元素的总和。处理这个问题的最佳方法是什么?
答案 0 :(得分:5)
您可以计算不具有2的幂大小的矩阵的总和。看一下这个例子:
#include <math.h>
#define N 1022 //total size
__global__ void sum(int *A, int *C)
{
__shared__ int temp[blockDim.x];
int idx = threadIdx.x+blockDim.x*blockIdx.x;
int local_idx = threadIdx.x;
temp[local_idx] = A[idx];
int i=ceil(blockDim.x/2);
__syncthreads();
while(i!=0)
{
if(idx+i<N && local_idx<i)
temp[local_idx] += tmp[local_idx+i];
i/=2;
__syncthreads();
}
if(local_idx == 0)
C[blockIdx.x] = temp[0];
}
答案 1 :(得分:0)
设置
int i = 1024;
代替
int i=ceil(blockDim.x/2);
即我应该是整数^ 2> N。