如何制作CUDA直方图内核?

kit*_*itw 2 cuda histogram

我正在为图片写一个直方图的CUDA内核,但我不知道如何从内核返回一个数组,当其他线程读取它时,数​​组将会改变.任何可能的解决方案吗?

__global__ void Hist(
    TColor *dst, //input image
    int imageW,
    int imageH,
 int*data
){
    const int ix = blockDim.x * blockIdx.x + threadIdx.x;
    const int iy = blockDim.y * blockIdx.y + threadIdx.y;

if(ix < imageW && iy < imageH)
{
  int pixel = get_red(dst[imageW * (iy) + (ix)]);
                  //this assign specific RED value of image to pixel

  data[pixel] ++; // ?? problem statement ...
 }
}
Run Code Online (Sandbox Code Playgroud)

@para d_dst:输入图像TColor等于float4.

@para数据:直方图大小的数组[255]

extern "C" void
cuda_Hist(TColor *d_dst, int imageW, int imageH,int* data) 
{
  dim3 threads(BLOCKDIM_X, BLOCKDIM_Y);
  dim3 grid(iDivUp(imageW, BLOCKDIM_X), iDivUp(imageH, BLOCKDIM_Y));
  Hist<<<grid, threads>>>(d_dst, imageW, imageH, data);
}
Run Code Online (Sandbox Code Playgroud)

Tom*_*Tom 5

你看过SDK样本了吗?"histogram"示例可在CUDA SDK中获得(目前在NVIDIA 开发人员站点上的版本3.0 ,版本3.1 beta可供注册开发人员使用).

带有示例的文档很好地解释了如何处理求和,或者使用GPU上的全局内存原子,或者分别收集每个块的结果,然后单独进行缩减(在主机或GPU上).