6 #include <CommonTestUtils.hpp> 8 #include <GraphUtils.hpp> 10 #include <doctest/doctest.h> 14 TEST_CASE(
"ClImportEnabledFallbackToNeon")
16 using namespace armnn;
81 std::string ignoredErrorMessage;
83 runtime->LoadNetwork(netId, std::move(optNet), ignoredErrorMessage, networkProperties);
86 std::vector<float> inputValue0
88 1.0f, 1.0f, 2.0f, 2.0f, 2.0f, 3.0f, 4.0f, 4.0f, 5.0f, 5.0f, 6.0f, 6.0f, 1.0f, 1.0f, 2.0f, 2.0f
90 std::vector<float> inputValue1
92 0.0f, 1.0f, 1.0f, 2.0f, 3.0f, 3.0f, 3.0f, 4.0f, 4.0f, 5.0f, 5.0f, 6.0f, 0.0f, 1.0f, 1.0f, 2.0f
94 std::vector<float> inputData2
96 12.0f, 11.0f, 10.0f, 9.0f, 8.0f, 7.0f, 6.0f, 5.0f, 4.0f, 3.0f, 2.0f, 1.0f, 12.0f, 11.0f, 10.0f, 9.0f
99 std::vector<float> outputData(16);
101 std::vector<float> expectedOutput
103 11.0f, 9.0f, 7.0f, 5.0f, 3.0f, 1.0f, -1.0f, -3.0f, -5.0f, -7.0f, -9.0f, -11.0f, 11.0f, 9.0f, 7.0f, 5.0f
108 size_t totalBytes = numElements *
sizeof(float);
109 const size_t alignment = 64;
110 size_t space = totalBytes + alignment + alignment;
111 auto inputData0 = std::make_unique<uint8_t[]>(space);
112 void* alignedInputPtr0 = inputData0.get();
113 CHECK(std::align(alignment, totalBytes, alignedInputPtr0, space));
115 auto* intputPtr0 =
reinterpret_cast<float*
>(alignedInputPtr0);
116 std::copy(inputValue0.begin(), inputValue0.end(), intputPtr0);
118 auto inputData1 = std::make_unique<uint8_t[]>(space);
119 void* alignedInputPtr1 = inputData1.get();
120 CHECK(std::align(alignment, totalBytes, alignedInputPtr1, space));
122 auto* intputPtr1 =
reinterpret_cast<float*
>(alignedInputPtr1);
123 std::copy(inputValue1.begin(), inputValue1.end(), intputPtr1);
133 { 0,
armnn::Tensor(runtime->GetOutputTensorInfo(netId, 0), outputData.data()) }
136 runtime->GetProfiler(netId)->EnableProfiling(
true);
139 runtime->EnqueueWorkload(netId, inputTensors, outputTensors);
143 std::stringstream ss;
145 std::string dump = ss.str();
148 std::size_t found = dump.find(
"NeonSubtractionWorkload_Execute");
149 CHECK(found != std::string::npos);
152 found = dump.find(
"CopyMemGeneric");
153 CHECK(found != std::string::npos);
156 CHECK(outputData == expectedOutput);
158 runtime->UnloadNetwork(netId);
161 TEST_CASE(
"ClImportDisabledFallbackToNeon")
163 using namespace armnn;
227 runtime->LoadNetwork(netId, std::move(optNet));
230 std::vector<float> inputData0
232 1.0f, 1.0f, 2.0f, 2.0f, 2.0f, 3.0f, 4.0f, 4.0f, 5.0f, 5.0f, 6.0f, 6.0f
234 std::vector<float> inputData1
236 0.0f, 1.0f, 1.0f, 2.0f, 3.0f, 3.0f, 3.0f, 4.0f, 4.0f, 5.0f, 5.0f, 6.0f
238 std::vector<float> inputData2
240 12.0f, 11.0f, 10.0f, 9.0f, 8.0f, 7.0f, 6.0f, 5.0f, 4.0f, 3.0f, 2.0f, 1.0f
243 std::vector<float> outputData(12);
245 std::vector<float> expectedOutput
247 11.0f, 9.0f, 7.0f, 5.0f, 3.0f, 1.0f, -1.0f, -3.0f, -5.0f, -7.0f, -9.0f, -11.0f
258 { 0,
armnn::Tensor(runtime->GetOutputTensorInfo(netId, 0), outputData.data()) }
261 runtime->GetProfiler(netId)->EnableProfiling(
true);
264 runtime->EnqueueWorkload(netId, inputTensors, outputTensors);
268 std::stringstream ss;
270 std::string dump = ss.str();
273 std::size_t found = dump.find(
"NeonSubtractionWorkload_Execute");
274 CHECK(found != std::string::npos);
277 found = dump.find(
"CopyMemGeneric");
278 CHECK(found != std::string::npos);
281 CHECK(outputData == expectedOutput);
284 TEST_CASE(
"ClImportEnabledFallbackSubgraphToNeon")
286 using namespace armnn;
366 std::string ignoredErrorMessage;
368 runtime->LoadNetwork(netId, std::move(optNet), ignoredErrorMessage, networkProperties);
371 std::vector<float> inputValue0
373 1.0f, 1.0f, 2.0f, 2.0f, 2.0f, 3.0f, 4.0f, 4.0f, 5.0f, 5.0f, 6.0f, 6.0f, 1.0f, 1.0f, 2.0f, 2.0f
375 std::vector<float> inputValue1
377 0.0f, 1.0f, 1.0f, 2.0f, 3.0f, 3.0f, 3.0f, 4.0f, 4.0f, 5.0f, 5.0f, 6.0f, 0.0f, 1.0f, 1.0f, 2.0f
379 std::vector<float> inputData2
381 12.0f, 11.0f, 10.0f, 9.0f, 8.0f, 7.0f, 6.0f, 5.0f, 4.0f, 3.0f, 2.0f, 1.0f, 12.0f, 11.0f, 10.0f, 9.0f
384 std::vector<float> outputData(4);
386 std::vector<float> expectedOutput{ 11.0f, 3.0f, -5.0f, 11.0f };
389 size_t totalBytes = numElements *
sizeof(float);
390 const size_t alignment = 64;
391 size_t space = totalBytes + alignment + alignment;
392 auto inputData0 = std::make_unique<uint8_t[]>(space);
393 void* alignedInputPtr0 = inputData0.get();
394 CHECK(std::align(alignment, totalBytes, alignedInputPtr0, space));
396 auto* intputPtr0 =
reinterpret_cast<float*
>(alignedInputPtr0);
397 std::copy(inputValue0.begin(), inputValue0.end(), intputPtr0);
399 auto inputData1 = std::make_unique<uint8_t[]>(space);
400 void* alignedInputPtr1 = inputData1.get();
401 CHECK(std::align(alignment, totalBytes, alignedInputPtr1, space));
403 auto* intputPtr1 =
reinterpret_cast<float*
>(alignedInputPtr1);
404 std::copy(inputValue1.begin(), inputValue1.end(), intputPtr1);
414 { 0,
armnn::Tensor(runtime->GetOutputTensorInfo(netId, 0), outputData.data()) }
417 runtime->GetProfiler(netId)->EnableProfiling(
true);
420 runtime->EnqueueWorkload(netId, inputTensors, outputTensors);
424 std::stringstream ss;
426 std::string dump = ss.str();
429 std::size_t found = dump.find(
"NeonSubtractionWorkload_Execute");
430 CHECK(found != std::string::npos);
433 found = dump.find(
"ClPooling2dWorkload_Execute");
434 CHECK(found != std::string::npos);
437 found = dump.find(
"CopyMemGeneric");
438 CHECK(found != std::string::npos);
441 CHECK(outputData == expectedOutput);
443 runtime->UnloadNetwork(netId);
446 TEST_CASE(
"ClImportDisableFallbackSubgraphToNeon")
448 using namespace armnn;
523 runtime->LoadNetwork(netId, std::move(optNet));
526 std::vector<float> inputData0
528 1.0f, 1.0f, 2.0f, 2.0f, 2.0f, 3.0f, 4.0f, 4.0f, 5.0f, 5.0f, 6.0f, 6.0f
530 std::vector<float> inputData1
532 0.0f, 1.0f, 1.0f, 2.0f, 3.0f, 3.0f, 3.0f, 4.0f, 4.0f, 5.0f, 5.0f, 6.0f
534 std::vector<float> inputData2
536 12.0f, 11.0f, 10.0f, 9.0f, 8.0f, 7.0f, 6.0f, 5.0f, 4.0f, 3.0f, 2.0f, 1.0f
539 std::vector<float> outputData(2);
541 std::vector<float> expectedOutput{ 11.0f, -1.0f };
551 { 0,
armnn::Tensor(runtime->GetOutputTensorInfo(netId, 0), outputData.data()) }
554 runtime->GetProfiler(netId)->EnableProfiling(
true);
557 runtime->EnqueueWorkload(netId, inputTensors, outputTensors);
561 std::stringstream ss;
563 std::string dump = ss.str();
566 std::size_t found = dump.find(
"NeonSubtractionWorkload_Execute");
567 CHECK(found != std::string::npos);
570 found = dump.find(
"ClPooling2dWorkload_Execute");
571 CHECK(found != std::string::npos);
574 found = dump.find(
"CopyMemGeneric");
575 CHECK(found != std::string::npos);
578 CHECK(outputData == expectedOutput);
static IRuntimePtr Create(const CreationOptions &options)
Interface for a layer that is connectable to other layers via InputSlots and OutputSlots.
armnn::Layer * GetFirstLayerWithName(armnn::Graph &graph, const std::string &name)
static ProfilerManager & GetInstance()
bool CheckOrder(const armnn::Graph &graph, const armnn::Layer *first, const armnn::Layer *second)
Checks that first comes before second in the order.
virtual void BackendSelectionHint(Optional< BackendId > backend)=0
Provide a hint for the optimizer as to which backend to prefer for this layer.
uint32_t m_PoolWidth
Pooling width value.
std::unique_ptr< IRuntime, void(*)(IRuntime *runtime)> IRuntimePtr
void Print(std::ostream &outStream) const
Print stats for events in JSON Format to the given output stream.
std::vector< std::pair< LayerBindingId, class ConstTensor > > InputTensors
Copyright (c) 2021 ARM Limited and Contributors.
uint32_t m_StrideX
Stride value when proceeding through input for the width dimension.
virtual void SetTensorInfo(const TensorInfo &tensorInfo)=0
IProfiler * GetProfiler()
A tensor defined by a TensorInfo (shape and data type) and a mutable backing store.
uint32_t m_PoolHeight
Pooling height value.
IOptimizedNetworkPtr Optimize(const INetwork &network, const std::vector< BackendId > &backendPreferences, const IDeviceSpec &deviceSpec, const OptimizerOptions &options=OptimizerOptions(), Optional< std::vector< std::string > &> messages=EmptyOptional())
Create an optimized version of the network.
A tensor defined by a TensorInfo (shape and data type) and an immutable backing store.
std::vector< std::pair< LayerBindingId, class Tensor > > OutputTensors
LayerType GetType() const override
Returns the armnn::LayerType of this layer.
std::unique_ptr< IOptimizedNetwork, void(*)(IOptimizedNetwork *network)> IOptimizedNetworkPtr
GPU Execution: OpenCL: ArmCompute.
ArmNN performs an optimization on each model/network before it gets loaded for execution.
const BackendId & GetBackendId() const
Graph & GetGraphForTesting(IOptimizedNetwork *optNet)
CPU Execution: NEON: ArmCompute.
virtual const IInputSlot & GetInputSlot(unsigned int index) const =0
Get a const input slot handle by slot index.
void SetConstant(const bool IsConstant=true)
Marks the data corresponding to this tensor info as constant.
virtual const IOutputSlot & GetOutputSlot(unsigned int index) const =0
Get the const output slot handle by slot index.
std::unique_ptr< INetwork, void(*)(INetwork *network)> INetworkPtr
virtual int Connect(IInputSlot &destination)=0
A Pooling2dDescriptor for the Pooling2dLayer.
static INetworkPtr Create(NetworkOptions networkOptions={})
uint32_t m_StrideY
Stride value when proceeding through input for the height dimension.
unsigned int GetNumElements() const