我想获得最大的全局工作大小。我不希望内核opencl会尝试选择最适合您的内核,这可能是最大尺寸也可能不是最大尺寸。
要执行此操作,我想指定呼叫clEnqueueNDRangeKernel
时的大小。例如:
clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global_size, NULL, 0, NULL, NULL);
clgetkernelworkgroupinfo文档,指示:
cl_kernel_global_work_size:这为应用程序提供了一种机制,可以在设备上给出的自定义设备或内置的kernel on noce Indife grom询问可用于执行内核(即Global_work_size参数(的最大全局大小(即global_work_size参数(设备给出的OPENCL设备。
如何使用OpenCL C 绑定获得CL_KERNEL_GLOBAL_WORK_SIZE
?
我这样做
cl::array<size_t, 3> kernel_global_work_size = my_kernel.getWorkGroupInfo<CL_KERNEL_GLOBAL_WORK_SIZE>(my_device);
但是我有错误:
cl2.hpp:5771:12: note: candidate: template<class T> cl_int cl::Kernel::getWorkGroupInfo(const cl::Device&, cl_kernel_work_group_info, T*) const
cl_int getWorkGroupInfo(
^~~~~~~~~~~~~~~~
cl2.hpp:5771:12: note: template argument deduction/substitution failed:
cl2.hpp:5782:9: note: candidate: template<int name> typename cl::detail::param_traits<cl::detail::cl_kernel_work_group_info, name>::param_type cl::Kernel::getWorkGroupInfo(const cl::Device&, cl_int*) const
getWorkGroupInfo(const Device& device, cl_int* err = NULL) const
和此代码
cl::array<size_t, 3> kernel_global_work_size;
my_kernel.getWorkGroupInfo<cl::array<size_t, 3>>(my_device, CL_KERNEL_GLOBAL_WORK_SIZE, &kernel_global_work_size);
我有opencl错误-30(无效的值(
my_kernel
不是内置的内核例如:cl::Kernel my_kernel = cl::Kernel(program, "my_kernel");
my_device
不是自定义设备。例如:cl::Device device = myDevices[0];
是的,当您的呼叫与签名匹配时:
https://github.khronos.org/opencl-clhpp/classcl_1_1_kernel.html
template <cl_int name> typename
detail::param_traits<detail::cl_kernel_work_group_info, name>::param_type getWorkGroupInfo(const Device& device, cl_int* err = NULL) const;
看起来CL_KERNEL_GLOBAL_WORK_SIZE
未声明通过宏生成的param_traits
。那将是标题中的错误。(op创建的github问题(
一些条目这里缺少条目这里。
另外,您可以使用返回错误代码的版本,以及通过输出参数的信息,该信息应涉及该问题:
template<typename T>
cl_int getWorkGroupInfo(const Device &device, cl_kernel_work_group_info name, T *param) const;
呼叫看起来像:
cl::array<size_t, 3> result;
kernel.getWorkGroupInfo<decltype(result)>(device, CL_KERNEL_GLOBAL_WORK_SIZE, result);
我对您的问题是:您自己尝试吗?结果是否与您的期望不符?
您是否得到了Cl_invalid_value?
[...]在设备给定的自定义设备或设备给出的OpenCL设备上的内置内核上。
给出的设备。如果设备不是自定义设备或内核不是内置的内核,则clgetkernelarginfo返回错误cl_invalid_value。
参见Opencl 1.2规格,第14和15页:
内置内核:内置内核是在OpenCL设备或自定义上执行的内核 通过固定功能硬件或固件中的设备。应用程序可以查询内置内核 由设备或自定义设备支持。程序对象只能包含写入的内核 Opencl C或内置内核,但并非两者兼而有之。另请参见内核和程序。
自定义设备:完全实现OpenCL运行时但没有的OPENCL设备 用OpenclC编写的支持程序。一种自定义设备可能是专业的非 - 可编程硬件非常有效且用于定向任务或 具有有限可编程功能的硬件,例如专业DSP。自定义设备是 不符合Opencl。自定义设备可以支持在线编译器。程序 可以使用OpenCL运行时API创建自定义设备,该API允许OpenCL程序 由源(如果支持在线编译器(和/或二进制文件或内置内核创建 由设备支持。另请参阅设备。
对于常规内核和设备,标准限制了工作组大小(设备属性(,而全局大小仅受使用的size_t
的范围约束。请参阅ClenqueuendrangeKernel。