使用 OpenCV UMat 作为输入时参数的 OpenCL 参数化

OpenCL parametization of arguments when using OpenCV UMat as input

我一直在查看 simple opencl example 的源代码以更好地理解如何编写 opencv 代码。

似乎 kernel definition 的参数列表由 9 个参数组成:

"__kernel void magnutude_filter_8u(\n"
"       __global const uchar* src, int src_step, int src_offset,\n"
"       __global uchar* dst, int dst_step, int dst_offset, int dst_rows, int dst_cols,\n"
"       float scale)\n"

但它 called 只有 3 个参数:

bool executionResult = k
     .args(
            cv::ocl::KernelArg::ReadOnlyNoSize(src), // size is not used (similar to 'dst' size)
            cv::ocl::KernelArg::WriteOnly(result),
            (float)2.0
        ) 

这在其他代码中也会发生,例如精明的 .cl and .cpp 实现。

我想知道允许这种情况发生的 UMat 结构有什么特别之处。

如果你多浏览一下 opencv 代码,你会发现 ReadOnlyNosize and WriteOnly 函数 return 一个 kernelArg,它似乎是打包到一个结构中的 4 个值,这 3 个值是您的内核 "used",对于每个 KernelArg,默认分配 2 个值,在这种情况下这些匹配 src_step、src_offset、dst_step 和 dst_offset,另一方面 dst_rows 和 dst_cols 参数是从 dst 推导出来的UMat 大小(再次参见 set() 调用),这是 OpenCL 函数调用所需的所有参数。

现在 args(...) 为每个参数调用 set(int index, T type),在 KernelArg 的情况下它将是

set(int i, const KernelArg &arg);

这是做什么的 set call,这意味着它解压缩(使用其成员)KernelArg 结构。 如果你想知道它们分配给内核的位置在很多

clSetKernelArg(..)

函数内部调用