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