如何使用OpenCL C 绑定来获得最大的全局工作大小
How to get the maximum global work size with OpenCL C++ bindings?
我想获得最大的全局工作大小。我不希望内核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。
- 为什么在全局范围内使用"extern int a"似乎不行?
- QSqlquery prepare()和bindvalue()不工作
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 当vector是tje全局变量时,c++中vector的内存管理
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 导入库可以跨dll版本工作吗
- 如何创建一个空的全局类并在启动时实例化它
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 内联函数中具有内部链接的全局变量
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- 如何使用OpenCL C 绑定来获得最大的全局工作大小
- 全局变量增量在 C++ 中的工作原理
- C++条件运算符在全局函数中使用时无法正常工作
- 如何制作一个在模板类上工作的非模板全局函数