<分区>
我正在尝试使用以下代码迭代 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 变量,因此调试器不显示它们的值。
感谢您的宝贵时间。