4

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

4

2 回答 2

6

您可以计算大小不是 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]; 
}
于 2013-03-01T16:21:05.573 回答
0

int i = 1024;

代替

int i=ceil(blockDim.x/2);

即 int i 应该是整数 ^ 2 > N。

于 2019-02-16T07:56:36.140 回答