2

When I use OpenCL to process many chunks of data it crashes in the 7th iteration.
I ensure that memory is released before each iteration of the loop, and allocated again for new chunk, but the crash still occurs with an error of -38 on Clenqueuewritebuffer()

I have tried a lot, but am not getting anywhere.

The following is the flow of my code :

    clGetPlatformIDs
    clGetDeviceIDs
    clCreateContext
    clCreateCommandQueue
    clCreateProgramWithSource
    clBuildProgram
    clCreateKernel

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

Is it correct or do I have to use it in other ways?
If so, What am I doing wrong?...

4

1 回答 1

1

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

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

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


编辑以匹配已编辑的问题:

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

2)你正在做clEnqueueMapBuffer你的内存对象。clEnqueueUnmapMemObject当您完成与对象的交互时,这应该跟着一个。如果您只想从缓冲区中读取数据,请尝试:enqueueReadBuffer等同于enqueueWriteBuffer

于 2012-09-12T12:54:38.787 回答