gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:54:08 26 4
gpt4 key购买 nike

当我使用 OpenCL 处理大量数据时,它会在第 7 次迭代时崩溃。
我确保在循环的每次迭代之前释放内存,并再次为新 block 分配内存,但崩溃仍然发生,并在 Clenqueuewritebuffer() 上出现 -38 错误/p>

我已经尝试了很多,但还是一事无成。

以下是我的代码流程:

    clGetPlatformIDs
clGetDeviceIDs
clCreateContext
clCreateCommandQueue
clCreateProgramWithSource
clBuildProgram
clCreateKernel

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

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

最佳答案

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

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

无论您使用什么,您能否显式检查 clCreateBuffer clCreateImage.. 的输出?如果您提供给内核的缓冲区在类型或读/写修饰符方面与其参数定义不匹配,也可能会出现此错误。


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

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

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

关于c - 循环中的 opencl 运行时错误 (Clenqueuewritebuffer),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12387649/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com