了解OpenCL报告的最大工作组限制及其对程序的影响方面,我几乎没有什么困难。
所以我的程序正在报告以下内容,
CL_DEVICE_MAX_WORK_ITEM_SIZES : 1024, 1024, 1024
CL_DEVICE_MAX_WORK_GROUP_SIZE : 256
CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS : 3
现在我正在编写程序以添加具有一百万个条目的向量。因此,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个工作组。
那么这东西如何工作?
我希望有人可以澄清我的困惑。我确定我了解错了。
提前感谢。
我有点难理解OpenCL报告的最大工作组限制及其对程序的影响。所以我的程序正在报告以下内容,CL_DEVICE_MAX_WORK_ITEM_SIZES:...
根据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
表示局部大小的限制(在OpenCL 1.2中CL_KERNEL_WORK_GROUP_SIZE
为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'