【问题标题】:Work Group Sizes工作组规模
【发布时间】:2012-07-13 01:10:34
【问题描述】:

对于给定的内核,为什么 work_groups 的大小总是相同的? 我在某处读到(对于我们未指定本地工作大小的情况),openCL 为内核创建了 3 个工作组(每个 217 个工作项),内核有 651 个工作项(可被 3 整除),同时它创建 653 个工作- 每组 1 个工作项,因为 653 是质数。

假设我们指定 local_work_size(即工作组中的工作项数),假设为 5。我们将工作项总数(global_work_size)设为 9。如何创建工作组?这就是为什么 global_work_size 必须是 local_work_size 的倍数?如果数据只需要 9 个工作项,如何将其增加到 10(local_work_size 的倍数,5)?

如果主机不知道有多少工作组将执行内核,为什么不能为结果数组分配内存?

请帮忙。 我读了这一切: http://www.openclblog.com/2011/09/work-group-sizes.html

【问题讨论】:

    标签: opencl workgroup


    【解决方案1】:

    OpenCL 工作组的大小不必总是相同。全局工作组的大小通常与问题的大小有关。本地工作组大小的选择基于最大化计算单元吞吐量和需要共享本地内存的线程数。

    让我们考虑几个例子;

    A) 将图像从 N x M 缩放到 X x Y。

    B) 对 N 个数字求和。

    对于 A)

    明显的全球工作组规模是 X ,Y, 1。为什么?这为每个输出像素提供 1 个线程。 应根据需要处理以生成输出像素的输入像素数来选择本地工作组大小。

    例如。

    A.1)将图像从 4K x 3.2K 缩放到 64 x 64。GWG Size [64,64,1] LWG Size 256 A.2)将图像从 4k x 3.2k 缩放到 800 x 600.GWG Size [800,60,1] LWG Size 256

    对于 B)

    明显的全球工作组规模是 N/2,1,1,为什么?因此,每个线程首先将 2 个值相加。本地工作组应设置为设备最大值。

    有一些注意事项;

    1) 全局工作组大小受全局内存大小和最大全局内存分配大小的限制。

    2) 每个设备的最大本地工作组大小通常为 256

    【讨论】:

    • 谢谢蒂姆!!感谢您的回答。 :) 那么,GWG 大小不一定是 LWG 大小的倍数??
    • 为了澄清是的,LWG 大小必须是多个或 null。来自手册页khronos.org/registry/cl/sdk/1.1/docs/man/xhtml
    • 由于GWG大小与问题大小有关(假设在模式匹配中,我将它取为(Length_of_text)-(Length_of_pattern))并且我将LWG大小作为Length_of_pattern(只有1个字)。但是如果GWG大小不是LWG的倍数,而且必须是倍数,我不能把LWG取为Length_of_pattern。那我应该如何在__Local中传递Pattern呢?
    • 您不能将数据作为 __local 传递。您可以将数据作为全局传入,并让一些线程将其复制到本地。如果 GWG 大小不是 LWG 大小的倍数,则将其设为下一个最高倍数并传入一个常数,即问题大小或线程数,例如。传入 N 作为常量 int 并测试 if ( N
    • 如果模式在内核执行期间是不可变的(不改变),您可以将其作为常量参数传递。通常它在 GPU 上更快。
    猜你喜欢
    • 2017-01-01
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    • 2017-11-17
    • 1970-01-01
    • 2018-10-23
    相关资源
    最近更新 更多