有没有办法知道多少个工作组需要共享同一内存池,如果它们在同一个计算单元上共存?
不能一步到位,但可以计算。首先,您需要知道一个工作组需要多少本地内存。为此,您可以使用clGetKernelWorkGroupInfo和标志CL_KERNEL_LOCAL_MEM_SIZE(严格来说,这是一个内核所需的本地内存)。由于您知道每个计算单元中有多少本地内存,因此您可以知道最多可以在一个计算单元上共存的工作组数。
实际上,这并不简单。您必须考虑其他参数,例如可以驻留在一个计算单元上的最大线程数。
这是一个占用率问题(您应该尝试将其最大化)。不幸的是,占用率将取决于底层架构。
AMD发布了一篇关于如何计算不同架构的占用率的文章这里。
NVIDIA提供了一个xls sheet,可以计算不同架构的占用率。
并非所有计算所需的信息都可以通过OCL查询(如果我没记错的话),但是您可以在应用程序中存储有关不同架构的信息。
我曾认为确保我的工作组内存使用量低于总本地内存大小的四分之一是个好主意。这太保守了吗?
这相当严格,而使用clGetKernelWorkGroupInfo,您无需这样做。但是需要考虑到CL_KERNEL_LOCAL_MEM_SIZE的某些内容:
如果未指定任何带有__local地址限定符的内核指针参数的本地内存大小,则其大小被假定为0。
由于您可能需要动态计算每个工作组所需的本地内存大小,因此这里有一个解决方法,基于内核是即时编译的事实。
您可以在内核文件中定义一个常量,然后使用 -D 选项在调用 clBuildProgram 时设置其值(先前计算)。
我想知道整个本地内存大小是否可供用户分配给本地内存,或者是否存在其他系统开销使其较少?
同样,CL_KERNEL_LOCAL_MEM_SIZE 是答案。标准规定:
这包括实现可能需要的本地内存,以执行内核...