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