【发布时间】:2014-12-16 00:57:11
【问题描述】:
本地组大小对 OpenCL 意味着什么?如果工作组大小为1,是否意味着同时只有一个线程在运行?
我发现我们可以将cl_ndrange设置为NULL,让程序自动选择组大小,我们怎么知道选择了什么组大小?
【问题讨论】:
标签: opencl
本地组大小对 OpenCL 意味着什么?如果工作组大小为1,是否意味着同时只有一个线程在运行?
我发现我们可以将cl_ndrange设置为NULL,让程序自动选择组大小,我们怎么知道选择了什么组大小?
【问题讨论】:
标签: opencl
在opencl内核中,
get_local_size (0);
为 8x16 工作组大小的内核提供“8”,同时
get_local_size (1);
为相同的内核执行给出“16”。如果是 3D 内核,则“2”作为参数给出第三维的大小。查询维数(1,2,3 ?),
get_work_dim ();
被使用。
本地工作组大小给出每个硬件同步的线程数。对于 AMD gpus,其最大值为 256,而 Nvidia 和 cpus 可以达到 1024。当您将“1”作为此工作组大小时,每个同步计算单元仅获得单个线程(如果不受驱动程序或硬件的最小值限制)和实现了每个线程(也是每个波)的最大本地内存。
同时?整个执行被折叠到少数几个计算单元上,让多个下发执行,增加占用,特别是工作组规模小,本地内存足够。例如,如果 L=1 让 MAX_VALUE 波折叠到同一个计算单元上,L=64 只允许折叠 16 个波,L=256 只允许折叠 4 个波。是的,在同一时间但不在同一同步范围内。
一些供应商的一些模型可以做并发内核执行以完全占用管道,因此单个线程可能不是单独的,而是与来自另一个命令队列的另一个内核的另一个线程。
例如,即将推出的 r9 390x gpu 将有 64 个计算单元,每个计算单元可能有 4 个向量单元,每个向量单元有 16 个算术和 fpu 单元,总计 4096 个内核。 AMD 的计算单元总共有 64 个内核,一个内核由大约 4 个波流传输,因此每个计算单元有 256 个线程。但是这个线程系统可能与 CPU 上的不同,因此上下文切换可能更快,并且由于组切换,缓存争用最小化。
【讨论】: