根据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
输出似乎不正确。
答案 0 :(得分:0)
您的值错误问题似乎已在用户@pmdj的注释中得到解决。
我在这里指的是为什么您似乎总是获得参数名称CL_KERNEL_PRIVATE_MEM_SIZE返回的值0。
问题是,在不同平台上,参数名称CL_KERNEL_PRIVATE_MEM_SIZE返回的值有所不同。
在某些情况下,它们返回使用的数量或专用内存-因此将所有变量存储在寄存器中所需的字节数。请注意,编译器会进行优化,因此不必等于变量大小的总和。
在其他平台上,它返回溢出的数量或私有内存。因此,如果使用过多的变量并且超出了寄存器的大小,则编译器必须将内存溢出到高速缓存或全局内存中。更改内核时,可以监视此值。如果开始溢出,您的内核可能会变慢-通常会变慢。溢出量可以字节为单位报告,也可以以寄存器数量报告-可以是32位字的数量。