了解 CL_DEVICE_MAX_WORK_GROUP_SIZE 限制 OpenCL?
Understanding CL_DEVICE_MAX_WORK_GROUP_SIZE limit OpenCL?
我有点难以理解 OpenCL 报告的最大工作组限制及其对程序的影响。
所以我的程序正在报告以下内容,
CL_DEVICE_MAX_WORK_ITEM_SIZES : 1024, 1024, 1024
CL_DEVICE_MAX_WORK_GROUP_SIZE : 256
CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS : 3
现在我正在编写程序来添加具有 100 万个条目的向量。
所以NDRange的globalSize和localSize的计算如下
int localSize = 64;
// Number of total work items - localSize must be devisor
globalSize = ceil(n/(float)localSize)*localSize;
.......
// Execute the kernel over the entire range of the data set
err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &globalSize, &localSize,
0, NULL, NULL);
这里根据我的理解,OpenCL 间接计算了它将启动的工作组的数量。
对于上面的例子
globalSize = 15625 * 64 -> 1,000,000 -> So this is total number of threads that will be launched
localSize = 64 -> So each work group will have 64 work items
因此从上面我们得到
Total Work Groups Launched = globalSize/ localSize -> 15625 Work Groups
我的困惑从这里开始,
如果您看到 OpenCL 报告的值 CL_DEVICE_MAX_WORK_GROUP_SIZE:256 所以,我在想这意味着我的设备最多可以在一个维度上启动 256 个工作组,
但上面的计算表明我启动了 15625 个工作组。
那么这个东西是如何工作的?
我希望有人能澄清我的困惑。
我确定我理解错了。
提前致谢。
根据clEnqueueNDRangeKernel
的规范:https://www.khronos.org/registry/OpenCL/sdk/2.2/docs/man/html/clEnqueueNDRangeKernel.html,
CL_DEVICE_MAX_WORK_ITEM_SIZES
和 CL_DEVICE_MAX_WORK_GROUP_SIZE
表示局部大小的限制(CL_KERNEL_WORK_GROUP_SIZE
在 OpenCL 1.2 中是 CL_DEVICE_MAX_WORK_GROUP_SIZE
)。
const int dimension = n;
const int localSizeDim[n] = { ... }; // Each element must be less than or equal to 'CL_DEVICE_MAX_WORK_ITEM_SIZES[i]'
const int localSize = localSizeDim[0] * localSizeDim[1] * ... * localSizeDim[n-1]; // The size must be less than or equal to 'CL_DEVICE_MAX_WORK_GROUP_SIZ'
我找不到全局工作项的设备限制,但是 size t
表示的最大值是错误描述中的全局工作项限制 CL_INVALID_GLOBAL_WORK_SIZE
.
我有点难以理解 OpenCL 报告的最大工作组限制及其对程序的影响。
所以我的程序正在报告以下内容,
CL_DEVICE_MAX_WORK_ITEM_SIZES : 1024, 1024, 1024
CL_DEVICE_MAX_WORK_GROUP_SIZE : 256
CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS : 3
现在我正在编写程序来添加具有 100 万个条目的向量。 所以NDRange的globalSize和localSize的计算如下
int localSize = 64;
// Number of total work items - localSize must be devisor
globalSize = ceil(n/(float)localSize)*localSize;
.......
// Execute the kernel over the entire range of the data set
err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &globalSize, &localSize,
0, NULL, NULL);
这里根据我的理解,OpenCL 间接计算了它将启动的工作组的数量。 对于上面的例子
globalSize = 15625 * 64 -> 1,000,000 -> So this is total number of threads that will be launched
localSize = 64 -> So each work group will have 64 work items
因此从上面我们得到
Total Work Groups Launched = globalSize/ localSize -> 15625 Work Groups
我的困惑从这里开始, 如果您看到 OpenCL 报告的值 CL_DEVICE_MAX_WORK_GROUP_SIZE:256 所以,我在想这意味着我的设备最多可以在一个维度上启动 256 个工作组,
但上面的计算表明我启动了 15625 个工作组。
那么这个东西是如何工作的?
我希望有人能澄清我的困惑。 我确定我理解错了。
提前致谢。
根据clEnqueueNDRangeKernel
的规范:https://www.khronos.org/registry/OpenCL/sdk/2.2/docs/man/html/clEnqueueNDRangeKernel.html,
CL_DEVICE_MAX_WORK_ITEM_SIZES
和 CL_DEVICE_MAX_WORK_GROUP_SIZE
表示局部大小的限制(CL_KERNEL_WORK_GROUP_SIZE
在 OpenCL 1.2 中是 CL_DEVICE_MAX_WORK_GROUP_SIZE
)。
const int dimension = n;
const int localSizeDim[n] = { ... }; // Each element must be less than or equal to 'CL_DEVICE_MAX_WORK_ITEM_SIZES[i]'
const int localSize = localSizeDim[0] * localSizeDim[1] * ... * localSizeDim[n-1]; // The size must be less than or equal to 'CL_DEVICE_MAX_WORK_GROUP_SIZ'
我找不到全局工作项的设备限制,但是 size t
表示的最大值是错误描述中的全局工作项限制 CL_INVALID_GLOBAL_WORK_SIZE
.