blob: 29f629ae503e756c6b4cf0e8cc284eff8b63ee49 [file] [log] [blame]
telsoa014fcda012018-03-09 14:13:49 +00001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
David Beckecb56cd2018-09-05 12:52:57 +01003// SPDX-License-Identifier: MIT
telsoa014fcda012018-03-09 14:13:49 +00004//
5#include "MemCopyWorkload.hpp"
David Beckac42efd2018-09-26 17:41:13 +01006#include "CpuTensorHandle.hpp"
7#include <TypeUtils.hpp>
telsoa014fcda012018-03-09 14:13:49 +00008
9#include <cstring>
10#include <boost/cast.hpp>
11
12namespace armnn
13{
14
15namespace
16{
17
18template <typename SrcTensorHandleType, typename DstTensorHandleType>
19void GatherTensorHandlePairs(const MemCopyQueueDescriptor& descriptor,
20 std::vector<std::pair<SrcTensorHandleType*, DstTensorHandleType*>>& tensorHandlePairs)
21{
telsoa01c577f2c2018-08-31 09:22:23 +010022 const unsigned int numInputs = static_cast<unsigned int>(descriptor.m_Inputs.size());
telsoa014fcda012018-03-09 14:13:49 +000023 tensorHandlePairs.reserve(numInputs);
24
25 for (unsigned int i = 0; i < numInputs; ++i)
26 {
27 SrcTensorHandleType* const srcTensorHandle = boost::polymorphic_downcast<SrcTensorHandleType*>(
28 descriptor.m_Inputs[i]);
29 DstTensorHandleType* const dstTensorHandle = boost::polymorphic_downcast<DstTensorHandleType*>(
30 descriptor.m_Outputs[i]);
31
32 tensorHandlePairs.emplace_back(srcTensorHandle, dstTensorHandle);
33 }
34}
35
telsoa01c577f2c2018-08-31 09:22:23 +010036} //namespace
telsoa014fcda012018-03-09 14:13:49 +000037
telsoa014fcda012018-03-09 14:13:49 +000038
telsoa01c577f2c2018-08-31 09:22:23 +010039CopyMemGenericWorkload::CopyMemGenericWorkload(const MemCopyQueueDescriptor& descriptor,
40 const WorkloadInfo& info)
41 : BaseWorkload<MemCopyQueueDescriptor>(descriptor, info)
telsoa014fcda012018-03-09 14:13:49 +000042{
43 GatherTensorHandlePairs(descriptor, m_TensorHandlePairs);
44}
45
telsoa01c577f2c2018-08-31 09:22:23 +010046void CopyMemGenericWorkload::Execute() const
telsoa014fcda012018-03-09 14:13:49 +000047{
telsoa01c577f2c2018-08-31 09:22:23 +010048 ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "CopyMemGeneric_Execute");
49
50 auto copyFunc = [](void* dst, const void* src, size_t size)
51 {
52 memcpy(dst, src, size);
53 };
telsoa014fcda012018-03-09 14:13:49 +000054
55 for (const auto& pair : m_TensorHandlePairs)
56 {
telsoa01c577f2c2018-08-31 09:22:23 +010057 CopyTensorContentsGeneric(pair.first, pair.second, copyFunc);
telsoa014fcda012018-03-09 14:13:49 +000058 }
59}
60
telsoa01c577f2c2018-08-31 09:22:23 +010061} //namespace armnn