繁体   English   中英

CUDA 内核的奇怪行为

[英]Strange behavior of CUDA kernel

我正在尝试制作一个简单的 Cuda 应用程序,它可以创建给定矩阵的积分图像。 我需要做的步骤之一是创建每一行的完整图像。 为了做到这一点,我想为每一行分配 1 个线程。 应该执行此操作的函数:

__global__ void IntegrateRows(const uchar* img, uchar* res)
{
    int x = blockIdx.x * blockDim.x + threadIdx.x;
    int y = blockIdx.y * blockDim.y + threadIdx.y;

    if (x >= Width || y >= Height)
        return;

    int sum = 0;
    int row = y * Width;
    for (int i = 0; i < Width - x; ++i)
    {
        res[row + i + x] = sum + img[row + i + x];
        sum += img[row + i + x];
    }
}

我使用一个大小为 3840x2160 的矩阵( cv::Mat::ones(Size(Width, Height), CV_8UC1) )进行测试。 当我尝试打印结果的内容时,它总是返回从 1 到 255 的数字序列: 控制台输出

执行配置为:

dim3 threadsPerBlock(1, 256);
dim3 numBlocks(1, 16);
IntegrateRows<<<numBlocks, threadsPerBlock >>>(img, res);

我的 GPU 是 Nvidia RTX 3090。

tl;dr:让你的输出矩阵有更大的元素

我对 CV 不太了解,但这似乎就是你在做什么:如果你对序列进行整合/前缀求和

1, 1, 1, 1, ...

你得到:

0, 1, 2, 3, ...

然后在达到元素类型的最大值时回绕。 在您的情况下,它是uchar ,即unsigned char 它的最大值是 255,再加上 1,得到 0。

如果您将输出矩阵元素类型更改为unsigned short (或者可能只是unsigned int ) - 您将不会获得环绕行为。 当然,如果你加起来是 255 而不是 1,和/或你的矩阵更大,那么类型的表示范围可能不够大。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM