【发布时间】:2016-01-15 19:34:33
【问题描述】:
我是 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);
【问题讨论】:
-
这不是 CUDA,大小不是本地*全局的,只是全局的。全局大小很重要,内核代码运行了那么多次。本地大小仅在您想要共享有关正在运行的项目的信息并且必须划分全局大小时才有用。例如在项目 0-1023 之间共享一些数据。如果您根本不共享数据,那么大小并不是很重要,但由于开销减少和设备占用增加,因此首选更大的大小。
-
@DarkZeros 好的,我明白了,在这种情况下,全局大小很重要,所以 clEnqueueNDRangeKernel 调用中的 local_work_size 可以是 1 或 NULL,实际上什么都不会改变,对吧?
-
是的,就是这样。这就是为什么 OpenCL 允许本地大小为 NULL 的原因,因此驱动程序会选择它认为最适合性能的大小。