OpenCL - 检索可能的工作项数量?

时间:2011-08-31 21:27:55

标签: opencl

我正在使用一个非常基本的内核编写一个简单的OpenCL应用程序。我只有一个工作组,我试图改变工作项的数量。我注意到当我只使用CPU时,我可以拥有任意数量的工作项。但是,当我只使用GPU时,似乎我只能拥有512,1024,2048 ......工作项。 256将产生错误,任何数字都不会产生错误。

我是通过实验找到的,但是如何以编程方式找到这些信息,大概来自OpenCL C ++ API?

2 个答案:

答案 0 :(得分:4)

工作组大小存在设备限制,对于给定内核,取决于其资源使用情况。您可以使用CL_DEVICE_MAX_WORK_GROUP_SIZE查询具有clGetDeviceInfo()的设备的最大可能工作组大小。对于内核,您可以使用CL_KERNEL_WORK_GROUP_SIZE通过clGetKernelWorkGroupInfo()获得最大工作组大小。

对于较小的尺寸,在GPU上,工作组大小必须是波前/扭曲大小的倍数。这在Nvidia上是32,对于大多数AMD GPU是64(但对于一些是32)。您可以使用Nvidia的cl_nv_device_attribute_query(它为clGetDeviceInfo()提供选项CL_DEVICE_WARP_SIZE_NV)来查询warp大小,但是没有好办法在AMD上获取它。我只是假设它是64岁。

此外,全局工作大小必须能够被每个维度中的工作组大小整除。通常最好将全局大小四舍五入到工作组大小的某个倍数,然后避免在内核中使用超出范围的工作项。

答案 1 :(得分:1)

波前/扭曲大小是内核参数而不是设备参数(尽管它实际上是硬件强加的),因此您可以使用clGetKernelWorkGroupInfo() CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE来查询波前/扭曲大小。
请参阅以下文档:http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetKernelWorkGroupInfo.html

注意:在OpenCL 1.1中引入了CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE