0

我在 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 选项进行编译。我只是在某个地方读到它。谁能告诉我应该怎么选?

4

1 回答 1

1

也许您应该尝试在没有 -arch=sm_11 标志的情况下进行编译。sm 1.1 是第一个支持全局内存原子操作的架构,而您的 GPU 支持 SM 2.0。因此没有理由为 SM 1.1 编译,除非为了向后兼容。

一个可能的问题是 SM 1.1 不支持对全局内存中 64 位整数的原子操作。所以我建议你重新编译没有 -arch 选项的代码,或者如果你喜欢使用 -arch=sm_20

于 2012-07-29T23:46:37.987 回答