我在 GPU 上运行一些图像处理操作,我需要输出的直方图。我已经编写并测试了处理内核。我还分别测试了输出图片样本的直方图内核。它们都可以正常工作,但是当我将它们全部放在一个循环中时,我什么也得不到。
这是我的直方图内核:
__global__ void histogram(int n, uchar* color, uchar* mask, int* bucket, int ch, int W, int bin)
{
unsigned int X = blockIdx.x*blockDim.x+threadIdx.x;
unsigned int Y = blockIdx.y*blockDim.y+threadIdx.y;
int l = (256%bin==0)?256/bin: 256/bin+1;
int c;
if (X+Y*W < n && mask[X+Y*W])
{
c = color[(X+Y*W)*3]/bin;
atomicAdd(&bucket[c], 1);
c = color[(X+Y*W)*3+1]/bin;
atomicAdd(&bucket[c+l], 1);
c = color[(X+Y*W)*3+2]/bin;
atomicAdd(&bucket[c+l*2], 1);
}
}
它正在更新红色、绿色和蓝色的直方图向量。(“l”是向量的长度)当我注释掉 atomicAdds 时,它再次产生输出,但当然不是直方图。他们为什么不一起工作?
编辑:
这是循环:
cudaMemcpy(frame_in_gpu,frame_in.data, W*H*3*sizeof(uchar),cudaMemcpyHostToDevice);
cuda_process(frame_in_gpu, frame_out_gpu, W, H, dimGrid,dimBlock);
cuda_histogram(W*H, frame_in_gpu, mask_gpu, hist, 3, W, bin, dimg_histogram, dimb_histogram);
然后我将输出复制到主机内存并将其写入视频。这些是 c 代码,仅使用作为输入给出的 dimGrid 和 dimBlock 调用其内核。还:
dim3 dimBlock(32,32);
dim3 dimGrid(W/32,H/32);
dim3 dimb_Histogram(16,16);
dim3 dimg_Histogram(W/16,H/16);
我将其更改为直方图,因为它更适用于它。有关系吗?
Edit2:我正在使用 -arch=sm_11 选项进行编译。我只是在某个地方读到它。谁能告诉我应该怎么选?