2009-11-06 309 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

相關問題