设置缓冲区参数

时间:2017-08-07 03:40:09

标签: c++ opencl

我正在写一个OpenCL程序,并且发现我正在读取缓冲区,因为全部为零。深入了解英特尔SDK跟踪,我发现在设置缓冲区参数时我得到了一个CL_INVALID_ARG_VALUE。 (设置标量参数不会产生错误)

我正在使用OpenCL C ++ Bindings(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的缓冲区。

我已经将我的代码与我在网上找到的其他样本进行了比较,没有任何事情像我一样突然发现,我尝试了各种小调整(比如更改内存标记),我似乎无法改善情况。

我有没有忽略缓冲区的事情?

(奇怪的是我的测试程序确实用几个垃圾字节填充result?)

1 个答案:

答案 0 :(得分:3)

要在主机和GPU之间传回数据,您必须使用全局内存。这似乎可以在主机端完成,但在你的内核中使用 <services> <!--1 name =Namespace.ImplementingClass--> <service behaviorConfiguration="ServiceBehaviour" name="service.Service1"> <endpoint behaviorConfiguration="Service1" address="" binding="webHttpBinding" bindingConfiguration="" contract="CreateService.IService1"> </endpoint> 内存地址说明符,顾名思义就是在内核中本地使用。 修复了要使用__local的内核:

__global