OpenCL 释放缓冲区对象
OpenCL release buffer object
我在使用 OpenCL
的程序中发现了一个奇怪的问题。
我的设备是 android 配备 arm mali
的智能手机。
所以我使用 jni 来执行 OpenCL 内核。
宿主(java)端调用原生函数。
然后。 native(c++) 函数设置 GPGPU 使用环境。
创建缓冲区、设置参数等..
在 GPGPU 中做一些工作
GPGPU执行后,将值写回本机端,然后转到主机端。
我让我的程序本机函数每次都内部化缓冲区,值。
但是在native(c++)函数执行结束后并没有释放缓冲区。
它本身就具有价值。
因此,如果再次调用本机函数,它会在先前写入的值之后写入值。
Java
->>>
Cpp
->>>
Cl(将一些值缓冲区增加到 7)
->>>
cpp(在这一点上,缓冲区应该被删除但它没有)
->>>
java
->>>
cpp
->>>
Cl(从 7 增加到 14)
->>>.....
在网络上的许多文档中,人们说 "you don't need release buffer, it is done by device automatically"
我没有声明缓冲区是静态的,所以它应该在单次执行时间内生效。
如何手动释放缓冲区?
总是调用 clReleaseMemObject() 来释放 CL 缓冲区对象或图像对象,在您完成 CL 部分并准备好 return 结果到 JAVA 部分之后。否则 buffer/image 的行为未定义。任何事情都可能发生,例如内存泄漏、崩溃或其他。
我在使用 OpenCL
的程序中发现了一个奇怪的问题。
我的设备是 android 配备 arm mali
的智能手机。
所以我使用 jni 来执行 OpenCL 内核。
宿主(java)端调用原生函数。
然后。 native(c++) 函数设置 GPGPU 使用环境。
创建缓冲区、设置参数等..
在 GPGPU 中做一些工作
GPGPU执行后,将值写回本机端,然后转到主机端。
我让我的程序本机函数每次都内部化缓冲区,值。
但是在native(c++)函数执行结束后并没有释放缓冲区。
它本身就具有价值。
因此,如果再次调用本机函数,它会在先前写入的值之后写入值。
Java ->>> Cpp ->>> Cl(将一些值缓冲区增加到 7) ->>> cpp(在这一点上,缓冲区应该被删除但它没有) ->>> java ->>> cpp ->>> Cl(从 7 增加到 14) ->>>.....
在网络上的许多文档中,人们说 "you don't need release buffer, it is done by device automatically"
我没有声明缓冲区是静态的,所以它应该在单次执行时间内生效。
如何手动释放缓冲区?
总是调用 clReleaseMemObject() 来释放 CL 缓冲区对象或图像对象,在您完成 CL 部分并准备好 return 结果到 JAVA 部分之后。否则 buffer/image 的行为未定义。任何事情都可能发生,例如内存泄漏、崩溃或其他。