使用 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(..)
函数内部调用
我一直在查看 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(..)
函数内部调用