Opencl 工作组规模

Opencl 工作组规模,opencl,workgroup,Opencl,Workgroup,对于给定的内核,为什么工作组的大小总是相同的? 我在某个地方读到(对于我们不指定本地工作大小的情况),openCL为内核创建了3个工作组(每个工作组217个工作项),其中包含651个工作项(可被3整除),而它创建了653个工作组,每个工作组包含1个工作项,因为653是一个素数 假设我们指定本地工作大小(即工作组中工作项的数量),比如5。我们给出了总工作项(全局工作大小)为9。如何创建工作组?这就是为什么全球工作规模必须是本地工作规模的倍数?如果数据只需要9个工作项,如何将其增加到10个(本地工作

对于给定的内核,为什么工作组的大小总是相同的? 我在某个地方读到(对于我们不指定本地工作大小的情况),openCL为内核创建了3个工作组(每个工作组217个工作项),其中包含651个工作项(可被3整除),而它创建了653个工作组,每个工作组包含1个工作项,因为653是一个素数

假设我们指定本地工作大小(即工作组中工作项的数量),比如5。我们给出了总工作项(全局工作大小)为9。如何创建工作组?这就是为什么全球工作规模必须是本地工作规模的倍数?如果数据只需要9个工作项,如何将其增加到10个(本地工作大小的倍数,5)

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

请帮忙。 我在这本书上读到了这一切:
OpenCL工作组的大小不必总是相同的。全局工作组规模通常与问题规模相关。本地工作组大小的选择基于最大化计算单元吞吐量和需要共享本地内存的线程数

让我们考虑几个例子; A) 将图像从N×M缩放到X×Y

B) 求N个数的和

(A)

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

例如

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

(B)

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

有一些警告

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


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

谢谢Tim!!谢谢你的回答。:)因此,GWG大小不必是LWG大小的倍数??为了澄清是,LWG大小必须是mukltiple或null。由于GWG大小与问题大小相关(假设在模式匹配中,我取它(文本的长度)-(模式的长度)),我取LWG大小作为模式的长度(仅1个单词)。但是如果GWG大小不是LWG的倍数,并且它必须是倍数,那么我不能将LWG作为模式的长度。那么我应该如何在本地传递模式?不能作为本地传递数据。您可以将数据作为全局数据传入,并让一些线程将其复制到本地。如果GWG大小不是LWG大小的倍数,则将其设为下一个最高倍数,并传入一个常量,即问题大小或线程数,例如,传入N作为常量int,并测试If(N