xref: /aosp_15_r20/external/armnn/src/backends/backendsCommon/MemCopyWorkload.cpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1 //
2 // Copyright © 2022 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 #include <ResolveType.hpp>
7 
8 #include "WorkloadUtils.hpp"
9 
10 #include <armnn/backends/MemCopyWorkload.hpp>
11 #include <armnn/backends/TensorHandle.hpp>
12 
13 #include <armnn/utility/PolymorphicDowncast.hpp>
14 
15 #include <cstring>
16 
17 namespace armnn
18 {
19 
20 namespace
21 {
22 
23 template <typename SrcTensorHandleType, typename DstTensorHandleType>
GatherTensorHandlePairs(const MemCopyQueueDescriptor & descriptor,std::vector<std::pair<SrcTensorHandleType *,DstTensorHandleType * >> & tensorHandlePairs)24 void GatherTensorHandlePairs(const MemCopyQueueDescriptor& descriptor,
25                              std::vector<std::pair<SrcTensorHandleType*, DstTensorHandleType*>>& tensorHandlePairs)
26 {
27     const unsigned int numInputs = static_cast<unsigned int>(descriptor.m_Inputs.size());
28     tensorHandlePairs.reserve(numInputs);
29 
30     for (unsigned int i = 0; i < numInputs; ++i)
31     {
32         SrcTensorHandleType* const srcTensorHandle = PolymorphicDowncast<SrcTensorHandleType*>(
33             descriptor.m_Inputs[i]);
34         DstTensorHandleType* const dstTensorHandle = PolymorphicDowncast<DstTensorHandleType*>(
35             descriptor.m_Outputs[i]);
36 
37         tensorHandlePairs.emplace_back(srcTensorHandle, dstTensorHandle);
38     }
39 }
40 
41 } //namespace
42 
43 
CopyMemGenericWorkload(const MemCopyQueueDescriptor & descriptor,const WorkloadInfo & info)44 CopyMemGenericWorkload::CopyMemGenericWorkload(const MemCopyQueueDescriptor& descriptor,
45                                                const WorkloadInfo& info)
46     : BaseWorkload<MemCopyQueueDescriptor>(descriptor, info)
47 {
48     GatherTensorHandlePairs(descriptor, m_TensorHandlePairs);
49 }
50 
Execute() const51 void CopyMemGenericWorkload::Execute() const
52 {
53     ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "CopyMemGeneric_Execute");
54 
55     auto copyFunc = [](void* dst, const void* src, size_t size)
56         {
57             memcpy(dst, src, size);
58         };
59 
60     for (const auto& pair : m_TensorHandlePairs)
61     {
62         CopyTensorContentsGeneric(pair.first, pair.second, copyFunc);
63     }
64 }
65 
ExecuteAsync(ExecutionData & executionData)66 void CopyMemGenericWorkload::ExecuteAsync(ExecutionData& executionData)
67 {
68     ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "CopyMemGeneric_Execute_WorkingMemDescriptor");
69 
70     WorkingMemDescriptor* workingMemDescriptor = static_cast<WorkingMemDescriptor*>(executionData.m_Data);
71     std::vector<TensorHandlePair> tensorHandlePairs;
72 
73     GatherTensorHandlePairs(*workingMemDescriptor, tensorHandlePairs);
74 
75     auto copyFunc = [](void* dst, const void* src, size_t size)
76     {
77         memcpy(dst, src, size);
78     };
79 
80     for (const auto& pair : tensorHandlePairs)
81     {
82         CopyTensorContentsGeneric(pair.first, pair.second, copyFunc);
83     }
84 }
85 
86 } //namespace armnn
87