2014-06-30 71 views
2

我用C++包裝,並用下面的代碼創建緩衝區:爲什麼clCreateBuffer使用主機內存?

cl_int err(0); 
unsigned int size; 
void *data = GetData(/*out*/ size); 

cl::Buffer buf(m_ctx, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, 
     size, data, &err); 

free(data); 

之後工作由size字節設定的我的應用程序的增加。而且,由於我有32位應用程序,因此總共不能分配更多的1.5 Gb,但GPU有3 Gb。

是否可以分配更多緩衝區?

PS。 size小於128 Mb。

更新:我只使用1個設備,它是GPU。 (GeForce GTX 780 GPU NVIDIA Corporation 337.88)

+0

我必須問:難道你有多個平臺和/或設備,並且意外地選擇了** CPU **作爲工作設備(而不是** GPU **)? – Marco13

+1

'CL_MEM_COPY_HOST_PTR'可能會觸發某些固定的行爲。禁用它支持正常的'clEnqueueWriteBuffer()'可能會解決這個問題。如果不是這樣,那麼司機是如何在較低級別工作的,並且可能無法改變行爲。 – DarkZeros

+0

@DarkZeros通常,'CL_MEM_COPY_HOST_PTR'不應該導致鎖定(與CL_MEM_USE_HOST_PTR'相反),但是您可能比我更瞭解細節,並且有疑問的是,這種行爲取決於OpenCL的實現。 (至少,規範中可能沒有任何內容阻止實現鎖定內存......) – Marco13

回答

0

我不知道問題發生的確切原因,它可能是一些潛在的駕駛員行爲。

但是,禁用特殊標誌似乎可以爲nVIDIA平臺解決問題,也可能爲AMD解決問題。所以我正在寫一個正確的答案。

cl_int err(0); 
unsigned int size; 
void *data = GetData(/*out*/ size); 

cl::Buffer buffer = cl::Buffer buf(m_ctx, CL_MEM_READ_WRITE, 
     size, NULL, &err); 
err = queue.EnqueueWriteBuffer(buffer, CL_TRUE, NULL, size, data); 

free(data); 
0

部分回答您的問題。內存塊的最大尺寸,可以分配:

cl_ulong max_buffer_size = 0; 

cl_int ret_code = clGetDeviceInfo(Device, CL_DEVICE_MAX_MEM_ALLOC_SIZE, 
    sizeof(cl_ulong), &max_buffer_size, NULL); 

if(ret_code != CL_SUCCESS){ 
    fprintf(stderr, "Error %d happened \n", ret_code); 
} 

一般的OpenCL API不允許分配大(超過幾百兆字節)的內存對象。

+0

我沒有分配大量內存對象,我分配了許多小對象。 –

+0

好吧,我明白了。在總共1.5 Gb之後,您是否收到任何特定的錯誤/例外情況? –

+0

不,我只是沒有更多的內存來分配我的過程。但是,當我使用'clEnqueueWriteBuffer()'繞過這個限制時,我得到了BSOD =(。 –

0

DarkZeros在評論中是正確的。它似乎是依賴於實現的,當我使用clEnqueueWriteBuffer()而不是標記CL_MEM_COPY_HOST_PTR時,它解決了問題。

相關問題