OpenCL - 从缓冲区读取时CL_INVALID_VALUE
OpenCL - CL_INVALID_VALUE while reading from Buffer
因为代码相当长,所以我尝试发布重要的东西。
我分配了一个数组,创建了缓冲区,像这样传递给内核。
cl_mem correspondenceRes= NULL;
int size_correspondence_result = model_voxelized->size()*3*num_angle_steps*num_shift_steps;
float* correspondence_result = new float[size_correspondence_result];
correspondenceRes = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, sizeof(size_correspondence_result),correspondence_result,&ret);
ret = clSetKernelArg(kernel,6,sizeof(correspondenceRes), &correspondenceRes);
稍后从缓冲区读回它:
ret = clEnqueueReadBuffer(command_queue,correspondenceRes,CL_TRUE,0,sizeof(correspondence_result), &correspondence_result[0],0,NULL,NULL);
然后我得到了代码-30,说CL_INVALID_VALUE,也可能意味着我在ClEnqueueReadBuffer中放置了错误大小的对象。同时对于另一个论点,我创建并阅读如下:
cl_mem corr_result = NULL;
cl_int* corr_result_count = new cl_int[prod];
corr_result= clCreateBuffer(context, CL_MEM_READ_WRITE| CL_MEM_COPY_HOST_PTR, sizeof(corr_result_count),corr_result_count,&ret);
ret=clSetKernelArg(kernel,7,sizeof(corr_result),&corr_result);
稍后从缓冲区中读取它:
ret = clEnqueueReadBuffer(command_queue,corr_result,CL_TRUE,0,sizeof(corr_result_count), &corr_result_count[0],0,NULL,NULL);
读取部分工作得很好,但数组中的值不是我预期的(所有随机数,除非我的内核代码明确定义它(。
请注意,我不在内核内进行任何计算,只是传递并读回它。
对于第一个问题,您在创建缓冲区时使用的大小错误。 sizeof(size_correspondence_result)
应该是sizeof(float) * size_correspondence_result
,否则相当于sizeof(int)
。 在读回时,您也需要使用相同的大小。 我强烈建议您阅读 sizeof(( 的工作原理,以便了解它返回的值。
至于第二个问题,您正在分配内存,然后立即创建一个带有 CL_MEM_COPY_HOST_PTR
的缓冲区,这会将未初始化的内存复制到缓冲区中。 不应该有理由这样做;要么先初始化内存,要么如果你只想在设备本身上写入/读取未初始化的内存,请不要使用 CL_MEM_COPY_HOST_PTR
(并假设内核中的内存未初始化(。
相关文章:
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 当我编译webrtc服务器时,Windows上只支持clang-cl
- 如何解决"invalid conversion from 'char' to 'const char*'"
- 如何处理 c++ 中类实现中的"invalid use of non-static data member"?
- C++ "error: invalid use of void expression"
- 收到错误"invalid use of non-static data member 'stu::n' "
- Poloniex API "Invalid command" c++ libcurl
- 使用 cl 构建代码并连接到 sqlite 库
- C++模板错误:"invalid explicitly-specified argument for template parameter"
- SDL_CreateTextureFromSurface() "Invalid texture"错误?
- C++ "Invalid use of 'this' in non-member function" ,
- 为什么gmp会在这里与"invalid next size"重新定位一起崩溃?
- MSYS2 MinGW64 在 Windows 上构建 GMP/MPFR 作为静态库,并将它们链接到使用 CL 编译的
- 继承类时"invalid use of incomplete type ‘class tree_node_t’"
- 为什么我会"Invalid read of size 8"?(瓦尔格林德)
- "fast"或"normal"在"free(): invalid next size (fast)"中是什么意思?
- 如何在Arduino程序中解决"invalid operands of types"?
- NMAKE:致命错误 U1077:cl.exe 和 nmake.exe 返回代码'0x2'
- 如何'Invalid conversion'和'no match for operator'更正这些 c++ 错误
- Clang-CL 警告 strnicmp 已弃用,请使用 ISO C 并C++符合标准的名称_strnicmp