2010-06-05 43 views
2

我正在为图片编写一个CUDA内核来处理直方图,但我不知道如何从内核返回一个数组,并且当其他线程读取它时数组将会改变。任何可能的解决方案?如何制作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 ... 
} 
} 

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

@para数据:为直方图尺寸数组当与CUDA(或与一般GPGPU)实现[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); 
} 

回答

5

你看过SDK示例吗? CUDA SDK中提供了“直方图”示例(目前NVIDIA developer site版本3.0,版本3.1测试版可用于registered developers)。

该示例文档很好地解释了如何处理您的求和,或者使用GPU上的全局内存原子,或者分别收集每个块的结果,然后分别减少(在主机或GPU上)。

2

直方图化是不是特别有效 - 通常需要生成大量的局部直方图的共享内存然后求和它们。你可能想考虑在CPU上保留这个特定的任务。

+0

但是,我的任务是尝试使用CUDA应用直方图。我无法完成它。数据无法单独实现 – kitw 2010-06-05 13:50:01

0

您将不得不使用原子功能来阻止其他线程使用相同的内存,或使用部分直方图。无论哪种方式,除非输入图像非常大,否则效率不高。