From d910ffa3ae6433404649f91ac53c8fa08bd6e196 Mon Sep 17 00:00:00 2001 From: Georgios Pinitas Date: Mon, 18 Sep 2017 16:04:42 +0100 Subject: COMPMID-534: Port MemoryManager to NEON functions (Images) Adds support to: -NEHarrisCorners -NEFastCorners Change-Id: I21eeb9961092d20f69e82f447fe1faa48b0f4ad8 Reviewed-on: http://mpd-gerrit.cambridge.arm.com/88113 Tested-by: Kaizen Reviewed-by: Moritz Pflanzer Reviewed-by: Pablo Tello --- arm_compute/runtime/NEON/functions/NEFastCorners.h | 6 +++- .../runtime/NEON/functions/NEHarrisCorners.h | 5 +++- src/runtime/NEON/functions/NEFastCorners.cpp | 11 +++++-- src/runtime/NEON/functions/NEHarrisCorners.cpp | 35 +++++++++++++++++----- 4 files changed, 45 insertions(+), 12 deletions(-) diff --git a/arm_compute/runtime/NEON/functions/NEFastCorners.h b/arm_compute/runtime/NEON/functions/NEFastCorners.h index d7c31750c5..5ecf0c2b19 100644 --- a/arm_compute/runtime/NEON/functions/NEFastCorners.h +++ b/arm_compute/runtime/NEON/functions/NEFastCorners.h @@ -31,9 +31,12 @@ #include "arm_compute/core/Types.h" #include "arm_compute/runtime/Array.h" #include "arm_compute/runtime/IFunction.h" +#include "arm_compute/runtime/IMemoryManager.h" +#include "arm_compute/runtime/MemoryGroup.h" #include "arm_compute/runtime/Tensor.h" #include +#include namespace arm_compute { @@ -51,7 +54,7 @@ class NEFastCorners : public IFunction { public: /** Constructor */ - NEFastCorners(); + NEFastCorners(std::shared_ptr memory_manager = nullptr); /** Initialize the function's source, destination, conv and border_mode. * * @param[in, out] input Source image. Data type supported: U8. (Written to only for @p border_mode != UNDEFINED) @@ -68,6 +71,7 @@ public: void run() override; private: + MemoryGroup _memory_group; NEFastCornersKernel _fast_corners_kernel; NEFillBorderKernel _border_handler; NENonMaximaSuppression3x3Kernel _nonmax_kernel; diff --git a/arm_compute/runtime/NEON/functions/NEHarrisCorners.h b/arm_compute/runtime/NEON/functions/NEHarrisCorners.h index a709871153..a9a6786db5 100644 --- a/arm_compute/runtime/NEON/functions/NEHarrisCorners.h +++ b/arm_compute/runtime/NEON/functions/NEHarrisCorners.h @@ -31,6 +31,8 @@ #include "arm_compute/core/Types.h" #include "arm_compute/runtime/Array.h" #include "arm_compute/runtime/IFunction.h" +#include "arm_compute/runtime/IMemoryManager.h" +#include "arm_compute/runtime/MemoryGroup.h" #include "arm_compute/runtime/NEON/functions/NENonMaximaSuppression3x3.h" #include "arm_compute/runtime/Tensor.h" @@ -63,7 +65,7 @@ public: * * Initialize _sobel, _harris_score and _corner_list to nullptr. */ - NEHarrisCorners(); + NEHarrisCorners(std::shared_ptr memory_manager = nullptr); /** Initialize the function's source, destination, conv and border_mode. * * @param[in, out] input Source image. Data type supported: U8. (Written to only for @p border_mode != UNDEFINED) @@ -85,6 +87,7 @@ public: void run() override; private: + MemoryGroup _memory_group; /**< Function's memory group */ std::unique_ptr _sobel; /**< Sobel function */ std::unique_ptr _harris_score; /**< Harris score kernel */ NENonMaximaSuppression3x3 _non_max_suppr; /**< Non-maxima suppression function */ diff --git a/src/runtime/NEON/functions/NEFastCorners.cpp b/src/runtime/NEON/functions/NEFastCorners.cpp index 265041fc42..4137b1d131 100644 --- a/src/runtime/NEON/functions/NEFastCorners.cpp +++ b/src/runtime/NEON/functions/NEFastCorners.cpp @@ -35,8 +35,9 @@ using namespace arm_compute; -NEFastCorners::NEFastCorners() - : _fast_corners_kernel(), +NEFastCorners::NEFastCorners(std::shared_ptr memory_manager) + : _memory_group(std::move(memory_manager)), + _fast_corners_kernel(), _border_handler(), _nonmax_kernel(), _fill_kernel(), @@ -59,6 +60,7 @@ void NEFastCorners::configure(IImage *input, float threshold, bool nonmax_suppre TensorInfo tensor_info(input->info()->tensor_shape(), Format::U8); _output.allocator()->init(tensor_info); + _memory_group.manage(&_output); // If border is UNDEFINED _fast_corners_kernel will operate in xwindow (3, // width - 3) and ywindow (3, height -3) so the output image will leave the @@ -75,6 +77,7 @@ void NEFastCorners::configure(IImage *input, float threshold, bool nonmax_suppre else { _suppressed.allocator()->init(tensor_info); + _memory_group.manage(&_suppressed); _nonmax_kernel.configure(&_output, &_suppressed, BorderMode::UNDEFINED == border_mode); _fill_kernel.configure(&_suppressed, 1 /* we keep all texels >0 */, corners); @@ -90,6 +93,8 @@ void NEFastCorners::run() { NEScheduler::get().schedule(&_border_handler, Window::DimZ); + _memory_group.acquire(); + NEScheduler::get().schedule(&_fast_corners_kernel, Window::DimY); if(_non_max) @@ -98,4 +103,6 @@ void NEFastCorners::run() } NEScheduler::get().schedule(&_fill_kernel, Window::DimY); + + _memory_group.release(); } diff --git a/src/runtime/NEON/functions/NEHarrisCorners.cpp b/src/runtime/NEON/functions/NEHarrisCorners.cpp index 7ec681dce9..25e28d2213 100644 --- a/src/runtime/NEON/functions/NEHarrisCorners.cpp +++ b/src/runtime/NEON/functions/NEHarrisCorners.cpp @@ -41,8 +41,9 @@ using namespace arm_compute; -NEHarrisCorners::NEHarrisCorners() // NOLINT - : _sobel(), +NEHarrisCorners::NEHarrisCorners(std::shared_ptr memory_manager) // NOLINT + : _memory_group(std::move(memory_manager)), + _sobel(), _harris_score(), _non_max_suppr(), _candidates(), @@ -81,6 +82,10 @@ void NEHarrisCorners::configure(IImage *input, float threshold, float min_dist, _gx.allocator()->init(tensor_info_gxgy); _gy.allocator()->init(tensor_info_gxgy); + // Manage intermediate buffers + _memory_group.manage(&_gx); + _memory_group.manage(&_gy); + TensorInfo tensor_info_score(shape, Format::F32); _score.allocator()->init(tensor_info_score); _nonmax.allocator()->init(tensor_info_score); @@ -118,6 +123,9 @@ void NEHarrisCorners::configure(IImage *input, float threshold, float min_dist, // Normalization factor const float norm_factor = 1.0f / (255.0f * pow(4.0f, gradient_size / 2) * block_size); + // Manage intermediate buffers + _memory_group.manage(&_score); + if(use_fp16) { switch(block_size) @@ -180,26 +188,35 @@ void NEHarrisCorners::configure(IImage *input, float threshold, float min_dist, _border_gx.configure(&_gx, _harris_score->border_size(), border_mode, constant_border_value); _border_gy.configure(&_gy, _harris_score->border_size(), border_mode, constant_border_value); + // Allocate once all the configure methods have been called + _gx.allocator()->allocate(); + _gy.allocator()->allocate(); + + // Manage intermediate buffers + _memory_group.manage(&_nonmax); + // Init non-maxima suppression function _non_max_suppr.configure(&_score, &_nonmax, border_mode); + // Allocate once all the configure methods have been called + _score.allocator()->allocate(); + // Init corner candidates kernel _candidates.configure(&_nonmax, _corners_list.get(), &_num_corner_candidates); - // Init euclidean distance - _sort_euclidean.configure(_corners_list.get(), corners, &_num_corner_candidates, min_dist); - // Allocate once all the configure methods have been called - _gx.allocator()->allocate(); - _gy.allocator()->allocate(); - _score.allocator()->allocate(); _nonmax.allocator()->allocate(); + + // Init euclidean distance + _sort_euclidean.configure(_corners_list.get(), corners, &_num_corner_candidates, min_dist); } void NEHarrisCorners::run() { ARM_COMPUTE_ERROR_ON_MSG(_sobel == nullptr, "Unconfigured function"); + _memory_group.acquire(); + // Init to 0 number of corner candidates _num_corner_candidates = 0; @@ -221,4 +238,6 @@ void NEHarrisCorners::run() // Run sort & euclidean distance NEScheduler::get().schedule(&_sort_euclidean, Window::DimY); + + _memory_group.release(); } -- cgit v1.2.1