【问题标题】:CL_INVALID_ARG_VALUE when setting buffer arguments设置缓冲区参数时的 CL_INVALID_ARG_VALUE
【发布时间】:2017-08-07 16:19:20
【问题描述】:

我正在编写一个 OpenCL 程序,并且发现我正在读取一个全为零的缓冲区。深入了解英特尔 SDK 跟踪,我发现在设置缓冲区参数时我得到了一个 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&lt;cl_uchar&gt;(2048) 填充了一些测试数据,它还没有用于任何事情。我对这个测试用例的期望是读回一个填充了值 -3 的缓冲区。

我已经将我的代码与我在网上找到的其他示例进行了比较,没有什么让我感到奇怪,我尝试了各种小调整(比如更改内存标志),但我似乎无法改进情况。

关于缓冲区有什么我忽略的吗?

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

【问题讨论】:

    标签: c++ opencl


    【解决方案1】:

    要在主机和 GPU 之间来回传递数据,您必须使用全局内存。这似乎在主机端可以完成,但在您的内核中,您使用 __local 内存地址说明符,顾名思义,它将在内核中本地使用。 修复内核使用__global

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

    【讨论】:

    • 谢谢。老实说,我认为我可以对此做出选择。
    • 你知道如果我将内核参数设置为 __private 我会得到错误:“内核函数的指针参数必须驻留在 '__global'、'__constant' 或 '__local' 地址空间中”。这似乎意味着可以使用 __local ?
    • 似乎对于 inputBuf 我可以毫无问题地将其设为 __constant。我想有不同的情况。这里有更多关于 __local 的信息:stackoverflow.com/questions/30249801/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    • 1970-01-01
    相关资源
    最近更新 更多