c++ - 如何为 GpuMat 编写内核?

标签 c++ opencv cuda

<分区>

我正在尝试使用以下代码迭代 cv::cuda::GpuMat:

__global__ void kernel(uchar* src, int rows, int cols, size_t step)
{
    int rowInd = blockIdx.y * blockDim.y + threadIdx.y;
    int colInd = blockIdx.x * blockDim.x + threadIdx.x;

    if ((rowInd < rows) && (colInd < cols))
    {
        uchar * rowptr = src + (rowInd * step);
        rowptr[colInd] = 255;
    }

}

void invoke_kernel(cv::cuda::GpuMat _img)
{
    dim3 tpb(50, 50);
    dim3 bpg(((_img.cols + 49) / 50), ((_img.rows + 49)/ 50));
    kernel<<<bpg, tpb>>> (_img.data, _img.rows, _img.cols, _img.step);

}

int main()
{


    cv::cuda::GpuMat mat;
    mat.create(cv::Size(500, 500), CV_8UC1);
    std::cout << mat.rows << " " << mat.cols << std::endl;
    invoke_kernel(mat);

    cv::Mat img;
    mat.download(img);

    cv::namedWindow("test");
    cv::imshow("test", img);
    cv::waitKey(0);

    return 0;
}

如您所见,它只是应该将整个(原本是黑色的)图像的内核设置为白色。

图像只是保持黑色,除了第一列,那是白色的。感觉就像我在某处做了一些非常愚蠢的事情,但我就是想不通:/

我检查了内核是否以正确的尺寸运行(10x10 block ,每个 block 50x50 个线程)。当我尝试使用 NVIDIA 调试器时出现另一个问题。经过一些谷歌搜索后,我发现 NVCC 编译器似乎在优化期间删除了我的 rowInd 和 colInd 变量,因此调试器不显示它们的值。

感谢您的宝贵时间。

最佳答案

事实证明,问题在于 block 大小 50x50 = 2500 有点太大了。有某种限制,我还没有弄清楚,但是,正如 CUDA 文档中所述,16x16 没问题。

所以,澄清一下:

dim3 tpb(16, 16);
dim3 bpg(((_img.cols + 15) / 16), ((_img.rows + 15)/ 16));

在 invoke_kernel 中完成这项工作。

children ,请务必阅读文档。

关于c++ - 如何为 GpuMat 编写内核?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43663801/

相关文章:

c# - EMGU CV 视频作者无法制作视频

docker - 可以在没有 GPU 的情况下运行 nvidia-docker 吗?

cuda - .cpp 和 .cu 文件的 NVCC 行为

c++ - Tensorflow 操作文档

c++ - 英特尔 C++ 编译器是否有资源编译器?

java - 0 NATIVE_LIBRARY_NAME 无法解析或不是 Linux + Eclipse + Java 的字段

c# - EmguCV Out of memory exception in x86 release mode only-Sharpening Images

c++ - CUDA 内核行为取决于 block 和线程的数量,即使不使用也是如此

c++ - 为什么这个表达式是无符号的?

c++ - 我应该使用什么数据结构来为数据库/表建模?