确定OpenCL工作组大小的限制因素?

时间:2014-11-22 06:55:16

标签: opencl mali

我正在尝试在嵌入式GPU上运行一些为桌面显卡编写的OpenCL内核,资源更少。特别是,桌面版本假定始终支持工作组大小至少为256,但基于ARM的Mali T628 GPU仅保证64个工作组大小。

实际上,有些内核报告的CL_KERNEL_WORK_GROUP_SIZE只有64个,我无法弄清楚原因。我检查了CL_KERNEL_LOCAL_MEM_SIZE有问题的内核,它是< 2 KiB,而CL_DEVICE_LOCAL_MEM_SIZE是32 KiB,所以我想我可以排除__local存储。

还有哪些其他因素(例如,寄存器/ __private内存?)会导致低CL_KERNEL_WORK_GROUP_SIZE,如何检查使用情况?我对程序性内省(例如我已经做过的clGetKernelWorkGroupInfo())以及我可能不了解的任何开发工具持开放态度。

编辑:

内核是OpenCV的OpenCL v2.4模块的一部分。特别是surf.cl中的内核icvCalcOrientation。代码相当复杂,并且有几个编译时参数设置,所以这就是为什么在没有一些提示的情况下手动分析内核以解决问题有点不可行。

如果有办法在NVidia或AMD硬件(我有权访问)上对此进行故障排除,我愿意接受。

2 个答案:

答案 0 :(得分:3)

修改

由于我之前的回答显然是错误的,我需要更多关于这个问题的信息。

通过说"一些内核报告CL_KERNEL_WORK_GROUP_SIZE只有64"您暗示存在可用较大工作组大小的内核。是这样的吗?如果没有,那么答案不幸的是该设备根本无法支持超过64个工作项。

您可以在设置所有内核agruments之后和执行内核之前查询内核中设备的所有可用信息。参数(主要来自(Source))要查询的参数是

  • CL_DEVICE_GLOBAL_MEM_SIZE
  • CL_DEVICE_LOCAL_MEM_SIZE
  • CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE
  • CL_DEVICE_MAX_MEM_ALLOC_SIZE
  • CL_DEVICE_MAX_WORK_GROUP_SIZE
  • CL_DEVICE_MAX_WORK_ITEM_SIZES
  • CL_KERNEL_WORK_GROUP_SIZE
  • CL_KERNEL_LOCAL_MEM_SIZE
  • CL_KERNEL_PRIVATE_MEM_SIZE 可能会有更多,但目前没有想到。

一般信息:

可以限制工作组大小,因为本地内存有限。如果你有一个使用大量私有内存的内核(“批次”是一个相对术语 - 在较弱的硬件上,即使看似很少的变量,也可以达到这个限制)。 "然而,这个限制恰好在理想条件下。如果你的内核每WG使用大量的WI,那么一些私有WI数据可能会泄漏到本地内存中。 [...]" (Source)。

所以有些私有内存可能会被交换到本地内存,而你却没有意识到这一点,因此所使用的本地内存的累积大小和交换专用内存所需的内存大于可用的本地内存大小。

CL_DEVICE_LOCAL_MEM_SIZE返回本地内存的可用大小,CL_KERNEL_LOCAL_MEM_SIZE告诉您已使用了多少本地内存。显然,这也通过查看clSetKernelArg来考虑动态本地内存,但是我不确定如果查询CL_KERNEL_LOCAL_MEM_SIZE before设置内核参数(这是你想要做的是为了确定本地记忆的大小......)

无论如何,OpenCL确切地知道你使用了多少本地内存,因此它可以计算它可以支持多少个工作项(每个工作项都有可能需要交换到本地内存的私有内存)。查询CL_KERNEL_WORK_GROUP_SIZE时,可能会减少本地工作量。

在查看您发布的内核后,我不认为本地存储器存在问题(这是您已经怀疑的),特别是因为您只使用了32 KiB的本地内存中的2个。

答案 1 :(得分:0)

  

还有哪些其他因素(例如寄存器/ __私有内存?)会导致低电平   CL_KERNEL_WORK_GROUP_SIZE,如何查看使用情况?

在Mali上,计算工作负载使用的所有内存都是全局的(即支持我的系统RAM),因此除了通过辅助效果(例如缓存抖动)之外,内存压力不应该导致任何问题。我怀疑寄存器分配限制可能会在这里发挥作用 - 更大的工作组意味着更多并发线程在着色器核心中活动,这意味着寄存器文件的压力更大 - 尽管我不确定。

OpenGL ES的Mali离线编译器报告工作寄存器的使用情况 - 例如,它可以报告此类信息:

./malisc -c Mali-T760 -r r1p0 -d Mali-T600_r5p0-00rel0 --fragment -V test.frag 
ARM Mali Offline Compiler v4.5.0
(C) Copyright 2007-2014 ARM Limited.
All rights reserved.


1 work registers used, 0 uniform registers used, spilling not used.

        A   L/S T   Total   Bound
Cycles:     2   0   0   2   A
Shortest Path:  1   0   0   1   A
Longest Path:   1   0   0   1   A

Note: The cycles counts do not include possible stalls due to cache misses.

我不确定ARM是否有可以报告类似信息的OpenCL离线编译器 - 可能值得在ARM Connected Community网站上查询。