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