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

szl*_*zli 3 cuda

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

Sor*_*eni 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]; 
}
Run Code Online (Sandbox Code Playgroud)

  • 我认为这里有一些错别字,对于那些可能正在尝试编译它的人来说.在__shared__声明之前不应该有一个extern关键字吗?"tmp"也应该是"temp". (2认同)