当我使用OpenCL处理许多数据块时,它会在第7次迭代中崩溃
我确保在循环的每次迭代之前释放内存,并再次为新块分配内存,但是在 Clenqueuewritebuffer() < -38 时仍然会发生崩溃/ p>
我已经尝试了很多,但我没有到达任何地方。 以下是我的代码流程: 这是正确的还是我必须以其他方式使用它?
如果是这样,我做错了什么?... clGetPlatformIDs
clGetDeviceIDs
clCreateContext
clCreateCommandQueue
clCreateProgramWithSource
clBuildProgram
clCreateKernel
for(x){
clCreateBuffer
clEnqueueWriteBuffer
clSetKernelArg
clEnqueueNDRangeKernel
clFinish
clEnqueueMapBuffer
clReleaseMemObject
}
答案 0 :(得分:1)
某些代码和出现此错误的特定命令会很好。
错误-38是CL_INVALID_MEM_OBJECT
请检查是否正确初始化了所有内存对象。
您可以明确检查clCreateBuffer
clCreateImage..
的输出吗?如果您提供给内核的缓冲区在类型或读/写修饰符方面与参数定义不匹配,也会出现此错误。
<小时/> 编辑以匹配编辑过的问题:
1)你可以在内核没有运行时更改内核arg,但是好的做法是只设置一次内核arg。 (最好直接在clCreateKernel之后)
更好的是重用指定的缓冲区。 (如果多次使用相同的缓冲区组合,则创建多个内核)
在你的情况下,我至少会在循环之前createBuffer and setKernelArg
和循环之后的releaseMemObject
。
2)你正在对你的mem-object做clEnqueueMapBuffer
。完成与对象的交互后,应该跟clEnqueueUnmapMemObject
。如果您只想从缓冲区中读取数据,请尝试:enqueueReadBuffer
等同于enqueueWriteBuffer