我想运行一个 cuda 程序,但我是初学者。我必须为直方图编写一个程序。但是有桶。根据 maxValue(示例中的 40),该数字将被添加到相应的存储桶中。如果我们有 4 个桶:
历史:| 1 | 10 | 30 | 39 | 32 | 2 | 4 | 5 | 1 |
0-9(第一个桶)
10-19(第二桶)
20-29(第三桶)
30- 39(第四桶)
我的 GPU 具有计算能力 1.1。
我试图做一些事情,比如为每个线程在他的临时表上添加他的值的块共享 temp[]:
__global__ void histo_kernel_optimized5( unsigned char *buffer, long size,
unsigned int *histo )
{
extern __shared__ unsigned int temp[];
temp[threadIdx.x] = 0;
__syncthreads();
int i = threadIdx.x + blockIdx.x * blockDim.x;
int offset = blockDim.x * gridDim.x;
int bucketID;
while (i < size)
{
bucketID = array[i]/Bwidth;
atomicAdd( &temp[bucketID], 1);
i += offset;
}
__syncthreads();
atomicAdd( &(histo[threadIdx.x]), temp[threadIdx.x] );
}
histo_kernel_optimized <<<array_size/buckets, buckets,buckets*sizeof(unsigned int)>>>(buffer,SIZE, histogram)
但是编译器说:指令 '{atom,red}.shared' 需要 . 目标 sm_12 或更高
我还尝试为每个创建的线程创建一个临时表:
__global__ void histo_kernel_optimized5( unsigned char *buffer, long size,
unsigned int *histo )
{
unsigned int temp[buckets];
int j;
for (j=0;j<buckets;j++){
temp[j]=0;
}
int bucketID;
int i = threadIdx.x + blockIdx.x * blockDim.x;
int offset = blockDim.x * gridDim.x;
while (i < size)
{
bucketID = array[i]/Bwidth;
temp[bucketID]++;
i += offset;
}
for (j=0;j<buckets;j++){
histo[j] += temp[j];
}
}
但是编译器不允许我这样做,因为它需要一个常量来创建临时表。但问题是,桶是为命令行动态给出的。
还有另一种方法吗?我不知道该怎么做。我很困惑。