我是OpenCL的新手,我试图了解由Apple编写的示例程序here。计算适当数量的工作组及其大小OpenCL
该程序的目标是计算输入数组的每个元素的平方,并将结果写入新数组。
您可以看到输入数组的维数为1024.工作组的数量为1024,每个组的大小为最大值CL_KERNEL_WORK_GROUP_SIZE。
任何人都可以解释我如果在内核中没有get_local_id()调用,在每个工作组中使用如此多的工作项目有什么意义?他们可以使用1作为每个工作组的大小吗?会有什么区别?
谢谢。
一些代码来证明这一点:
// Get the maximum work group size for executing the kernel on the device
//
err = clGetKernelWorkGroupInfo(kernel, device_id, CL_KERNEL_WORK_GROUP_SIZE, sizeof(local), &local, NULL);
// Execute the kernel over the entire range of our 1d input data set
// using the maximum number of work group items for this device
//
global = count;
err = clEnqueueNDRangeKernel(commands, kernel, 1, NULL, &global, &local, 0, NULL, NULL);
这不是CUDA,尺寸不是本地*全球,只是全球。全局大小是重要的,内核代码运行那么多次。只有当您想分享运行项目的信息并且必须划分全局大小时,本地大小才有用。例如,在项目0-1023之间共享一些数据。如果您根本不共享数据,那么大小并不重要,但由于开销减少和设备占用率增加,因此较大的大小是首选。 – DarkZeros
@DarkZeros好吧,我知道了,在这种情况下全局大小很重要,所以clEnqueueNDRangeKernel调用中的local_work_size可以是1或NULL,实际上什么都不会改变,对吧? – Matt
是的,它。这就是OpenCL允许本地大小为NULL的原因,因此驱动程序会选择它认为最适合性能的大小。 – DarkZeros