计算正确的工作组数量及其大小 OpenCL
Calculating the right number of workgroups and their size OpenCL
我是 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);
您的全局工作大小按本地工作大小的块执行(理论上),如果您将本地工作组大小设置为 1,那么它将在每个本地工作组中仅执行 1 个线程。在 GPU 上,工作组与计算单元相匹配——如果工作组大小为 1,则 1 线程可能会占用整个计算单元。这真的非常非常慢
我是 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);
您的全局工作大小按本地工作大小的块执行(理论上),如果您将本地工作组大小设置为 1,那么它将在每个本地工作组中仅执行 1 个线程。在 GPU 上,工作组与计算单元相匹配——如果工作组大小为 1,则 1 线程可能会占用整个计算单元。这真的非常非常慢