我正在为图片写一个直方图的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 data:直方图大小的数组[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);
}
答案 0 :(得分:5)
您是否看过SDK示例? “histogram”示例可在CUDA SDK中获得(目前版本为3.0的NVIDIA developer site,版本3.1 beta适用于registered developers)。
带有示例的文档很好地解释了如何处理求和,或者使用GPU上的全局内存原子,或者分别收集每个块的结果,然后单独进行缩减(在主机或GPU上)。 / p>
答案 1 :(得分:2)
使用CUDA(或通常使用GPGPU)实现时,直方图效率不是特别高效 - 通常需要在共享内存中生成大量部分直方图,然后对它们求和。您可能需要考虑将此特定任务保留在CPU上。
答案 2 :(得分:0)
您必须使用原子函数阻止其他线程使用相同的内存,或使用部分直方图。无论哪种方式,除非输入图像非常大,否则效率不高。