From dde9ec96f471127e5b6d8dfaeffce024b6326f1a Mon Sep 17 00:00:00 2001 From: Michele Di Giorgio Date: Tue, 13 Feb 2018 15:24:04 +0000 Subject: COMPMID-909: Enabling in-place computation for batchnormalization and activation at graph level Change-Id: I84d4a212629b21794451ab5fb5c5b187b5e28f98 Reviewed-on: https://eu-gerrit-1.euhpc.arm.com/120127 Reviewed-by: Georgios Pinitas Tested-by: Jenkins --- src/graph/Graph.cpp | 13 +++++++++++-- src/graph/INode.cpp | 10 +++++++++- src/graph/SubGraph.cpp | 6 +++++- src/graph/nodes/ActivationLayer.cpp | 3 ++- 4 files changed, 27 insertions(+), 5 deletions(-) (limited to 'src/graph') diff --git a/src/graph/Graph.cpp b/src/graph/Graph.cpp index 7af313acbb..98d95904dc 100644 --- a/src/graph/Graph.cpp +++ b/src/graph/Graph.cpp @@ -131,6 +131,11 @@ void Graph::Private::configure(GraphHints _next_hints) _previous_hints = _current_hints; // For the first node just assume the previous node was of the same type as this one } + if(_current_node->supports_in_place()) + { + _current_output = _current_input; + } + //Automatic output configuration ? if(_current_output == nullptr) { @@ -152,8 +157,12 @@ void Graph::Private::configure(GraphHints _next_hints) _ctx.hints() = _current_hints; std::unique_ptr func = _current_node->instantiate_node(_ctx, _current_input, _current_output); - // Allocate current input - _current_input->allocate(); + // If the operation is done in-place, do not allocate or it will prevent following layers from performing the configuration + if(!_current_node->supports_in_place()) + { + // Allocate current input + _current_input->allocate(); + } // Map input if needed if(_current_input->target() == TargetHint::OPENCL) diff --git a/src/graph/INode.cpp b/src/graph/INode.cpp index 582f936351..c753f66b43 100644 --- a/src/graph/INode.cpp +++ b/src/graph/INode.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 ARM Limited. + * Copyright (c) 2017-2018 ARM Limited. * * SPDX-License-Identifier: MIT * @@ -39,6 +39,14 @@ TargetHint INode::override_target_hint(TargetHint target_hint) const ARM_COMPUTE_ERROR_ON(target_hint == TargetHint::OPENCL && !opencl_is_available()); return target_hint; } +bool INode::supports_in_place() const +{ + return _supports_in_place; +} +void INode::set_supports_in_place(bool value) +{ + _supports_in_place = value; +} GraphHints INode::node_override_hints(GraphHints hints) const { TargetHint target_hint = hints.target_hint(); diff --git a/src/graph/SubGraph.cpp b/src/graph/SubGraph.cpp index f62b2617c5..b1cbb9cc95 100644 --- a/src/graph/SubGraph.cpp +++ b/src/graph/SubGraph.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 ARM Limited. + * Copyright (c) 2017-2018 ARM Limited. * * SPDX-License-Identifier: MIT * @@ -67,6 +67,10 @@ std::unique_ptr SubGraph::construct(const GraphContext &ctx, std::unique_ } graph->add_tensor_object(std::move(_input)); + // Make sure first and last nodes of the subgraph always do operations out-of-place + _nodes.front()->set_supports_in_place(false); + _nodes.back()->set_supports_in_place(false); + // Construct nodes for(auto &node : _nodes) { diff --git a/src/graph/nodes/ActivationLayer.cpp b/src/graph/nodes/ActivationLayer.cpp index 54f30ef777..546c42a1e5 100644 --- a/src/graph/nodes/ActivationLayer.cpp +++ b/src/graph/nodes/ActivationLayer.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 ARM Limited. + * Copyright (c) 2017-2018 ARM Limited. * * SPDX-License-Identifier: MIT * @@ -33,6 +33,7 @@ using namespace arm_compute::graph; ActivationLayer::ActivationLayer(const ActivationLayerInfo activation_info) : _activation_info(activation_info) { + set_supports_in_place(true); } std::unique_ptr ActivationLayer::instantiate_node(GraphContext &ctx, ITensorObject *input, ITensorObject *output) -- cgit v1.2.1