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
有一些垃圾字節?)
感謝。我真的以爲我有這個選擇。 – braks
你知道,如果我設置內核參數傳遞給__private我得到的錯誤:「指針參數到內核函數必須駐留在‘__global’,‘__constant’或'__local的地址空間」。這似乎暗示它可能可以使用__local? – braks
看來,對於inputBuf我可以使__constant沒有問題。我想有不同的情況。這裏有更多關於__local的內容:https://stackoverflow.com/questions/30249801/passing-arguments-through-local-memory-in-opencl – braks