11

对于给定的内核,为什么 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

4

1 回答 1

9

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

让我们考虑几个例子;

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

B) 对 N 个数字求和。

为一个)

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

例如。

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

对于 B)

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

有一些警告;

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

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

于 2012-07-14T16:30:38.497 回答