COMPMID-1995: Fix memory management for weights transform in CLFFT

Remove memory manager from weights transformation in
CLFFTConvolutionLayer. Instead move the transformation function into a
unique_ptr and free once the tranformation has been performed.

Change-Id: Iabd691b3d517d60fa0127e44eb37d6df873a37d3
Signed-off-by: Georgios Pinitas <georgios.pinitas@arm.com>
Reviewed-on: https://review.mlplatform.org/c/1031
Reviewed-by: Giuseppe Rossini <giuseppe.rossini@arm.com>
Reviewed-by: Gian Marco Iodice <gianmarco.iodice@arm.com>
Comments-Addressed: Arm Jenkins <bsgcomp@arm.com>
Tested-by: Arm Jenkins <bsgcomp@arm.com>
diff --git a/arm_compute/runtime/CL/functions/CLFFTConvolutionLayer.h b/arm_compute/runtime/CL/functions/CLFFTConvolutionLayer.h
index 0fd2cf3..2fabe34 100644
--- a/arm_compute/runtime/CL/functions/CLFFTConvolutionLayer.h
+++ b/arm_compute/runtime/CL/functions/CLFFTConvolutionLayer.h
@@ -118,7 +118,7 @@
     CLPadLayer                       _pad_input_func;
     CLPadLayer                       _pad_weights_func;
     CLFFT2D                          _transform_input_func;
-    CLFFT2D                          _transform_weights_func;
+    std::unique_ptr<CLFFT2D>         _transform_weights_func;
     CLFFT2D                          _itransform_output_func;
     CLComplexPixelWiseMultiplication _prod_func;
     CLReductionOperation             _reduce_func;
diff --git a/src/runtime/CL/functions/CLFFT2D.cpp b/src/runtime/CL/functions/CLFFT2D.cpp
index 4300fb4..165e784 100644
--- a/src/runtime/CL/functions/CLFFT2D.cpp
+++ b/src/runtime/CL/functions/CLFFT2D.cpp
@@ -85,11 +85,9 @@
 
 void CLFFT2D::run()
 {
-    _memory_group.acquire();
+    MemoryGroupResourceScope scope_mg(_memory_group);
 
     _first_pass_func.run();
     _second_pass_func.run();
-
-    _memory_group.release();
 }
 } // namespace arm_compute
diff --git a/src/runtime/CL/functions/CLFFTConvolutionLayer.cpp b/src/runtime/CL/functions/CLFFTConvolutionLayer.cpp
index 441c1c7..6a89b9d 100644
--- a/src/runtime/CL/functions/CLFFTConvolutionLayer.cpp
+++ b/src/runtime/CL/functions/CLFFTConvolutionLayer.cpp
@@ -63,7 +63,7 @@
       _pad_input_func(),
       _pad_weights_func(),
       _transform_input_func(memory_manager),
-      _transform_weights_func(memory_manager),
+      _transform_weights_func(),
       _itransform_output_func(memory_manager),
       _prod_func(),
       _reduce_func(),
@@ -149,7 +149,8 @@
     _pad_weights_func.configure(&_flipped_weights, &_padded_weights, padding_w);
 
     // Transform weights
-    _transform_weights_func.configure(&_padded_weights, &_transformed_weights, FFT2DInfo());
+    _transform_weights_func = support::cpp14::make_unique<CLFFT2D>();
+    _transform_weights_func->configure(&_padded_weights, &_transformed_weights, FFT2DInfo());
 
     // Pad input
     const PaddingList padding_in = { { 0, kernel_size.x() + pad_valid.x() - 1 }, { 0, kernel_size.y() + pad_valid.y() - 1 } };
@@ -294,7 +295,7 @@
 {
     prepare();
 
-    _memory_group.acquire();
+    MemoryGroupResourceScope scope_mg(_memory_group);
 
     // Transform input
     if(_needs_permute)
@@ -327,8 +328,6 @@
     {
         _activation_layer_func.run();
     }
-
-    _memory_group.release();
 }
 
 void CLFFTConvolutionLayer::prepare()
@@ -367,11 +366,13 @@
         CLScheduler::get().queue().finish();
         _flipped_weights.allocator()->free();
 
-        // Transform weights to frequence domain
+        // Transform weights to frequency domain
         _transformed_weights.allocator()->allocate();
-        _transform_weights_func.run();
+        _transform_weights_func->run();
         _padded_weights.mark_as_unused();
         CLScheduler::get().queue().finish();
+        // Delete object and release internal memory
+        _transform_weights_func.reset();
         _padded_weights.allocator()->free();
 
         _is_prepared = true;