OpenCL - 了解CL_KERNEL_WORK_GROUP_SIZE和CL_KERNEL_PRIVATE_MEM_SIZE的输出

时间:2018-05-31 01:59:29

标签: opencl

根据clGetKernelWorkGroupInfo文档(来自here),我试图查询工作组的大小和范围。我的内核使用的私有内存大小。使用adreno 530 GPU在Android设备上测试以下代码段。

(来自Apple OpenCL tutorial的代码示例)

size_t maxWorkGroupSize;
cl_ulong private_mem_used;
clGetKernelWorkGroupInfo(kernel, &device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(maxWorkGroupSize), &maxWorkGroupSize, NULL );
clGetKernelWorkGroupInfo(kernel, &device, CL_KERNEL_PRIVATE_MEM_SIZE, sizeof(private_mem_used), &private_mem_used, NULL );

printf("Max work-group size is %ld \n", maxWorkGroupSize);
printf("Private memory used is %lld KB\n", private_mem_used/1024);

输出:

Max work-group size is 42773336 
Private memory used is 179412930700111 KB

输出似乎不正确。

  1. 如果输出不正确,那么代码段中是否有任何错误?
  2. 如果输出正确,如果您可以帮助解释输出
  3. 将会很有帮助

1 个答案:

答案 0 :(得分:0)

您的值错误问题似乎已在用户@pmdj的注释中得到解决。

我在这里指的是为什么您似乎总是获得参数名称CL_KERNEL_PRIVATE_MEM_SIZE返回的值0。

问题是,在不同平台上,参数名称CL_KERNEL_PRIVATE_MEM_SIZE返回的值有所不同。

在某些情况下,它们返回使用的数量或专用内存-因此将所有变量存储在寄存器中所需的字节数。请注意,编译器会进行优化,因此不必等于变量大小的总和。

在其他平台上,它返回溢出的数量或私有内存。因此,如果使用过多的变量并且超出了寄存器的大小,则编译器必须将内存溢出到高速缓存或全局内存中。更改内核时,可以监视此值。如果开始溢出,您的内核可能会变慢-通常会变慢。溢出量可以字节为单位报告,也可以以寄存器数量报告-可以是32位字的数量。