blob: f41428667c2b91c0c9b96da9f2546840e35296d7 [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 {
23 const char* nullStr = "";
24
25 __system_property_set("Armnn.operandTypeTensorFloat32Performance.execTime", nullStr);
26 __system_property_set("Armnn.operandTypeTensorFloat32Performance.powerUsage", nullStr);
27 __system_property_set("Armnn.operandTypeFloat32Performance.execTime", nullStr);
28 __system_property_set("Armnn.operandTypeFloat32Performance.powerUsage", nullStr);
29 __system_property_set("Armnn.operandTypeTensorFloat16Performance.execTime", nullStr);
30 __system_property_set("Armnn.operandTypeTensorFloat16Performance.powerUsage", nullStr);
31 __system_property_set("Armnn.operandTypeFloat16Performance.execTime", nullStr);
32 __system_property_set("Armnn.operandTypeFloat16Performance.powerUsage", nullStr);
33 __system_property_set("Armnn.operandTypeTensorQuant8AsymmPerformance.execTime", nullStr);
34 __system_property_set("Armnn.operandTypeTensorQuant8AsymmPerformance.powerUsage", nullStr);
35 __system_property_set("Armnn.operandTypeTensorQuant16SymmPerformance.execTime", nullStr);
36 __system_property_set("Armnn.operandTypeTensorQuant16SymmPerformance.powerUsage", nullStr);
37 __system_property_set("Armnn.operandTypeTensorInt32Performance.execTime", nullStr);
38 __system_property_set("Armnn.operandTypeTensorInt32Performance.powerUsage", nullStr);
39 __system_property_set("Armnn.operandTypeInt32Performance.execTime", nullStr);
40 __system_property_set("Armnn.operandTypeInt32Performance.powerUsage", nullStr);
41 }
42
43 ~CapabilitiesFixture(){}
44};
45
46void CheckOperandType(const V1_2::Capabilities& capabilities, OperandType type, float execTime, float powerUsage)
47{
48 PerformanceInfo perfInfo = android::nn::lookup(capabilities.operandPerformance, type);
49 BOOST_ASSERT(perfInfo.execTime == execTime);
50 BOOST_ASSERT(perfInfo.powerUsage == powerUsage);
51}
52
53BOOST_AUTO_TEST_SUITE(CapabilitiesTests)
54
55BOOST_AUTO_TEST_CASE(PerformanceCapabilitiesWithRuntime)
56{
57 using namespace armnn_driver::hal_1_2;
58 using namespace android::nn;
59
60 auto getCapabilitiesFn = [&](ErrorStatus error, const V1_2::Capabilities& capabilities)
61 {
62 CheckOperandType(capabilities, OperandType::TENSOR_FLOAT32, 2.0f, 2.1f);
63 CheckOperandType(capabilities, OperandType::FLOAT32, 2.2f, 2.3f);
64 CheckOperandType(capabilities, OperandType::TENSOR_FLOAT16, 2.4f, 2.5f);
65 CheckOperandType(capabilities, OperandType::FLOAT16, 2.6f, 2.7f);
66 CheckOperandType(capabilities, OperandType::TENSOR_QUANT8_ASYMM, 2.8f, 2.9f);
67 CheckOperandType(capabilities, OperandType::TENSOR_QUANT16_SYMM, 3.0f, 3.1f);
68 CheckOperandType(capabilities, OperandType::TENSOR_INT32, 3.2f, 3.3f);
69 CheckOperandType(capabilities, OperandType::INT32, 3.4f, 3.5f);
70
71 // Unsupported operands take FLT_MAX value
72 CheckOperandType(capabilities, OperandType::UINT32, FLT_MAX, FLT_MAX);
73 CheckOperandType(capabilities, OperandType::BOOL, FLT_MAX, FLT_MAX);
74 CheckOperandType(capabilities, OperandType::TENSOR_QUANT8_SYMM, FLT_MAX, FLT_MAX);
75 CheckOperandType(capabilities, OperandType::TENSOR_QUANT16_ASYMM, FLT_MAX, FLT_MAX);
76 CheckOperandType(capabilities, OperandType::TENSOR_BOOL8, FLT_MAX, FLT_MAX);
77 CheckOperandType(capabilities, OperandType::TENSOR_QUANT8_SYMM_PER_CHANNEL, FLT_MAX, FLT_MAX);
78 CheckOperandType(capabilities, OperandType::OEM, FLT_MAX, FLT_MAX);
79 CheckOperandType(capabilities, OperandType::TENSOR_OEM_BYTE, FLT_MAX, FLT_MAX);
80
81 BOOST_ASSERT(error == ErrorStatus::NONE);
82 };
83
84 __system_property_set("Armnn.operandTypeTensorFloat32Performance.execTime", "2.0f");
85 __system_property_set("Armnn.operandTypeTensorFloat32Performance.powerUsage", "2.1f");
86 __system_property_set("Armnn.operandTypeFloat32Performance.execTime", "2.2f");
87 __system_property_set("Armnn.operandTypeFloat32Performance.powerUsage", "2.3f");
88 __system_property_set("Armnn.operandTypeTensorFloat16Performance.execTime", "2.4f");
89 __system_property_set("Armnn.operandTypeTensorFloat16Performance.powerUsage", "2.5f");
90 __system_property_set("Armnn.operandTypeFloat16Performance.execTime", "2.6f");
91 __system_property_set("Armnn.operandTypeFloat16Performance.powerUsage", "2.7f");
92 __system_property_set("Armnn.operandTypeTensorQuant8AsymmPerformance.execTime", "2.8f");
93 __system_property_set("Armnn.operandTypeTensorQuant8AsymmPerformance.powerUsage", "2.9f");
94 __system_property_set("Armnn.operandTypeTensorQuant16SymmPerformance.execTime", "3.0f");
95 __system_property_set("Armnn.operandTypeTensorQuant16SymmPerformance.powerUsage", "3.1f");
96 __system_property_set("Armnn.operandTypeTensorInt32Performance.execTime", "3.2f");
97 __system_property_set("Armnn.operandTypeTensorInt32Performance.powerUsage", "3.3f");
98 __system_property_set("Armnn.operandTypeInt32Performance.execTime", "3.4f");
99 __system_property_set("Armnn.operandTypeInt32Performance.powerUsage", "3.5f");
100
101 armnn::IRuntime::CreationOptions options;
102 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
103
104 ArmnnDriverImpl::getCapabilities_1_2(runtime, getCapabilitiesFn);
105}
106
107BOOST_AUTO_TEST_CASE(PerformanceCapabilitiesUndefined)
108{
109 using namespace armnn_driver::hal_1_2;
110 using namespace android::nn;
111
112 float defaultValue = .1f;
113
114 auto getCapabilitiesFn = [&](ErrorStatus error, const V1_2::Capabilities& capabilities)
115 {
116 CheckOperandType(capabilities, OperandType::TENSOR_FLOAT32, defaultValue, defaultValue);
117 CheckOperandType(capabilities, OperandType::FLOAT32, defaultValue, defaultValue);
118 CheckOperandType(capabilities, OperandType::TENSOR_FLOAT16, defaultValue, defaultValue);
119 CheckOperandType(capabilities, OperandType::FLOAT16, defaultValue, defaultValue);
120 CheckOperandType(capabilities, OperandType::TENSOR_QUANT8_ASYMM, defaultValue, defaultValue);
121 CheckOperandType(capabilities, OperandType::TENSOR_QUANT16_SYMM, defaultValue, defaultValue);
122 CheckOperandType(capabilities, OperandType::TENSOR_INT32, defaultValue, defaultValue);
123 CheckOperandType(capabilities, OperandType::INT32, defaultValue, defaultValue);
124
125 // Unsupported operands take FLT_MAX value
126 CheckOperandType(capabilities, OperandType::UINT32, FLT_MAX, FLT_MAX);
127 CheckOperandType(capabilities, OperandType::BOOL, FLT_MAX, FLT_MAX);
128 CheckOperandType(capabilities, OperandType::TENSOR_QUANT8_SYMM, FLT_MAX, FLT_MAX);
129 CheckOperandType(capabilities, OperandType::TENSOR_QUANT16_ASYMM, FLT_MAX, FLT_MAX);
130 CheckOperandType(capabilities, OperandType::TENSOR_BOOL8, FLT_MAX, FLT_MAX);
131 CheckOperandType(capabilities, OperandType::TENSOR_QUANT8_SYMM_PER_CHANNEL, FLT_MAX, FLT_MAX);
132 CheckOperandType(capabilities, OperandType::OEM, FLT_MAX, FLT_MAX);
133 CheckOperandType(capabilities, OperandType::TENSOR_OEM_BYTE, FLT_MAX, FLT_MAX);
134
135 BOOST_ASSERT(error == ErrorStatus::NONE);
136 };
137
138 armnn::IRuntime::CreationOptions options;
139 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
140
141 ArmnnDriverImpl::getCapabilities_1_2(runtime, getCapabilitiesFn);
142}
143
144BOOST_AUTO_TEST_SUITE_END()