aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorgios Pinitas <georgios.pinitas@arm.com>2019-04-25 18:25:06 +0100
committerGeorgios Pinitas <georgios.pinitas@arm.com>2019-04-26 15:15:17 +0000
commit098516b74a0948707119c64c641a0a8fdf529454 (patch)
treedb6766ad5e11d33597bf0a1f545397dbbe768558
parentcd78347b65cf3a4f4f516a9abb42b8b61f26fd03 (diff)
downloadComputeLibrary-098516b74a0948707119c64c641a0a8fdf529454.tar.gz
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>
-rw-r--r--arm_compute/runtime/CL/functions/CLFFTConvolutionLayer.h2
-rw-r--r--src/runtime/CL/functions/CLFFT2D.cpp4
-rw-r--r--src/runtime/CL/functions/CLFFTConvolutionLayer.cpp15
3 files changed, 10 insertions, 11 deletions
diff --git a/arm_compute/runtime/CL/functions/CLFFTConvolutionLayer.h b/arm_compute/runtime/CL/functions/CLFFTConvolutionLayer.h
index 0fd2cf3cb1..2fabe3454a 100644
--- a/arm_compute/runtime/CL/functions/CLFFTConvolutionLayer.h
+++ b/arm_compute/runtime/CL/functions/CLFFTConvolutionLayer.h
@@ -118,7 +118,7 @@ private:
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 4300fb4e32..165e784786 100644
--- a/src/runtime/CL/functions/CLFFT2D.cpp
+++ b/src/runtime/CL/functions/CLFFT2D.cpp
@@ -85,11 +85,9 @@ Status CLFFT2D::validate(const ITensorInfo *input, const ITensorInfo *output, co
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 441c1c7214..6a89b9d304 100644
--- a/src/runtime/CL/functions/CLFFTConvolutionLayer.cpp
+++ b/src/runtime/CL/functions/CLFFTConvolutionLayer.cpp
@@ -63,7 +63,7 @@ CLFFTConvolutionLayer::CLFFTConvolutionLayer(std::shared_ptr<IMemoryManager> mem
_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 @@ void CLFFTConvolutionLayer::configure(ICLTensor *input, const ICLTensor *weights
_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 @@ void CLFFTConvolutionLayer::run()
{
prepare();
- _memory_group.acquire();
+ MemoryGroupResourceScope scope_mg(_memory_group);
// Transform input
if(_needs_permute)
@@ -327,8 +328,6 @@ void CLFFTConvolutionLayer::run()
{
_activation_layer_func.run();
}
-
- _memory_group.release();
}
void CLFFTConvolutionLayer::prepare()
@@ -367,11 +366,13 @@ void CLFFTConvolutionLayer::prepare()
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;