【发布时间】:2015-01-20 09:33:48
【问题描述】:
我正在尝试在资源较少的嵌入式 GPU 上运行一些为桌面显卡编写的 OpenCL 内核。特别是,桌面版本假定始终支持至少 256 个工作组大小,但基于 Mali T628 ARM 的 GPU 仅保证 64+ 个工作组大小。
确实,一些内核报告CL_KERNEL_WORK_GROUP_SIZE 只有 64 个,我不知道为什么。我检查了CL_KERNEL_LOCAL_MEM_SIZE 的相关内核,它是CL_DEVICE_LOCAL_MEM_SIZE 是32 KiB,所以我想我可以排除__local 存储。
还有哪些其他因素(例如,寄存器/__private 内存?)导致 CL_KERNEL_WORK_GROUP_SIZE 低,以及如何检查使用情况?我对编程内省(例如我已经做过的clGetKernelWorkGroupInfo())和任何我可能不知道的开发工具持开放态度。
编辑:
内核是 OpenCV 的 OpenCL v2.4 模块的一部分。特别是surf.cl 中的内核icvCalcOrientation。代码相当复杂,并且设置了几个编译时参数,这就是为什么手动分析内核的问题而没有一些提示的原因有点不可行。
如果有办法在 NVidia 或 AMD 硬件(我可以访问)上解决此问题,我愿意接受。
【问题讨论】:
-
您的内核是使用动态本地内存还是“静态”(自动)本地内存,例如
local float[64]? -
也看看here
-
@Baizz 静态本地内存。我在发布之前看到了这个问题,但我看不出他们中的任何一个如何帮助弄清楚为什么工作组的规模是有限的。