我正在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);
然后我将输出复制到主机内存并将其写入视频。 这些是仅使用作为输入提供的dimGrid和dimBlock调用其内核的c代码。也:
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选项进行编译。我只是在某处读到它。谁能告诉我应该如何选择呢?
答案 0 :(得分:1)
也许您应该尝试在没有-arch = sm_11标志的情况下进行编译。 当您的GPU支持SM 2.0时,sm 1.1是第一个支持全局内存上的原子操作的架构。因此,除非为了向后兼容,否则没有理由为SM 1.1编译。
一个可能的问题可能是SM 1.1不支持全局内存中64位整数的原子操作。所以我建议你不用-arch选项重新编译代码,或者使用 -arch = sm_20如果你喜欢