OpenCL查询工作组大小与私有内存输出异常问题排查
问题分析与解决方案
首先可以确定:你的代码存在明显的参数错误,这才导致了完全不符合预期的输出结果。
1. 代码的核心问题
你调用clGetKernelWorkGroupInfo时,第二个参数传错了!
根据OpenCL规范,clGetKernelWorkGroupInfo的函数签名要求第二个参数是cl_device_id类型的设备对象,而不是设备对象的指针。你的代码里传的是&device(也就是cl_device_id*类型),这完全不符合参数类型要求。
函数内部会把这个指针值当成合法的cl_device_id去处理,导致访问了错误的内存区域,最终返回的就是随机的垃圾数据——这就是你看到那些离谱数值的原因。
修正后的代码
把第二个参数的&device改成device即可,同时建议加上返回值检查,方便提前排查错误:
size_t maxWorkGroupSize; cl_ulong private_mem_used; cl_int err; // 获取最大工作组大小 err = clGetKernelWorkGroupInfo(kernel, device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(maxWorkGroupSize), &maxWorkGroupSize, NULL); if (err != CL_SUCCESS) { printf("Failed to get work group size: error code %d\n", err); // 这里可以添加错误处理逻辑 } // 获取私有内存占用 err = clGetKernelWorkGroupInfo(kernel, device, CL_KERNEL_PRIVATE_MEM_SIZE, sizeof(private_mem_used), &private_mem_used, NULL); if (err != CL_SUCCESS) { printf("Failed to get private memory size: error code %d\n", err); // 这里可以添加错误处理逻辑 } printf("Max work-group size is %ld \n", maxWorkGroupSize); printf("Private memory used is %lld KB\n", private_mem_used/1024);
2. 关于结果解读的问题
你得到的输出绝对不可能是正确的。Adreno 530的最大工作组大小通常在256或512(符合OpenCL移动设备的常见规格),而私有内存占用量也不可能达到几十万亿KB的级别——这些数值纯粹是内存访问错误产生的垃圾数据,没有任何实际意义。
只要修正参数错误,你就能得到符合Adreno 530硬件规格的合理结果了。
内容的提问来源于stack exchange,提问作者Avis
相关产品推荐
相关产品推荐

