我正在尝试在资源较少的嵌入式 GPU 上运行一些为桌面显卡编写的 OpenCL 内核。特别是,桌面版假定始终支持至少 256 个工作组大小,但基于 Mali T628 ARM 的 GPU 仅保证 64+ 个工作组大小。
事实上,一些内核报告CL_KERNEL_WORK_GROUP_SIZE
只有 64 个,我不知道为什么。我检查了CL_KERNEL_LOCAL_MEM_SIZE
有问题的内核,它是 <2 KiB,而CL_DEVICE_LOCAL_MEM_SIZE
是 32 KiB,所以我想我可以排除__local
存储。
还有哪些其他因素(例如,寄存器/__private
内存?)导致 low CL_KERNEL_WORK_GROUP_SIZE
,以及如何检查使用情况?我对编程内省(例如clGetKernelWorkGroupInfo()
我已经做过的一些)和任何我可能不知道的开发工具持开放态度。
编辑:
内核是 OpenCV 的 OpenCL v2.4 模块的一部分。特别icvCalcOrientation
是surf.cl
. 代码相当复杂,并且设置了几个编译时参数,这就是为什么手动分析内核的问题而没有一些提示的原因有点不可行。
如果有办法在 NVidia 或 AMD 硬件(我可以访问)上解决这个问题,我愿意接受。