设置缓冲区参数时CL_INVALID_ARG_VALUE
CL_INVALID_ARG_VALUE when setting buffer arguments
我正在编写一个 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 的缓冲区。
我将我的代码与我在网上找到的其他示例进行了比较,没有什么让我感到奇怪,我已经尝试了各种小调整(例如更改 mem 标志(,但我似乎无法改善这种情况。
关于缓冲区,我是否忽略了什么?
(奇怪的是,我的测试程序确实用一些垃圾字节填充了result
?
要在主机和 GPU 之间传递数据,您必须使用全局内存。这似乎在主机端完成正常,但在内核中您可以使用内存地址说明符__local
顾名思义,该说明符将在内核中本地使用。 修复内核使用__global
:
__kernel void myKernel(
__global short* resultsBuf,
__global uchar* inputBuf
) {
for (int i = 0; i < 2048; ++i) {
resultsBuf[i] = -3;
}
}
相关文章:
- 瓦尔格林德:数学函数"Conditional jump or move depends on uninitialised value(s)"
- 如何解决"invalid conversion from 'char' to 'const char*'"
- 如何处理 c++ 中类实现中的"invalid use of non-static data member"?
- 为什么static_assert错误:即使我传递常量"expression must have a constant value"?
- C++ "error: invalid use of void expression"
- 为什么我会" void value not ignored as it ought to be"?
- 收到错误"invalid use of non-static data member 'stu::n' "
- 方法错误"not all control paths return a value"和方法不返回值
- Poloniex API "Invalid command" c++ libcurl
- C++/SDL "initial value of reference to a non-const must be an lvalue"
- 如何在 c++ 中理解这样的代码 [request->headers().Method()->value().getStringView())]
- std::<key-value>不同类型的对向量
- c++ visual studio 64bit | save registers value
- 初始化数组、"memset"或" {//value} "的最佳方法是什么?
- C++模板错误:"invalid explicitly-specified argument for template parameter"
- 马洛克会在 C++17 年返回"invalid pointer value"吗?
- OpenGL 4.2 glBindAttribLocation invalid value?
- OpenCL: Invalid Value
- 调用 glTexSubImage2D 时'invalid value' OpenGL 错误
- std::chrono::time_point invalid value