Opencl 为什么全局内存分配在GPU中的大小超过限制时成功?

Opencl 为什么全局内存分配在GPU中的大小超过限制时成功?,opencl,gpu,gpgpu,imx6,Opencl,Gpu,Gpgpu,Imx6,我正在试验Vivante GPU GC2000系列,clinfo在其中产生了以下结果 CL_DEVICE_GLOBAL_MEM_SIZE: 64 MByte CL_DEVICE_MAX_MEM_ALLOC_SIZE: 32 MByte CL_DEVICE_GLOBAL_MEM_CACHE_TYPE: Read/Write CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE: 64 CL_DEVICE_

我正在试验Vivante GPU GC2000系列,clinfo在其中产生了以下结果

 CL_DEVICE_GLOBAL_MEM_SIZE:             64 MByte
 CL_DEVICE_MAX_MEM_ALLOC_SIZE:          32 MByte
 CL_DEVICE_GLOBAL_MEM_CACHE_TYPE:       Read/Write
 CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE:       64
 CL_DEVICE_GLOBAL_MEM_CACHE_SIZE:       4096
 CL_DEVICE_LOCAL_MEM_SIZE:          1 KByte
 CL_DEVICE_LOCAL_MEM_TYPE:          Global
 CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE:        4 KByte
 CL_DEVICE_MAX_CONSTANT_ARGS:           9
从上面的输出可以看出,64MB是全局内存分配的限制

现在,当我尝试分配900Mbytes全局大小时,我没有收到任何错误,它是成功的

int noOfBytes = (900 * 1024 * 1024);
memPtr = clCreateBuffer(context, CL_MEM_READ_WRITE, noOfBytes, NULL, &err);
 if ( err != CL_SUCESS) {
    printf ("Ooops.. Failed");
  }

听起来这个实验证明了clinfo的说法。我是否遗漏了任何理论或其他东西?

因为缓冲区和图像是在OpenCL上下文(而不是OpenCL设备)上分配的,所以实际的设备分配通常会推迟到缓冲区在特定设备上使用之后。因此,虽然这种分配似乎有效,但如果您尝试在设备上实际使用该缓冲区,您将得到一个错误