blob: dcda9bfd07b96d4d844f75e89eba0dbe8bf2f23b [file] [log] [blame]
Aron Virginas-Tar70104002018-10-24 15:33:28 +01001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
Aron Virginas-Tar56055192018-11-12 18:10:43 +00006#include "NeonWorkloadFactoryHelper.hpp"
7
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +00008#include <Graph.hpp>
9#include <Network.hpp>
Aron Virginas-Tar70104002018-10-24 15:33:28 +010010
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000011#include <neon/NeonWorkloadFactory.hpp>
Aron Virginas-Tar70104002018-10-24 15:33:28 +010012
Sadik Armagan1625efc2021-06-10 18:24:34 +010013#include <doctest/doctest.h>
Aron Virginas-Tar70104002018-10-24 15:33:28 +010014
Sadik Armagan1625efc2021-06-10 18:24:34 +010015TEST_SUITE("NeonOptimizedNetwork")
16{
17TEST_CASE("OptimizeValidateCpuAccDeviceSupportLayerNoFallback")
Aron Virginas-Tar70104002018-10-24 15:33:28 +010018{
19 // build up the structure of the network
20 armnn::INetworkPtr net(armnn::INetwork::Create());
21
22 armnn::IConnectableLayer* input = net->AddInputLayer(0);
23 armnn::IConnectableLayer* output = net->AddOutputLayer(0);
24
25 input->GetOutputSlot(0).Connect(output->GetInputSlot(0));
26 input->GetOutputSlot(0).SetTensorInfo(armnn::TensorInfo({ 1, 1, 4, 4 }, armnn::DataType::Float32));
27
28 armnn::IRuntime::CreationOptions options;
29 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
30
31 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc };
32 armnn::IOptimizedNetworkPtr optNet = armnn::Optimize(*net, backends, runtime->GetDeviceSpec());
Sadik Armagan1625efc2021-06-10 18:24:34 +010033 CHECK(optNet);
Aron Virginas-Tar70104002018-10-24 15:33:28 +010034 // validate workloads
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000035 armnn::NeonWorkloadFactory fact =
36 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
37
Francis Murtagh3d2b4b22021-02-15 18:23:17 +000038 armnn::Graph& graph = GetGraphForTesting(optNet.get());
39 for (auto&& layer : graph)
Aron Virginas-Tar70104002018-10-24 15:33:28 +010040 {
Sadik Armagan1625efc2021-06-10 18:24:34 +010041 CHECK(layer->GetBackendId() == armnn::Compute::CpuAcc);
42 CHECK_NOTHROW(
Derek Lamberti94a88d22019-12-10 21:12:59 +000043 layer->CreateWorkload(fact));
Aron Virginas-Tar70104002018-10-24 15:33:28 +010044 }
45}
46
Sadik Armagan1625efc2021-06-10 18:24:34 +010047TEST_CASE("OptimizeValidateDeviceNonSupportLayerNoFallback")
Aron Virginas-Tar70104002018-10-24 15:33:28 +010048{
49 // build up the structure of the network
50 armnn::INetworkPtr net(armnn::INetwork::Create());
51
52 armnn::IConnectableLayer* input = net->AddInputLayer(0);
53
54 // This layer configuration isn't supported by CpuAcc and isn't allowed to fall back, so Optimize will return null.
55 armnn::NormalizationDescriptor descriptor;
56 armnn::IConnectableLayer* normalize = net->AddNormalizationLayer(descriptor);
57
58 armnn::IConnectableLayer* output = net->AddOutputLayer(0);
59
60 input->GetOutputSlot(0).Connect(normalize->GetInputSlot(0));
61 normalize->GetOutputSlot(0).Connect(output->GetInputSlot(0));
62
63 input->GetOutputSlot(0).SetTensorInfo(armnn::TensorInfo({ 1, 1, 4, 4 }, armnn::DataType::Float32));
64 normalize->GetOutputSlot(0).SetTensorInfo(armnn::TensorInfo({ 1, 1, 4, 4 }, armnn::DataType::Float32));
65
66 armnn::IRuntime::CreationOptions options;
67 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
68
69 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc };
Mike Kelly3a613cc2020-09-29 20:50:35 +010070 std::vector<std::string> errMessages;
71
72 try
73 {
74 Optimize(*net, backends, runtime->GetDeviceSpec(), armnn::OptimizerOptions(), errMessages);
Sadik Armagan1625efc2021-06-10 18:24:34 +010075 FAIL("Should have thrown an exception.");
Mike Kelly3a613cc2020-09-29 20:50:35 +010076 }
77 catch (const armnn::InvalidArgumentException& e)
78 {
79 // Different exceptions are thrown on different backends
80 }
Sadik Armagan1625efc2021-06-10 18:24:34 +010081 CHECK(errMessages.size() > 0);
Aron Virginas-Tar70104002018-10-24 15:33:28 +010082}
83
Sadik Armagan1625efc2021-06-10 18:24:34 +010084TEST_CASE("FastMathEnabledTestOnCpuAcc")
Sadik Armagan045f6be2020-09-10 13:37:32 +010085{
86 armnn::INetworkPtr net(armnn::INetwork::Create());
87
88 armnn::IConnectableLayer* input = net->AddInputLayer(0);
89 armnn::IConnectableLayer* output = net->AddOutputLayer(0);
90
91 input->GetOutputSlot(0).Connect(output->GetInputSlot(0));
92 input->GetOutputSlot(0).SetTensorInfo(armnn::TensorInfo({ 1, 1, 4, 4 }, armnn::DataType::Float32));
93
94 armnn::IRuntime::CreationOptions options;
95 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
96
97 std::vector<armnn::BackendId> backends = {armnn::Compute::CpuAcc};
98 armnn::OptimizerOptions optimizerOptions;
99 armnn::BackendOptions modelOptions("CpuAcc", {{"FastMathEnabled", true}});
100 optimizerOptions.m_ModelOptions.push_back(modelOptions);
101
102 armnn::IOptimizedNetworkPtr optimizedNet = armnn::Optimize(
103 *net, backends, runtime->GetDeviceSpec(), optimizerOptions);
104
Sadik Armagan1625efc2021-06-10 18:24:34 +0100105 CHECK(optimizedNet);
Sadik Armagan045f6be2020-09-10 13:37:32 +0100106
Francis Murtagh3d2b4b22021-02-15 18:23:17 +0000107 auto modelOptionsOut = GetModelOptionsForTesting(optimizedNet.get());
Sadik Armagan045f6be2020-09-10 13:37:32 +0100108
Colm Donelan03bf98a2022-05-30 15:20:36 +0100109 CHECK(modelOptionsOut.size() == 2); // FastMathEnabled and the Global to hold the import export values.
Sadik Armagan1625efc2021-06-10 18:24:34 +0100110 CHECK(modelOptionsOut[0].GetOption(0).GetName() == "FastMathEnabled");
111 CHECK(modelOptionsOut[0].GetOption(0).GetValue().AsBool() == true);
Sadik Armagan045f6be2020-09-10 13:37:32 +0100112}
113
Sadik Armagan1625efc2021-06-10 18:24:34 +0100114TEST_CASE("NumberOfThreadsTestOnCpuAcc")
Matthew Sloyan0a7dc6b2021-02-10 16:50:53 +0000115{
116 armnn::INetworkPtr net(armnn::INetwork::Create());
117
118 armnn::IConnectableLayer* input = net->AddInputLayer(0);
119 armnn::IConnectableLayer* output = net->AddOutputLayer(0);
120
121 input->GetOutputSlot(0).Connect(output->GetInputSlot(0));
122 input->GetOutputSlot(0).SetTensorInfo(armnn::TensorInfo({ 1, 1, 4, 4 }, armnn::DataType::Float32));
123
124 armnn::IRuntime::CreationOptions options;
125 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
126
127 unsigned int numberOfThreads = 2;
128
129 std::vector<armnn::BackendId> backends = {armnn::Compute::CpuAcc};
130 armnn::OptimizerOptions optimizerOptions;
131 armnn::BackendOptions modelOptions("CpuAcc", {{"NumberOfThreads", numberOfThreads}});
132 optimizerOptions.m_ModelOptions.push_back(modelOptions);
133
134 armnn::IOptimizedNetworkPtr optimizedNet = armnn::Optimize(
135 *net, backends, runtime->GetDeviceSpec(), optimizerOptions);
136
Sadik Armagan1625efc2021-06-10 18:24:34 +0100137 CHECK(optimizedNet);
Francis Murtagh3d2b4b22021-02-15 18:23:17 +0000138 std::unique_ptr<armnn::Graph> graphPtr;
139 armnn::OptimizedNetworkImpl impl(std::move(graphPtr), optimizerOptions.m_ModelOptions);
Matthew Sloyan0a7dc6b2021-02-10 16:50:53 +0000140
Francis Murtagh3d2b4b22021-02-15 18:23:17 +0000141 auto modelOptionsOut = impl.GetModelOptions();
Matthew Sloyan0a7dc6b2021-02-10 16:50:53 +0000142
Sadik Armagan1625efc2021-06-10 18:24:34 +0100143 CHECK(modelOptionsOut.size() == 1);
144 CHECK(modelOptionsOut[0].GetOption(0).GetName() == "NumberOfThreads");
145 CHECK(modelOptionsOut[0].GetOption(0).GetValue().AsUnsignedInt() == numberOfThreads);
Matthew Sloyan0a7dc6b2021-02-10 16:50:53 +0000146}
147
Sadik Armagan1625efc2021-06-10 18:24:34 +0100148}