aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arm_compute/runtime/CL/CLMemoryRegion.h1
-rw-r--r--src/runtime/CL/CLMemoryRegion.cpp11
2 files changed, 12 insertions, 0 deletions
diff --git a/arm_compute/runtime/CL/CLMemoryRegion.h b/arm_compute/runtime/CL/CLMemoryRegion.h
index 690a924f5b..66a30fa56b 100644
--- a/arm_compute/runtime/CL/CLMemoryRegion.h
+++ b/arm_compute/runtime/CL/CLMemoryRegion.h
@@ -105,6 +105,7 @@ public:
* @param[in] buffer Buffer to be used as a memory region
*/
CLBufferMemoryRegion(const cl::Buffer &buffer);
+ virtual ~CLBufferMemoryRegion() override;
// Inherited methods overridden :
void *ptr() final;
diff --git a/src/runtime/CL/CLMemoryRegion.cpp b/src/runtime/CL/CLMemoryRegion.cpp
index 380e4062ee..00f91a0ffb 100644
--- a/src/runtime/CL/CLMemoryRegion.cpp
+++ b/src/runtime/CL/CLMemoryRegion.cpp
@@ -72,6 +72,14 @@ CLBufferMemoryRegion::CLBufferMemoryRegion(const cl::Buffer &buffer)
_mem = buffer;
}
+CLBufferMemoryRegion::~CLBufferMemoryRegion()
+{
+ // Flush the command queue to ensure all commands that may use this memory buffer are scheduled to be finished before
+ // this buffer is freed
+ // Do not call finish as it is a blocking call which affects the performance
+ CLScheduler::get().queue().flush();
+}
+
void *CLBufferMemoryRegion::ptr()
{
return nullptr;
@@ -110,6 +118,9 @@ ICLSVMMemoryRegion::~ICLSVMMemoryRegion()
{
try
{
+ // Can only use the blocking finish instead of the non-blocking flush here, because clSVMFree requires all
+ // commands that may use the svm pointer to finish beforehand
+ // https://registry.khronos.org/OpenCL/sdk/3.0/docs/man/html/clSVMFree.html
clFinish(CLScheduler::get().queue().get());
_mem = cl::Buffer();
clSVMFree(_ctx.get(), _ptr);