blob: 4b700b034c7379ae032849170a3c11b82516f00b [file] [log] [blame]
Aron Virginas-Tar70104002018-10-24 15:33:28 +01001//
John Mcloughlinc5ee0d72023-03-24 12:07:25 +00002// Copyright © 2017, 2023 Arm Ltd. All rights reserved.
Aron Virginas-Tar70104002018-10-24 15:33:28 +01003// 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 {
John Mcloughlinc5ee0d72023-03-24 12:07:25 +000074 Optimize(*net, backends, runtime->GetDeviceSpec(),
75 armnn::OptimizerOptionsOpaque(), errMessages);
Sadik Armagan1625efc2021-06-10 18:24:34 +010076 FAIL("Should have thrown an exception.");
Mike Kelly3a613cc2020-09-29 20:50:35 +010077 }
78 catch (const armnn::InvalidArgumentException& e)
79 {
80 // Different exceptions are thrown on different backends
81 }
Sadik Armagan1625efc2021-06-10 18:24:34 +010082 CHECK(errMessages.size() > 0);
Aron Virginas-Tar70104002018-10-24 15:33:28 +010083}
84
Sadik Armagan1625efc2021-06-10 18:24:34 +010085TEST_CASE("FastMathEnabledTestOnCpuAcc")
Sadik Armagan045f6be2020-09-10 13:37:32 +010086{
87 armnn::INetworkPtr net(armnn::INetwork::Create());
88
89 armnn::IConnectableLayer* input = net->AddInputLayer(0);
90 armnn::IConnectableLayer* output = net->AddOutputLayer(0);
91
92 input->GetOutputSlot(0).Connect(output->GetInputSlot(0));
93 input->GetOutputSlot(0).SetTensorInfo(armnn::TensorInfo({ 1, 1, 4, 4 }, armnn::DataType::Float32));
94
95 armnn::IRuntime::CreationOptions options;
96 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
97
98 std::vector<armnn::BackendId> backends = {armnn::Compute::CpuAcc};
John Mcloughlinc5ee0d72023-03-24 12:07:25 +000099 armnn::OptimizerOptionsOpaque optimizerOptions;
Sadik Armagan045f6be2020-09-10 13:37:32 +0100100 armnn::BackendOptions modelOptions("CpuAcc", {{"FastMathEnabled", true}});
John Mcloughlinc5ee0d72023-03-24 12:07:25 +0000101 optimizerOptions.AddModelOption(modelOptions);
Sadik Armagan045f6be2020-09-10 13:37:32 +0100102
103 armnn::IOptimizedNetworkPtr optimizedNet = armnn::Optimize(
104 *net, backends, runtime->GetDeviceSpec(), optimizerOptions);
105
Sadik Armagan1625efc2021-06-10 18:24:34 +0100106 CHECK(optimizedNet);
Sadik Armagan045f6be2020-09-10 13:37:32 +0100107
Francis Murtagh3d2b4b22021-02-15 18:23:17 +0000108 auto modelOptionsOut = GetModelOptionsForTesting(optimizedNet.get());
Sadik Armagan045f6be2020-09-10 13:37:32 +0100109
Francis Murtagh626bd902022-06-21 13:16:23 +0000110 CHECK(modelOptionsOut.size() == 2); // FastMathEnabled and the Global to hold the import export values.
Sadik Armagan1625efc2021-06-10 18:24:34 +0100111 CHECK(modelOptionsOut[0].GetOption(0).GetName() == "FastMathEnabled");
112 CHECK(modelOptionsOut[0].GetOption(0).GetValue().AsBool() == true);
Sadik Armagan045f6be2020-09-10 13:37:32 +0100113}
114
Sadik Armagan1625efc2021-06-10 18:24:34 +0100115TEST_CASE("NumberOfThreadsTestOnCpuAcc")
Matthew Sloyan0a7dc6b2021-02-10 16:50:53 +0000116{
117 armnn::INetworkPtr net(armnn::INetwork::Create());
118
119 armnn::IConnectableLayer* input = net->AddInputLayer(0);
120 armnn::IConnectableLayer* output = net->AddOutputLayer(0);
121
122 input->GetOutputSlot(0).Connect(output->GetInputSlot(0));
123 input->GetOutputSlot(0).SetTensorInfo(armnn::TensorInfo({ 1, 1, 4, 4 }, armnn::DataType::Float32));
124
125 armnn::IRuntime::CreationOptions options;
126 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
127
128 unsigned int numberOfThreads = 2;
129
130 std::vector<armnn::BackendId> backends = {armnn::Compute::CpuAcc};
John Mcloughlinc5ee0d72023-03-24 12:07:25 +0000131 armnn::OptimizerOptionsOpaque optimizerOptions;
Matthew Sloyan0a7dc6b2021-02-10 16:50:53 +0000132 armnn::BackendOptions modelOptions("CpuAcc", {{"NumberOfThreads", numberOfThreads}});
John Mcloughlinc5ee0d72023-03-24 12:07:25 +0000133 optimizerOptions.AddModelOption(modelOptions);
Matthew Sloyan0a7dc6b2021-02-10 16:50:53 +0000134
135 armnn::IOptimizedNetworkPtr optimizedNet = armnn::Optimize(
136 *net, backends, runtime->GetDeviceSpec(), optimizerOptions);
137
Sadik Armagan1625efc2021-06-10 18:24:34 +0100138 CHECK(optimizedNet);
Francis Murtagh3d2b4b22021-02-15 18:23:17 +0000139 std::unique_ptr<armnn::Graph> graphPtr;
John Mcloughlinc5ee0d72023-03-24 12:07:25 +0000140 armnn::OptimizedNetworkImpl impl(std::move(graphPtr), optimizerOptions.GetModelOptions());
Matthew Sloyan0a7dc6b2021-02-10 16:50:53 +0000141
Francis Murtagh3d2b4b22021-02-15 18:23:17 +0000142 auto modelOptionsOut = impl.GetModelOptions();
Matthew Sloyan0a7dc6b2021-02-10 16:50:53 +0000143
Sadik Armagan1625efc2021-06-10 18:24:34 +0100144 CHECK(modelOptionsOut.size() == 1);
145 CHECK(modelOptionsOut[0].GetOption(0).GetName() == "NumberOfThreads");
146 CHECK(modelOptionsOut[0].GetOption(0).GetValue().AsUnsignedInt() == numberOfThreads);
Matthew Sloyan0a7dc6b2021-02-10 16:50:53 +0000147}
148
Sadik Armagan1625efc2021-06-10 18:24:34 +0100149}