OpenCL clEnqueueMapBuffer缓冲区清理

OpenCL clEnqueueMapBuffer缓冲区清理,opencl,Opencl,是否可以释放由clEnqueueMapBuffer创建的主机内存 例如,创建缓冲区并映射主机内存: cl_mem buffer=clCreateBuffer(…); float*dataPtr=(float*)clEnqueueMapBuffer(…,buffer,…); 执行一些OpenCL操作,然后进行清理: clenqueunmapmemobject(…,buffer,(void*)dataPtr,…); CLreleaseMoobject(缓冲区); 但是,此时,dataPtr不为空

是否可以释放由
clEnqueueMapBuffer
创建的主机内存

例如,创建缓冲区并映射主机内存:

cl_mem buffer=clCreateBuffer(…);
float*dataPtr=(float*)clEnqueueMapBuffer(…,buffer,…);
执行一些OpenCL操作,然后进行清理:

clenqueunmapmemobject(…,buffer,(void*)dataPtr,…);
CLreleaseMoobject(缓冲区);

但是,此时,
dataPtr
不为空。如何释放主机上由
clEnqueueMapBuffer
分配的内存?删除和释放不起作用,我在OpenCL文档中找不到任何提供释放缓冲区的方法。

据我所知,clEnqueueMapBuffer实际上并不分配任何内存,而是将主机上的某个地址范围映射为看起来像主机内存,但实际上是指设备内存。这意味着它不需要取消分配,因为clEnqueueMapBuffer(新的/malloc样式)一开始从未分配过任何内存,谢谢您的输入。我继续做了一个小的计算实验,看看主机上的物理内存中到底发生了什么。事实证明,克伦奎埃马布弗实际上是在分配内存。结果还表明,ClenqueunmapmemObject实际上是在释放内存,而不是将指针设置为null。它实际上是在分配内存,还是只是保留一些看起来像内存分配的虚拟内存空间?它实际上是在分配内存。使用windows中的任务管理器,我可以在每次创建映射缓冲区时跟踪物理内存使用量。浮点*并没有什么特别之处,它可以直接写入设备内存。事实上,在主机缓冲区传输到设备之前,您需要调用clEnqueueWriteBuffer。指针只是一个变量,没有人会为您将其设置为null。同样,“void*p=malloc(10);free(p);”不会将p设置为null。要回答这个问题,您不需要管理map提供给您的内存。