2017-08-07 145 views
0

我寫在OpenCL程序,並已發現我在看所有零的緩衝器出來的時候。潛入英特爾SDK跟蹤中,我發現在設置緩衝區參數時我獲得了CL_INVALID_ARG_VALUE。CL_INVALID_ARG_VALUE設置緩衝區參數

我使用的OpenCL C++綁定(cl.hpp)(設置標量參數不會產生錯誤)。

因爲我的代碼是很長,我有一個測試程序複製的問題。

cl::CommandQueue queue(context, devices.front()); 

cl::Buffer resultsBuf(context, CL_MEM_WRITE_ONLY | CL_MEM_HOST_READ_ONLY, sizeof(cl_short) * 2048); 
cl::Buffer inputBuf(context, CL_MEM_READ_ONLY | CL_MEM_HOST_WRITE_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(cl_uchar) * 2048, input.data()); 

queue.enqueueWriteBuffer(inputBuf, CL_TRUE, 0, sizeof(cl_uchar) * 2048, input.data()); 

// Execution of the following two lines produces CL_INVALID_ARG_VALUE for both. 
err = kernel.setArg(0, resultsBuf); 
err = kernel.setArg(1, inputBuf); 

// Execution of the following line produces CL_INVALID_KERNEL_ARGS 
err = queue.enqueueTask(kernel); 

vector<cl_short> result(2048); 
err = queue.enqueueReadBuffer(resultsBuf, CL_TRUE, 0, sizeof(cl_short) * 2048, result.data()); 

和內核代碼:

__kernel void myKernel(
    __local short* resultsBuf, 
    __local uchar* inputBuf 
) { 
    for (int i = 0; i < 2048; ++i) { 
     resultsBuf[i] = -3; 
    } 
} 

input是充滿了一些測試數據vector<cl_uchar>(2048),它不用於任何東西。我期望從這個測試案例中讀取一個填充值爲-3的緩衝區。

我比較我與我在網上找到其他樣本代碼,並沒有跳出我奇怪,我已經試過各種小調整(如改變MEM標誌)和我似乎無法改善情況。

有件事情我已經忽略了有關緩衝區?

(好奇我的測試程序並填寫result有一些垃圾字節?)

回答

3

主機和您必須使用全局內存GPU之間一個來回傳遞數據。這似乎在主機端完成,但在內核中,您使用內存地址說明符,其名稱暗示將在內核中本地使用。 固定內核使用__global

__kernel void myKernel(
    __global short* resultsBuf, 
    __global uchar* inputBuf 
) { 
    for (int i = 0; i < 2048; ++i) { 
     resultsBuf[i] = -3; 
    } 
} 
+0

感謝。我真的以爲我有這個選擇。 – braks

+0

你知道,如果我設置內核參數傳遞給__private我得到的錯誤:「指針參數到內核函數必須駐留在‘__global’,‘__constant’或'__local的地址空間」。這似乎暗示它可能可以使用__local? – braks

+0

看來,對於inputBuf我可以使__constant沒有問題。我想有不同的情況。這裏有更多關於__local的內容:https://stackoverflow.com/questions/30249801/passing-arguments-through-local-memory-in-opencl – braks