Parallel processing 了解CL\U设备\U最大工作\U组\U大小限制OpenCL?

Parallel processing 了解CL\U设备\U最大工作\U组\U大小限制OpenCL?,parallel-processing,gpu,opencl,gpgpu,Parallel Processing,Gpu,Opencl,Gpgpu,我很难理解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 lo

我很难理解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_设备报告的值MAX_WORK_GROUP_SIZE:256,那么我认为这意味着MAX my DEVICE可以在一个维度中启动256个工作组

但上面的计算表明,我正在启动15625个工作组

这东西是怎么工作的

我希望有人能澄清我的困惑。 我肯定我理解错了什么


提前感谢。

根据
clEnqueueNDRangeKernel
的规范:,
CL\u设备\最大工作\项目\大小和
CL\u设备\最大工作\组\大小
指示本地大小的限制(
CL_​内核_​工作_​团体_​大小
是OpenCL 1.2中的
CL\u设备\最大工作\组\大小


我找不到全局工作项的设备限制,但可由
size t
表示的最大值是错误
CL描述中全局工作项的限制_​无效的_​全球的_​工作_​大小

根据
ClenqueEndRangeKernel
的规范:,
CL\u设备\最大工作\项目\大小和
CL\u设备\最大工作\组\大小
指示本地大小的限制(
CL_​内核_​工作_​团体_​大小
是OpenCL 1.2中的
CL\u设备\最大工作\组\大小


我找不到全局工作项的设备限制,但可由
size t
表示的最大值是错误
CL描述中全局工作项的限制_​无效的_​全球的_​工作_​大小

,所以看起来工作组总数没有限制。但总工作项的数量是65535(大小限制),这些常数基本上反映了本地大小,即每个工作组的工作项数量是256。感谢您的澄清。看起来工作组的总数没有限制。但总工作项的数量是65535(大小限制),这些常数基本上反映了本地大小,即每个工作组的工作项数量是256。谢谢你的澄清。
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'