我是OpenCL的新手,我试图理解Apple here编写的这个示例程序。
该程序的目标是计算输入数组的每个元素的平方并将结果写入新数组。
您可以看到输入数组的维度为: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);
答案 0 :(得分:1)
如果将1设置为本地工作组大小,那么您的全局工作大小将以本地工作大小(理论上)执行,那么它将在每个本地工作组中仅执行1个线程。在GPU上,工作组与计算单元匹配 - 如果工作组大小为1,则1个线程可能占用整个计算单元。这真的非常非常缓慢