aboutsummaryrefslogtreecommitdiff
path: root/src/armnn/Optimizer.cpp
diff options
context:
space:
mode:
authortelsoa01 <telmo.soares@arm.com>2018-03-09 14:13:49 +0000
committertelsoa01 <telmo.soares@arm.com>2018-03-09 14:13:49 +0000
commit4fcda0101ec3d110c1d6d7bee5c83416b645528a (patch)
treec9a70aeb2887006160c1b3d265c27efadb7bdbae /src/armnn/Optimizer.cpp
downloadarmnn-4fcda0101ec3d110c1d6d7bee5c83416b645528a.tar.gz
Release 18.02
Change-Id: Id3c11dc5ee94ef664374a988fcc6901e9a232fa6
Diffstat (limited to 'src/armnn/Optimizer.cpp')
-rw-r--r--src/armnn/Optimizer.cpp55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/armnn/Optimizer.cpp b/src/armnn/Optimizer.cpp
new file mode 100644
index 0000000000..85b9f2803c
--- /dev/null
+++ b/src/armnn/Optimizer.cpp
@@ -0,0 +1,55 @@
+//
+// Copyright © 2017 Arm Ltd. All rights reserved.
+// See LICENSE file in the project root for full license information.
+//
+#include "Optimizer.hpp"
+#include "optimizations/All.hpp"
+
+namespace armnn
+{
+
+const Optimizer& Optimizer::Get()
+{
+ // Add optimizations here
+ static optimizations::SquashEqualPermuteSiblings squashEqualPermuteSiblings;
+ static optimizations::SquashEqualReshapeSiblings squashEqualReshapeSiblings;
+ static optimizations::OptimizeInversePermutes optimizeInversePermutes;
+ static optimizations::MovePermuteUp movePermuteUp;
+ static optimizations::PermuteAsReshape permuteAsReshape;
+ static optimizations::OptimizeConsecutiveReshapes optimizeConsecutiveReshapes;
+
+ // Set optimizations in desired order
+ static const Optimizer optimizer({
+ &squashEqualPermuteSiblings,
+ &squashEqualReshapeSiblings,
+ &optimizeInversePermutes,
+ &movePermuteUp,
+ &permuteAsReshape,
+ &optimizeConsecutiveReshapes,
+ });
+
+ return optimizer;
+}
+
+void Optimizer::Optimize(Graph& graph) const
+{
+ auto it = graph.TopologicalSort().end();
+ // Call TopologicalSort() in every iteration to re-order the list in case layers where added/removed.
+ while (it != graph.TopologicalSort().begin())
+ {
+ --it;
+ for (auto&& optimization : m_Optimizations)
+ {
+ optimization->Run(graph, it);
+
+ if ((*it)->IsOutputUnconnected())
+ {
+ it = graph.EraseLayer(it);
+ break;
+ }
+ }
+ }
+}
+
+
+} // namespace armnn