IVGCVSW-2093 Add SpaceToBatchNd layer and corresponding no-op factory implementations
[platform/upstream/armnn.git] / src / backends / backendsCommon / MemCopyWorkload.cpp
1 //
2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5
6 #include "MemCopyWorkload.hpp"
7
8 #include "CpuTensorHandle.hpp"
9
10 #include <TypeUtils.hpp>
11
12 #include <boost/cast.hpp>
13
14 #include <cstring>
15
16 namespace armnn
17 {
18
19 namespace
20 {
21
22 template <typename SrcTensorHandleType, typename DstTensorHandleType>
23 void GatherTensorHandlePairs(const MemCopyQueueDescriptor& descriptor,
24                              std::vector<std::pair<SrcTensorHandleType*, DstTensorHandleType*>>& tensorHandlePairs)
25 {
26     const unsigned int numInputs = static_cast<unsigned int>(descriptor.m_Inputs.size());
27     tensorHandlePairs.reserve(numInputs);
28
29     for (unsigned int i = 0; i < numInputs; ++i)
30     {
31         SrcTensorHandleType* const srcTensorHandle = boost::polymorphic_downcast<SrcTensorHandleType*>(
32             descriptor.m_Inputs[i]);
33         DstTensorHandleType* const dstTensorHandle = boost::polymorphic_downcast<DstTensorHandleType*>(
34             descriptor.m_Outputs[i]);
35
36         tensorHandlePairs.emplace_back(srcTensorHandle, dstTensorHandle);
37     }
38 }
39
40 } //namespace
41
42
43 CopyMemGenericWorkload::CopyMemGenericWorkload(const MemCopyQueueDescriptor& descriptor,
44                                                          const WorkloadInfo& info)
45     : BaseWorkload<MemCopyQueueDescriptor>(descriptor, info)
46 {
47     GatherTensorHandlePairs(descriptor, m_TensorHandlePairs);
48 }
49
50 void CopyMemGenericWorkload::Execute() const
51 {
52     ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "CopyMemGeneric_Execute");
53
54     auto copyFunc = [](void* dst, const void* src, size_t size)
55         {
56             memcpy(dst, src, size);
57         };
58
59     for (const auto& pair : m_TensorHandlePairs)
60     {
61         CopyTensorContentsGeneric(pair.first, pair.second, copyFunc);
62     }
63 }
64
65 } //namespace armnn