本地组大小对OpenCL意味着什么?如果工作组大小为1,是否意味着只有一个线程同时运行?
我发现我们可以将NULL设置为cl_ndrange
让程序自动选择组大小,我们怎么知道选择了哪个组大小?
答案 0 :(得分:1)
在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上的不同,因此上下文切换可能更快,并且由于组切换,缓存争用最小。