当前位置: 代码迷 >> 综合 >> CL_?KERNEL_?WORK_?GROUP_?SIZE与CL_?DEVICE_?MAX_?WORK_?GROUP_?SIZE的区别
  详细解决方案

CL_?KERNEL_?WORK_?GROUP_?SIZE与CL_?DEVICE_?MAX_?WORK_?GROUP_?SIZE的区别

热度:61   发布时间:2023-12-22 11:14:15.0

CL_?KERNEL_?WORK_?GROUP_?SIZE与CL_?DEVICE_?MAX_?WORK_?GROUP_?SIZE的区别

最近调试代码发现一个问题:
就是我通过clGetDeviceInfo函数获取了max group size(1024) 作为我NDRange 的local size,很多用例和项目都是这样写的,我个人觉得也没有什么问题。
后来在一个新的平台上去调试同一个代码,产生了CL_INVALID_WORK_GROUP_SIZE的错误。

有点懵为什么会有这个问题,CL_?DEVICE_?MAX_?WORK_?GROUP_?SIZE= 1024 也是没有问题的,为什么会有非法的参数.
然后去看官方的手册,发现了一个函数clGetKernelWorkGroupInfo尝试用该函数去获取工组组的大小发现CL_?KERNEL_?WORK_?GROUP_?SIZE = 128
在我的理解里,他俩应该是同一个概念,为什么在同一个设备里获取同一个属性为什么会有不同的结果。

看了一下官方的解释:
clGetDeviceInfo()
Get information about an OpenCL device。获取OpenCL 设备信息。

clGetKernelWorkGroupInfo()
Returns information about the kernel object that may be specific to a device.
返回有关特定于某个设备的内核对象的信息。
参数:CL_?KERNEL_?WORK_?GROUP_?SIZE
用于查询可用于在设备给定的特定设备上执行内核的最大工作组大小。OpenCL实现使用内核的资源需求(注册使用等)来决定这个工作组的大小。
因此,与CL_ DEVICE_ MAX_ WORK_ GROUP_ SIZE不同,这个值可能会因内核和设备的不同而不同。对于给定的内核对象,CL_ KERNEL_ WORK_ GROUP_ SIZE将小于或等于CL_ DEVICE_ MAX_ WORK_ GROUP_ SIZE

所以,在用于获取工作组大小最好调用clGetKernelWorkGroupInfo

可以参考以下博文:也不知道哪里copy的全英文,说的比较详细:
https://blog.csdn.net/Kingbaiyulong/article/details/44310229?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7Edefault-1.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7Edefault-1.no_search_link

  相关解决方案