【问题标题】:OpenCL - retrieving possible work item quantities?OpenCL - 检索可能的工作项数量?
【发布时间】:2012-06-12 17:21:53
【问题描述】:

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

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

【问题讨论】:

    标签: opencl


    【解决方案1】:

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

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

    此外,全局工作大小必须能被每个维度中的工作组大小整除。通常最好将全局大小四舍五入为工作组大小的倍数,然后避免内核中的工作项越界。

    【讨论】:

    • 感谢您的回复!太糟糕了,没有独立于设备的函数来获取扭曲大小。
    • @AdamS 其实这个是可以查询的。使用clGetKernelWorkGroupInfo()
    【解决方案2】:

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

    注意:CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE 是在 OpenCL 1.1 中引入的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-23
      • 2018-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多