当大小不是2的幂时,减少矢量和?

时间:2013-03-01 15:48:39

标签: cuda

对于GPU上的经典缩减算法,如果向量的大小是2的幂,它就能很好地工作。如果不是这样的话怎么办?在某些时候,我们将不得不找到奇数个元素的总和。处理这个问题的最佳方法是什么?

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。