aboutsummaryrefslogtreecommitdiff
path: root/src/armnn/backends/RefWorkloads
diff options
context:
space:
mode:
authorDavid Beck <david.beck@arm.com>2018-09-06 16:46:34 +0100
committerMatthew Bentham <matthew.bentham@arm.com>2018-09-25 14:54:29 +0100
commitf195f03e095a5c4dc6880be11af64cab83b5c94b (patch)
treed1c6d7d46ed70b915772bd50c5074d13443d9bca /src/armnn/backends/RefWorkloads
parentc2044fe9d26a8b6afca48aee04bd5d29f8e27b8d (diff)
downloadarmnn-f195f03e095a5c4dc6880be11af64cab83b5c94b.tar.gz
IVGCVSW-1803 : add Ref Subtraction layer
Change-Id: I4c019d626f9369245eca6d549bbe7a28e141f198
Diffstat (limited to 'src/armnn/backends/RefWorkloads')
-rw-r--r--src/armnn/backends/RefWorkloads/RefSubtractionFloat32Workload.cpp31
-rw-r--r--src/armnn/backends/RefWorkloads/RefSubtractionFloat32Workload.hpp21
-rw-r--r--src/armnn/backends/RefWorkloads/RefSubtractionUint8Workload.cpp41
-rw-r--r--src/armnn/backends/RefWorkloads/RefSubtractionUint8Workload.hpp21
-rw-r--r--src/armnn/backends/RefWorkloads/Subtraction.cpp44
-rw-r--r--src/armnn/backends/RefWorkloads/Subtraction.hpp20
6 files changed, 178 insertions, 0 deletions
diff --git a/src/armnn/backends/RefWorkloads/RefSubtractionFloat32Workload.cpp b/src/armnn/backends/RefWorkloads/RefSubtractionFloat32Workload.cpp
new file mode 100644
index 0000000000..4440eedab7
--- /dev/null
+++ b/src/armnn/backends/RefWorkloads/RefSubtractionFloat32Workload.cpp
@@ -0,0 +1,31 @@
+//
+// Copyright © 2017 Arm Ltd. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+
+#include "RefSubtractionFloat32Workload.hpp"
+
+#include "Subtraction.hpp"
+#include "RefWorkloadUtils.hpp"
+
+#include "Profiling.hpp"
+
+namespace armnn
+{
+
+void RefSubtractionFloat32Workload::Execute() const
+{
+ ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefSubtractionFloat32Workload_Execute");
+
+ const TensorShape& inShape0 = GetTensorInfo(m_Data.m_Inputs[0]).GetShape();
+ const TensorShape& inShape1 = GetTensorInfo(m_Data.m_Inputs[1]).GetShape();
+ const TensorShape& outShape = GetTensorInfo(m_Data.m_Outputs[0]).GetShape();
+
+ const float* inData0 = GetInputTensorDataFloat(0, m_Data);
+ const float* inData1 = GetInputTensorDataFloat(1, m_Data);
+ float* outData = GetOutputTensorDataFloat(0, m_Data);
+
+ Subtraction(inShape0, inShape1, outShape, inData0, inData1, outData);
+}
+
+} //namespace armnn
diff --git a/src/armnn/backends/RefWorkloads/RefSubtractionFloat32Workload.hpp b/src/armnn/backends/RefWorkloads/RefSubtractionFloat32Workload.hpp
new file mode 100644
index 0000000000..b3f5ed9474
--- /dev/null
+++ b/src/armnn/backends/RefWorkloads/RefSubtractionFloat32Workload.hpp
@@ -0,0 +1,21 @@
+//
+// Copyright © 2017 Arm Ltd. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+
+#pragma once
+
+#include "backends/Workload.hpp"
+#include "backends/WorkloadData.hpp"
+
+namespace armnn
+{
+
+class RefSubtractionFloat32Workload : public Float32Workload<SubtractionQueueDescriptor>
+{
+public:
+ using Float32Workload<SubtractionQueueDescriptor>::Float32Workload;
+ virtual void Execute() const override;
+};
+
+} //namespace armnn
diff --git a/src/armnn/backends/RefWorkloads/RefSubtractionUint8Workload.cpp b/src/armnn/backends/RefWorkloads/RefSubtractionUint8Workload.cpp
new file mode 100644
index 0000000000..8066762e48
--- /dev/null
+++ b/src/armnn/backends/RefWorkloads/RefSubtractionUint8Workload.cpp
@@ -0,0 +1,41 @@
+//
+// Copyright © 2017 Arm Ltd. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+
+#include "RefSubtractionUint8Workload.hpp"
+
+#include "Subtraction.hpp"
+#include "RefWorkloadUtils.hpp"
+
+#include "Profiling.hpp"
+
+#include <vector>
+
+namespace armnn
+{
+
+void RefSubtractionUint8Workload::Execute() const
+{
+ ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefSubtractionUint8Workload_Execute");
+
+ const TensorInfo& inputInfo0 = GetTensorInfo(m_Data.m_Inputs[0]);
+ const TensorInfo& inputInfo1 = GetTensorInfo(m_Data.m_Inputs[1]);
+ const TensorInfo& outputInfo = GetTensorInfo(m_Data.m_Outputs[0]);
+
+ auto dequant0 = Dequantize(GetInputTensorDataU8(0, m_Data), inputInfo0);
+ auto dequant1 = Dequantize(GetInputTensorDataU8(1, m_Data), inputInfo1);
+
+ std::vector<float> results(outputInfo.GetNumElements());
+
+ Subtraction(inputInfo0.GetShape(),
+ inputInfo1.GetShape(),
+ outputInfo.GetShape(),
+ dequant0.data(),
+ dequant1.data(),
+ results.data());
+
+ Quantize(GetOutputTensorDataU8(0, m_Data), results.data(), outputInfo);
+}
+
+} //namespace armnn
diff --git a/src/armnn/backends/RefWorkloads/RefSubtractionUint8Workload.hpp b/src/armnn/backends/RefWorkloads/RefSubtractionUint8Workload.hpp
new file mode 100644
index 0000000000..582533253b
--- /dev/null
+++ b/src/armnn/backends/RefWorkloads/RefSubtractionUint8Workload.hpp
@@ -0,0 +1,21 @@
+//
+// Copyright © 2017 Arm Ltd. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+
+#pragma once
+
+#include "backends/Workload.hpp"
+#include "backends/WorkloadData.hpp"
+
+namespace armnn
+{
+
+class RefSubtractionUint8Workload : public Uint8Workload<SubtractionQueueDescriptor>
+{
+public:
+ using Uint8Workload<SubtractionQueueDescriptor>::Uint8Workload;
+ virtual void Execute() const override;
+};
+
+} //namespace armnn
diff --git a/src/armnn/backends/RefWorkloads/Subtraction.cpp b/src/armnn/backends/RefWorkloads/Subtraction.cpp
new file mode 100644
index 0000000000..f25c8adb1c
--- /dev/null
+++ b/src/armnn/backends/RefWorkloads/Subtraction.cpp
@@ -0,0 +1,44 @@
+//
+// Copyright © 2017 Arm Ltd. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+
+#include "Subtraction.hpp"
+#include "Broadcast.hpp"
+
+#include <functional>
+
+namespace
+{
+
+void ElementwiseSubtraction(unsigned int numElements, const float* inData0, const float* inData1, float* outData)
+{
+ for (unsigned int i = 0; i < numElements; ++i)
+ {
+ outData[i] = inData0[i] - inData1[i];
+ }
+}
+
+} // namespace
+
+namespace armnn
+{
+
+void Subtraction(const TensorShape& inShape0,
+ const TensorShape& inShape1,
+ const TensorShape& outShape,
+ const float* inData0,
+ const float* inData1,
+ float* outData)
+{
+ if (inShape0 == inShape1)
+ {
+ ElementwiseSubtraction(inShape0.GetNumElements(), inData0, inData1, outData);
+ }
+ else
+ {
+ BroadcastLoop(inShape0, inShape1, outShape).Unroll(std::minus<float>(), 0, inData0, inData1, outData);
+ }
+}
+
+} //namespace armnn
diff --git a/src/armnn/backends/RefWorkloads/Subtraction.hpp b/src/armnn/backends/RefWorkloads/Subtraction.hpp
new file mode 100644
index 0000000000..3956797185
--- /dev/null
+++ b/src/armnn/backends/RefWorkloads/Subtraction.hpp
@@ -0,0 +1,20 @@
+//
+// Copyright © 2017 Arm Ltd. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+
+#pragma once
+
+#include <armnn/Tensor.hpp>
+
+namespace armnn
+{
+
+void Subtraction(const TensorShape& inShape0,
+ const TensorShape& inShape1,
+ const TensorShape& outShape,
+ const float* inData0,
+ const float* inData1,
+ float* outData);
+
+} //namespace armnn