blob: 4424f9b0ad8eb85cd17890f3fdc65c7a79df2d00 [file] [log] [blame]
Ferran Balaguerd7c8eb92019-07-01 13:37:44 +01001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#include "../../1.2/ArmnnDriverImpl.hpp"
7
8#include "Utils.h"
9
10#include <boost/test/unit_test.hpp>
11#include <boost/core/ignore_unused.hpp>
12
13#include <sys/system_properties.h>
14
15#include <cfloat>
16
17using namespace std;
18
19struct CapabilitiesFixture
20{
21 CapabilitiesFixture()
22 {
Ferran Balaguer3892a362019-07-25 13:47:52 +010023 // CleanUp before the execution of each test
24 CleanUp();
25 }
26
27 ~CapabilitiesFixture()
28 {
29 // CleanUp after the execution of each test
30 CleanUp();
31 }
32
33 void CleanUp()
34 {
Ferran Balaguerd7c8eb92019-07-01 13:37:44 +010035 const char* nullStr = "";
36
37 __system_property_set("Armnn.operandTypeTensorFloat32Performance.execTime", nullStr);
38 __system_property_set("Armnn.operandTypeTensorFloat32Performance.powerUsage", nullStr);
39 __system_property_set("Armnn.operandTypeFloat32Performance.execTime", nullStr);
40 __system_property_set("Armnn.operandTypeFloat32Performance.powerUsage", nullStr);
41 __system_property_set("Armnn.operandTypeTensorFloat16Performance.execTime", nullStr);
42 __system_property_set("Armnn.operandTypeTensorFloat16Performance.powerUsage", nullStr);
43 __system_property_set("Armnn.operandTypeFloat16Performance.execTime", nullStr);
44 __system_property_set("Armnn.operandTypeFloat16Performance.powerUsage", nullStr);
45 __system_property_set("Armnn.operandTypeTensorQuant8AsymmPerformance.execTime", nullStr);
46 __system_property_set("Armnn.operandTypeTensorQuant8AsymmPerformance.powerUsage", nullStr);
47 __system_property_set("Armnn.operandTypeTensorQuant16SymmPerformance.execTime", nullStr);
48 __system_property_set("Armnn.operandTypeTensorQuant16SymmPerformance.powerUsage", nullStr);
49 __system_property_set("Armnn.operandTypeTensorInt32Performance.execTime", nullStr);
50 __system_property_set("Armnn.operandTypeTensorInt32Performance.powerUsage", nullStr);
51 __system_property_set("Armnn.operandTypeInt32Performance.execTime", nullStr);
52 __system_property_set("Armnn.operandTypeInt32Performance.powerUsage", nullStr);
53 }
Ferran Balaguerd7c8eb92019-07-01 13:37:44 +010054};
55
56void CheckOperandType(const V1_2::Capabilities& capabilities, OperandType type, float execTime, float powerUsage)
57{
58 PerformanceInfo perfInfo = android::nn::lookup(capabilities.operandPerformance, type);
59 BOOST_ASSERT(perfInfo.execTime == execTime);
60 BOOST_ASSERT(perfInfo.powerUsage == powerUsage);
61}
62
Ferran Balaguer3892a362019-07-25 13:47:52 +010063BOOST_FIXTURE_TEST_SUITE(CapabilitiesTests, CapabilitiesFixture)
Ferran Balaguerd7c8eb92019-07-01 13:37:44 +010064
65BOOST_AUTO_TEST_CASE(PerformanceCapabilitiesWithRuntime)
66{
67 using namespace armnn_driver::hal_1_2;
68 using namespace android::nn;
69
70 auto getCapabilitiesFn = [&](ErrorStatus error, const V1_2::Capabilities& capabilities)
71 {
72 CheckOperandType(capabilities, OperandType::TENSOR_FLOAT32, 2.0f, 2.1f);
73 CheckOperandType(capabilities, OperandType::FLOAT32, 2.2f, 2.3f);
74 CheckOperandType(capabilities, OperandType::TENSOR_FLOAT16, 2.4f, 2.5f);
75 CheckOperandType(capabilities, OperandType::FLOAT16, 2.6f, 2.7f);
76 CheckOperandType(capabilities, OperandType::TENSOR_QUANT8_ASYMM, 2.8f, 2.9f);
77 CheckOperandType(capabilities, OperandType::TENSOR_QUANT16_SYMM, 3.0f, 3.1f);
78 CheckOperandType(capabilities, OperandType::TENSOR_INT32, 3.2f, 3.3f);
79 CheckOperandType(capabilities, OperandType::INT32, 3.4f, 3.5f);
80
81 // Unsupported operands take FLT_MAX value
82 CheckOperandType(capabilities, OperandType::UINT32, FLT_MAX, FLT_MAX);
83 CheckOperandType(capabilities, OperandType::BOOL, FLT_MAX, FLT_MAX);
84 CheckOperandType(capabilities, OperandType::TENSOR_QUANT8_SYMM, FLT_MAX, FLT_MAX);
85 CheckOperandType(capabilities, OperandType::TENSOR_QUANT16_ASYMM, FLT_MAX, FLT_MAX);
86 CheckOperandType(capabilities, OperandType::TENSOR_BOOL8, FLT_MAX, FLT_MAX);
87 CheckOperandType(capabilities, OperandType::TENSOR_QUANT8_SYMM_PER_CHANNEL, FLT_MAX, FLT_MAX);
88 CheckOperandType(capabilities, OperandType::OEM, FLT_MAX, FLT_MAX);
89 CheckOperandType(capabilities, OperandType::TENSOR_OEM_BYTE, FLT_MAX, FLT_MAX);
90
91 BOOST_ASSERT(error == ErrorStatus::NONE);
92 };
93
94 __system_property_set("Armnn.operandTypeTensorFloat32Performance.execTime", "2.0f");
95 __system_property_set("Armnn.operandTypeTensorFloat32Performance.powerUsage", "2.1f");
96 __system_property_set("Armnn.operandTypeFloat32Performance.execTime", "2.2f");
97 __system_property_set("Armnn.operandTypeFloat32Performance.powerUsage", "2.3f");
98 __system_property_set("Armnn.operandTypeTensorFloat16Performance.execTime", "2.4f");
99 __system_property_set("Armnn.operandTypeTensorFloat16Performance.powerUsage", "2.5f");
100 __system_property_set("Armnn.operandTypeFloat16Performance.execTime", "2.6f");
101 __system_property_set("Armnn.operandTypeFloat16Performance.powerUsage", "2.7f");
102 __system_property_set("Armnn.operandTypeTensorQuant8AsymmPerformance.execTime", "2.8f");
103 __system_property_set("Armnn.operandTypeTensorQuant8AsymmPerformance.powerUsage", "2.9f");
104 __system_property_set("Armnn.operandTypeTensorQuant16SymmPerformance.execTime", "3.0f");
105 __system_property_set("Armnn.operandTypeTensorQuant16SymmPerformance.powerUsage", "3.1f");
106 __system_property_set("Armnn.operandTypeTensorInt32Performance.execTime", "3.2f");
107 __system_property_set("Armnn.operandTypeTensorInt32Performance.powerUsage", "3.3f");
108 __system_property_set("Armnn.operandTypeInt32Performance.execTime", "3.4f");
109 __system_property_set("Armnn.operandTypeInt32Performance.powerUsage", "3.5f");
110
111 armnn::IRuntime::CreationOptions options;
112 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
113
114 ArmnnDriverImpl::getCapabilities_1_2(runtime, getCapabilitiesFn);
115}
116
117BOOST_AUTO_TEST_CASE(PerformanceCapabilitiesUndefined)
118{
119 using namespace armnn_driver::hal_1_2;
120 using namespace android::nn;
121
122 float defaultValue = .1f;
123
124 auto getCapabilitiesFn = [&](ErrorStatus error, const V1_2::Capabilities& capabilities)
125 {
126 CheckOperandType(capabilities, OperandType::TENSOR_FLOAT32, defaultValue, defaultValue);
127 CheckOperandType(capabilities, OperandType::FLOAT32, defaultValue, defaultValue);
128 CheckOperandType(capabilities, OperandType::TENSOR_FLOAT16, defaultValue, defaultValue);
129 CheckOperandType(capabilities, OperandType::FLOAT16, defaultValue, defaultValue);
130 CheckOperandType(capabilities, OperandType::TENSOR_QUANT8_ASYMM, defaultValue, defaultValue);
131 CheckOperandType(capabilities, OperandType::TENSOR_QUANT16_SYMM, defaultValue, defaultValue);
132 CheckOperandType(capabilities, OperandType::TENSOR_INT32, defaultValue, defaultValue);
133 CheckOperandType(capabilities, OperandType::INT32, defaultValue, defaultValue);
134
135 // Unsupported operands take FLT_MAX value
136 CheckOperandType(capabilities, OperandType::UINT32, FLT_MAX, FLT_MAX);
137 CheckOperandType(capabilities, OperandType::BOOL, FLT_MAX, FLT_MAX);
138 CheckOperandType(capabilities, OperandType::TENSOR_QUANT8_SYMM, FLT_MAX, FLT_MAX);
139 CheckOperandType(capabilities, OperandType::TENSOR_QUANT16_ASYMM, FLT_MAX, FLT_MAX);
140 CheckOperandType(capabilities, OperandType::TENSOR_BOOL8, FLT_MAX, FLT_MAX);
141 CheckOperandType(capabilities, OperandType::TENSOR_QUANT8_SYMM_PER_CHANNEL, FLT_MAX, FLT_MAX);
142 CheckOperandType(capabilities, OperandType::OEM, FLT_MAX, FLT_MAX);
143 CheckOperandType(capabilities, OperandType::TENSOR_OEM_BYTE, FLT_MAX, FLT_MAX);
144
145 BOOST_ASSERT(error == ErrorStatus::NONE);
146 };
147
148 armnn::IRuntime::CreationOptions options;
149 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
150
151 ArmnnDriverImpl::getCapabilities_1_2(runtime, getCapabilitiesFn);
152}
153
154BOOST_AUTO_TEST_SUITE_END()