ArmNN
 20.02
MemCopyTestImpl.hpp
Go to the documentation of this file.
1 //
2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 #pragma once
6 
7 #include <ResolveType.hpp>
8 
10 
15 
16 #include <test/TensorHelpers.hpp>
17 
18 #include <boost/multi_array.hpp>
19 
20 namespace
21 {
22 
23 template<armnn::DataType dataType, typename T = armnn::ResolveType<dataType>>
24 LayerTestResult<T, 4> MemCopyTest(armnn::IWorkloadFactory& srcWorkloadFactory,
25  armnn::IWorkloadFactory& dstWorkloadFactory,
26  bool withSubtensors)
27 {
28  const std::array<unsigned int, 4> shapeData = { { 1u, 1u, 6u, 5u } };
29  const armnn::TensorShape tensorShape(4, shapeData.data());
30  const armnn::TensorInfo tensorInfo(tensorShape, dataType);
31  boost::multi_array<T, 4> inputData = MakeTensor<T, 4>(tensorInfo, std::vector<T>(
32  {
33  1, 2, 3, 4, 5,
34  6, 7, 8, 9, 10,
35  11, 12, 13, 14, 15,
36  16, 17, 18, 19, 20,
37  21, 22, 23, 24, 25,
38  26, 27, 28, 29, 30,
39  })
40  );
41 
42  LayerTestResult<T, 4> ret(tensorInfo);
43  ret.outputExpected = inputData;
44 
45  boost::multi_array<T, 4> outputData(shapeData);
46 
47  auto inputTensorHandle = srcWorkloadFactory.CreateTensorHandle(tensorInfo);
48  auto outputTensorHandle = dstWorkloadFactory.CreateTensorHandle(tensorInfo);
49 
50  AllocateAndCopyDataToITensorHandle(inputTensorHandle.get(), inputData.data());
51  outputTensorHandle->Allocate();
52 
53  armnn::MemCopyQueueDescriptor memCopyQueueDesc;
54  armnn::WorkloadInfo workloadInfo;
55 
56  const unsigned int origin[4] = {};
57 
58  auto workloadInput = (withSubtensors && srcWorkloadFactory.SupportsSubTensors())
59  ? srcWorkloadFactory.CreateSubTensorHandle(*inputTensorHandle, tensorShape, origin)
60  : std::move(inputTensorHandle);
61  auto workloadOutput = (withSubtensors && dstWorkloadFactory.SupportsSubTensors())
62  ? dstWorkloadFactory.CreateSubTensorHandle(*outputTensorHandle, tensorShape, origin)
63  : std::move(outputTensorHandle);
64 
65  AddInputToWorkload(memCopyQueueDesc, workloadInfo, tensorInfo, workloadInput.get());
66  AddOutputToWorkload(memCopyQueueDesc, workloadInfo, tensorInfo, workloadOutput.get());
67 
68  dstWorkloadFactory.CreateMemCopy(memCopyQueueDesc, workloadInfo)->Execute();
69 
70  CopyDataFromITensorHandle(outputData.data(), workloadOutput.get());
71  ret.output = outputData;
72 
73  return ret;
74 }
75 
76 template<typename SrcWorkloadFactory,
77  typename DstWorkloadFactory,
78  armnn::DataType dataType,
79  typename T = armnn::ResolveType<dataType>>
80 LayerTestResult<T, 4> MemCopyTest(bool withSubtensors)
81 {
83  WorkloadFactoryHelper<SrcWorkloadFactory>::GetMemoryManager();
84 
86  WorkloadFactoryHelper<DstWorkloadFactory>::GetMemoryManager();
87 
88  SrcWorkloadFactory srcWorkloadFactory = WorkloadFactoryHelper<SrcWorkloadFactory>::GetFactory(srcMemoryManager);
89  DstWorkloadFactory dstWorkloadFactory = WorkloadFactoryHelper<DstWorkloadFactory>::GetFactory(dstMemoryManager);
90 
91  return MemCopyTest<dataType>(srcWorkloadFactory, dstWorkloadFactory, withSubtensors);
92 }
93 
94 } // anonymous namespace
virtual std::unique_ptr< IWorkload > CreateMemCopy(const MemCopyQueueDescriptor &descriptor, const WorkloadInfo &info) const
virtual std::unique_ptr< ITensorHandle > CreateSubTensorHandle(ITensorHandle &parent, TensorShape const &subTensorShape, unsigned int const *subTensorOrigin) const =0
typename ResolveTypeImpl< DT >::Type ResolveType
Definition: ResolveType.hpp:73
DataType
Definition: Types.hpp:32
std::shared_ptr< IMemoryManager > IMemoryManagerSharedPtr
void AllocateAndCopyDataToITensorHandle(armnn::ITensorHandle *tensorHandle, const void *memory)
void CopyDataFromITensorHandle(void *memory, const armnn::ITensorHandle *tensorHandle)
virtual std::unique_ptr< ITensorHandle > CreateTensorHandle(const TensorInfo &tensorInfo, const bool IsMemoryManaged=true) const =0
Contains information about inputs and outputs to a layer.
virtual bool SupportsSubTensors() const =0