2009-11-06 308 views
4

我在GPU上分配一个cl_mem缓冲区并对其进行处理,直到超过特定的大小才能正常工作。在这种情况下,分配本身成功,但执行或复制不成功。我想使用设备的内存更快的操作,所以我分配像:为什么我会收到CL_MEM_OBJECT_ALLOCATION_FAILURE?

buf = clCreateBuffer (cxGPUContext, CL_MEM_WRITE_ONLY, buf_size, NULL, &ciErrNum); 

现在我不明白的是大小的限制。我正在复制大约16 Mbyte,但应该能够使用大约128 MB(请参阅CL_DEVICE_MAX_MEM_ALLOC_SIZE)。

为什么这些数字差异如此之大?


下面是一些摘自oclDeviceQuery:在设备上

CL_PLATFORM_NAME: NVIDIA 
CL_PLATFORM_VERSION: OpenCL 1.0 
OpenCL SDK Version: 4788711 

    CL_DEVICE_NAME:   GeForce 8600 GTS 
    CL_DEVICE_TYPE:   CL_DEVICE_TYPE_GPU 
    CL_DEVICE_ADDRESS_BITS:    32 
    CL_DEVICE_MAX_MEM_ALLOC_SIZE: 128 MByte 
    CL_DEVICE_GLOBAL_MEM_SIZE:  255 MByte 
    CL_DEVICE_LOCAL_MEM_TYPE:  local 
    CL_DEVICE_LOCAL_MEM_SIZE:  16 KByte 
    CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE: 64 KByte 
+0

这是一个未解决和棘手的话题。不幸的是我一直在使用的硬件发生了变化,所以我不知道如何重现这个问题。 – count0 2011-05-04 17:19:20

+0

我现在在GeForce 8800 GTS上遇到了同样的问题。在每一次运行中,我都会得到不同的尺寸来获得错误,但它的典型范围是7mb到20mb。最大内存分配大小也是128 MB。 – 2012-06-19 22:14:47

回答

3

clCreateBuffer也不会真正创造一个缓冲区。这是有道理的,因为在创建时驱动程序不知道哪个设备将使用缓冲区(回想一个上下文可以有多个设备)。当您写入写入或启动将缓冲区作为参数的内核时,将在实际设备上创建缓冲区。

至于16MB的限制,你使用最新的驱动程序(195.xx)?如果是这样,您应该通过forums或直接联系NVIDIA。

+0

我不能再现这一点,但你提到的是有道理的。这有点尴尬,但是如果你来自c/C++的背景,你认为你的内存是在你请求的地方分配的。 – count0 2012-08-30 17:55:47

+0

更新我的驱动程序后,此错误消失。 – user1873073 2013-11-11 17:58:37

2

不要忘记您在设备上使用过的任何其他内存(并且,如果这也是您的显卡,则显示器正在使用的内存)。

(有没有办法获得当前可用的内存,或最大的碎片,或某些?)

+1

是的,clGetDeviceInfo()有一堆相关的总内存,最大单分配等参数 – Tom 2010-02-17 16:31:03

相关问题