如何使用OpenCL C 绑定来获得最大的全局工作大小



我想获得最大的全局工作大小。我不希望内核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。

最新更新