为OpenCL内核额外分配32字节的本地内存

为OpenCL内核额外分配32字节的本地内存,opencl,gpgpu,gpu,Opencl,Gpgpu,Gpu,我想弄清楚为什么我正在尝试运行的OpenCL内核会收到以下错误: Context error: [CL_OUT_OF_RESOURCES] : OpenCL Error : clEnqueueNDRangeKernel failed: local memory usage (16416 bytes) is more than available on the device (16384 bytes) 内核定义为: __kernel void kernelFun(__read_only imag

我想弄清楚为什么我正在尝试运行的OpenCL内核会收到以下错误:

Context error: [CL_OUT_OF_RESOURCES] :
OpenCL Error : clEnqueueNDRangeKernel failed: local memory usage (16416 bytes) is more than available on the device (16384 bytes)
内核定义为:

__kernel void kernelFun(__read_only image2d_t src,
                        __global __write_only uchar8 *dst,
                        __global uchar4 *endpointBuffer,
                        __local uchar4 *pixelBuffer)
{
  ...
}
我正在使用标准的
clSetKernelArg
例程分配本地内存:

clSetKernelArg(gKernel, 3, kPixelBufferBytes, NULL);
其中
kPixelBufferBytes
等于16384


我的问题是,这些额外的32字节从哪里来?

一些OpenCL实现已知使用与本地内存相同的物理内存存储内核参数。您有32个字节的内核参数,这可以解释这种差异的来源


例如,NVIDIA GPU肯定用于执行此操作(参见第25页,共页)。

这意味着指针每个都是8字节?这可能是因为我使用的是64位操作系统吗?@Mokosha是的,我假设是64位硬件。您可以使用
CL\u device\u ADDRESS\u bits
参数调用
clGetDeviceInfo
来检查OpenCL设备是32位还是64位。
CL\u device\u ADDRESS\u bits
的返回值为我的两个OpenCL设备(GPU)提供32位。但是,我在64位机器上运行。这是一个bug吗?GPU或驱动程序可能只支持32位寻址,因此不一定是bug。您还可以编写一个简单的测试内核,运行
sizeof(image2d\u t)
sizeof(global uchar4*)
,以了解这些参数有多大。也可能是内核参数在您的设备上是8字节对齐的。顺便说一句,
\uuu write\u only
\uuu read\u only
属性仅用于图像对象,对缓冲区没有任何意义。奇怪的是,实现没有为此抛出错误或警告。在主机上创建缓冲区时,可以为缓冲区指定只读/只读信息。