【发布时间】:2021-12-10 04:58:14
【问题描述】:
我正在尝试制作一个简单的 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。
【问题讨论】:
-
res 是 unsigned char 类型。 255 是最大可以存储在 8 位类型。将 res 矩阵类型更改为更宽的 16 或 32 位整数。
-
OpenCV 矩阵使用倾斜内存 AFAIK。我非常怀疑您的索引是否正确,即使您修复了 8 位整数溢出错误