循环中的opencl运行时错误(Clenqueuewritebuffer)

时间:2012-09-12 11:56:12

标签: c for-loop opencl runtime-error

当我使用OpenCL处理许多数据块时,它会在第7次迭代中崩溃 我确保在循环的每次迭代之前释放内存,并再次为新块分配内存,但是在 Clenqueuewritebuffer() < -38 时仍然会发生崩溃/ p>

我已经尝试了很多,但我没有到达任何地方。

以下是我的代码流程:

    clGetPlatformIDs
    clGetDeviceIDs
    clCreateContext
    clCreateCommandQueue
    clCreateProgramWithSource
    clBuildProgram
    clCreateKernel

    for(x){
            clCreateBuffer
            clEnqueueWriteBuffer
            clSetKernelArg
            clEnqueueNDRangeKernel
            clFinish
            clEnqueueMapBuffer
            clReleaseMemObject
          }

这是正确的还是我必须以其他方式使用它? 如果是这样,我做错了什么?...

1 个答案:

答案 0 :(得分:1)

某些代码和出现此错误的特定命令会很好。

错误-38是CL_INVALID_MEM_OBJECT 请检查是否正确初始化了所有内存对象。

您可以明确检查clCreateBuffer clCreateImage..的输出吗?如果您提供给内核的缓冲区在类型或读/写修饰符方面与参数定义不匹配,也会出现此错误。

<小时/> 编辑以匹配编辑过的问题:

1)你可以在内核没有运行时更改内核arg,但是好的做法是只设置一次内核arg。 (最好直接在clCreateKernel之后)
更好的是重用指定的缓冲区。 (如果多次使用相同的缓冲区组合,则创建多个内核)
在你的情况下,我至少会在循环之前createBuffer and setKernelArg和循环之后的releaseMemObject

2)你正在对你的mem-object做clEnqueueMapBuffer。完成与对象的交互后,应该跟clEnqueueUnmapMemObject。如果您只想从缓冲区中读取数据,请尝试:enqueueReadBuffer等同于enqueueWriteBuffer