xref: /aosp_15_r20/external/armnn/src/profiling/test/ProfilingGuidTest.cpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1*89c4ff92SAndroid Build Coastguard Worker //
2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2019 Arm Ltd. All rights reserved.
3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT
4*89c4ff92SAndroid Build Coastguard Worker //
5*89c4ff92SAndroid Build Coastguard Worker 
6*89c4ff92SAndroid Build Coastguard Worker #include <armnn/Types.hpp>
7*89c4ff92SAndroid Build Coastguard Worker 
8*89c4ff92SAndroid Build Coastguard Worker #include <common/include/LabelsAndEventClasses.hpp>
9*89c4ff92SAndroid Build Coastguard Worker 
10*89c4ff92SAndroid Build Coastguard Worker #include <algorithm>
11*89c4ff92SAndroid Build Coastguard Worker #include <functional>
12*89c4ff92SAndroid Build Coastguard Worker #include <set>
13*89c4ff92SAndroid Build Coastguard Worker #include <doctest/doctest.h>
14*89c4ff92SAndroid Build Coastguard Worker #include <fmt/format.h>
15*89c4ff92SAndroid Build Coastguard Worker #include <thread>
16*89c4ff92SAndroid Build Coastguard Worker 
17*89c4ff92SAndroid Build Coastguard Worker using namespace arm::pipe;
18*89c4ff92SAndroid Build Coastguard Worker 
19*89c4ff92SAndroid Build Coastguard Worker TEST_SUITE("ProfilingGuidTests")
20*89c4ff92SAndroid Build Coastguard Worker {
21*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("GuidTest")
22*89c4ff92SAndroid Build Coastguard Worker {
23*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuid guid0(0);
24*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuid guid1(1);
25*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuid guid2(1);
26*89c4ff92SAndroid Build Coastguard Worker 
27*89c4ff92SAndroid Build Coastguard Worker     CHECK(guid0 != guid1);
28*89c4ff92SAndroid Build Coastguard Worker     CHECK(guid1 == guid2);
29*89c4ff92SAndroid Build Coastguard Worker     CHECK(guid0 < guid1);
30*89c4ff92SAndroid Build Coastguard Worker     CHECK(guid0 <= guid1);
31*89c4ff92SAndroid Build Coastguard Worker     CHECK(guid1 <= guid2);
32*89c4ff92SAndroid Build Coastguard Worker     CHECK(guid1 > guid0);
33*89c4ff92SAndroid Build Coastguard Worker     CHECK(guid1 >= guid0);
34*89c4ff92SAndroid Build Coastguard Worker     CHECK(guid1 >= guid2);
35*89c4ff92SAndroid Build Coastguard Worker }
36*89c4ff92SAndroid Build Coastguard Worker 
37*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("StaticGuidTest")
38*89c4ff92SAndroid Build Coastguard Worker {
39*89c4ff92SAndroid Build Coastguard Worker     ProfilingStaticGuid guid0(0);
40*89c4ff92SAndroid Build Coastguard Worker     ProfilingStaticGuid guid1(1);
41*89c4ff92SAndroid Build Coastguard Worker     ProfilingStaticGuid guid2(1);
42*89c4ff92SAndroid Build Coastguard Worker 
43*89c4ff92SAndroid Build Coastguard Worker     CHECK(guid0 != guid1);
44*89c4ff92SAndroid Build Coastguard Worker     CHECK(guid1 == guid2);
45*89c4ff92SAndroid Build Coastguard Worker     CHECK(guid0 < guid1);
46*89c4ff92SAndroid Build Coastguard Worker     CHECK(guid0 <= guid1);
47*89c4ff92SAndroid Build Coastguard Worker     CHECK(guid1 <= guid2);
48*89c4ff92SAndroid Build Coastguard Worker     CHECK(guid1 > guid0);
49*89c4ff92SAndroid Build Coastguard Worker     CHECK(guid1 >= guid0);
50*89c4ff92SAndroid Build Coastguard Worker     CHECK(guid1 >= guid2);
51*89c4ff92SAndroid Build Coastguard Worker }
52*89c4ff92SAndroid Build Coastguard Worker 
53*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("DynamicGuidTest")
54*89c4ff92SAndroid Build Coastguard Worker {
55*89c4ff92SAndroid Build Coastguard Worker     ProfilingDynamicGuid guid0(0);
56*89c4ff92SAndroid Build Coastguard Worker     ProfilingDynamicGuid guid1(1);
57*89c4ff92SAndroid Build Coastguard Worker     ProfilingDynamicGuid guid2(1);
58*89c4ff92SAndroid Build Coastguard Worker 
59*89c4ff92SAndroid Build Coastguard Worker     CHECK(guid0 != guid1);
60*89c4ff92SAndroid Build Coastguard Worker     CHECK(guid1 == guid2);
61*89c4ff92SAndroid Build Coastguard Worker     CHECK(guid0 < guid1);
62*89c4ff92SAndroid Build Coastguard Worker     CHECK(guid0 <= guid1);
63*89c4ff92SAndroid Build Coastguard Worker     CHECK(guid1 <= guid2);
64*89c4ff92SAndroid Build Coastguard Worker     CHECK(guid1 > guid0);
65*89c4ff92SAndroid Build Coastguard Worker     CHECK(guid1 >= guid0);
66*89c4ff92SAndroid Build Coastguard Worker     CHECK(guid1 >= guid2);
67*89c4ff92SAndroid Build Coastguard Worker }
68*89c4ff92SAndroid Build Coastguard Worker 
CheckStaticGuid(uint64_t guid,uint64_t expectedGuid)69*89c4ff92SAndroid Build Coastguard Worker void CheckStaticGuid(uint64_t guid, uint64_t expectedGuid)
70*89c4ff92SAndroid Build Coastguard Worker {
71*89c4ff92SAndroid Build Coastguard Worker     CHECK(guid == expectedGuid);
72*89c4ff92SAndroid Build Coastguard Worker     CHECK(guid >= MIN_STATIC_GUID);
73*89c4ff92SAndroid Build Coastguard Worker }
74*89c4ff92SAndroid Build Coastguard Worker 
CheckDynamicGuid(uint64_t guid,uint64_t expectedGuid)75*89c4ff92SAndroid Build Coastguard Worker void CheckDynamicGuid(uint64_t guid, uint64_t expectedGuid)
76*89c4ff92SAndroid Build Coastguard Worker {
77*89c4ff92SAndroid Build Coastguard Worker     CHECK(guid == expectedGuid);
78*89c4ff92SAndroid Build Coastguard Worker     CHECK(guid < MIN_STATIC_GUID);
79*89c4ff92SAndroid Build Coastguard Worker }
80*89c4ff92SAndroid Build Coastguard Worker 
81*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("StaticGuidGeneratorCollisionTest")
82*89c4ff92SAndroid Build Coastguard Worker {
83*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuidGenerator generator;
84*89c4ff92SAndroid Build Coastguard Worker     std::set<uint64_t> guids;
85*89c4ff92SAndroid Build Coastguard Worker     for ( int i = 0; i < 100000; ++i )
86*89c4ff92SAndroid Build Coastguard Worker     {
87*89c4ff92SAndroid Build Coastguard Worker         std::stringstream ss;
88*89c4ff92SAndroid Build Coastguard Worker         ss << i;
89*89c4ff92SAndroid Build Coastguard Worker         std::string str = ss.str();
90*89c4ff92SAndroid Build Coastguard Worker         ProfilingStaticGuid guid = generator.GenerateStaticId(str.c_str());
91*89c4ff92SAndroid Build Coastguard Worker         if (guids.find(guid) != guids.end())
92*89c4ff92SAndroid Build Coastguard Worker         {
93*89c4ff92SAndroid Build Coastguard Worker             // If we're running on a 32bit system it is more likely to get a GUID clash over 1 million executions.
94*89c4ff92SAndroid Build Coastguard Worker             // We can generally detect this when the GUID turns out to be MIN_STATIC_GUID. Output a warning
95*89c4ff92SAndroid Build Coastguard Worker             // message rather than error in this case.
96*89c4ff92SAndroid Build Coastguard Worker             if (guid == ProfilingGuid(MIN_STATIC_GUID))
97*89c4ff92SAndroid Build Coastguard Worker             {
98*89c4ff92SAndroid Build Coastguard Worker                 WARN("MIN_STATIC_GUID returned more than once from GenerateStaticId.");
99*89c4ff92SAndroid Build Coastguard Worker             }
100*89c4ff92SAndroid Build Coastguard Worker             else
101*89c4ff92SAndroid Build Coastguard Worker             {
102*89c4ff92SAndroid Build Coastguard Worker                 FAIL(fmt::format("GUID collision occurred: {} -> {}", str, guid));
103*89c4ff92SAndroid Build Coastguard Worker             }
104*89c4ff92SAndroid Build Coastguard Worker             break;
105*89c4ff92SAndroid Build Coastguard Worker         }
106*89c4ff92SAndroid Build Coastguard Worker         guids.insert(guid);
107*89c4ff92SAndroid Build Coastguard Worker     }
108*89c4ff92SAndroid Build Coastguard Worker }
109*89c4ff92SAndroid Build Coastguard Worker 
110*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("StaticGuidGeneratorTest")
111*89c4ff92SAndroid Build Coastguard Worker {
112*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuidGenerator generator;
113*89c4ff92SAndroid Build Coastguard Worker 
114*89c4ff92SAndroid Build Coastguard Worker     ProfilingStaticGuid staticGuid0 = generator.GenerateStaticId("name");
115*89c4ff92SAndroid Build Coastguard Worker     CheckStaticGuid(staticGuid0, LabelsAndEventClasses::NAME_GUID);
116*89c4ff92SAndroid Build Coastguard Worker     CHECK(staticGuid0 != generator.GenerateStaticId("Name"));
117*89c4ff92SAndroid Build Coastguard Worker 
118*89c4ff92SAndroid Build Coastguard Worker     ProfilingStaticGuid staticGuid1 = generator.GenerateStaticId("type");
119*89c4ff92SAndroid Build Coastguard Worker     CheckStaticGuid(staticGuid1, LabelsAndEventClasses::TYPE_GUID);
120*89c4ff92SAndroid Build Coastguard Worker     CHECK(staticGuid1 != generator.GenerateStaticId("Type"));
121*89c4ff92SAndroid Build Coastguard Worker 
122*89c4ff92SAndroid Build Coastguard Worker     ProfilingStaticGuid staticGuid2 = generator.GenerateStaticId("index");
123*89c4ff92SAndroid Build Coastguard Worker     CheckStaticGuid(staticGuid2, LabelsAndEventClasses::INDEX_GUID);
124*89c4ff92SAndroid Build Coastguard Worker     CHECK(staticGuid2 != generator.GenerateStaticId("Index"));
125*89c4ff92SAndroid Build Coastguard Worker }
126*89c4ff92SAndroid Build Coastguard Worker 
127*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("DynamicGuidGeneratorTest")
128*89c4ff92SAndroid Build Coastguard Worker {
129*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuidGenerator generator;
130*89c4ff92SAndroid Build Coastguard Worker 
131*89c4ff92SAndroid Build Coastguard Worker     for (unsigned int i = 0; i < 100; ++i)
132*89c4ff92SAndroid Build Coastguard Worker     {
133*89c4ff92SAndroid Build Coastguard Worker         ProfilingDynamicGuid guid = generator.NextGuid();
134*89c4ff92SAndroid Build Coastguard Worker         CheckDynamicGuid(guid, i);
135*89c4ff92SAndroid Build Coastguard Worker     }
136*89c4ff92SAndroid Build Coastguard Worker }
137*89c4ff92SAndroid Build Coastguard Worker 
GenerateProfilingGUID(ProfilingGuidGenerator & guidGenerator)138*89c4ff92SAndroid Build Coastguard Worker void GenerateProfilingGUID(ProfilingGuidGenerator& guidGenerator)
139*89c4ff92SAndroid Build Coastguard Worker {
140*89c4ff92SAndroid Build Coastguard Worker     for (int i = 0; i < 1000; ++i)
141*89c4ff92SAndroid Build Coastguard Worker     {
142*89c4ff92SAndroid Build Coastguard Worker         guidGenerator.NextGuid();
143*89c4ff92SAndroid Build Coastguard Worker     }
144*89c4ff92SAndroid Build Coastguard Worker }
145*89c4ff92SAndroid Build Coastguard Worker 
146*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("ProfilingGuidThreadTest")
147*89c4ff92SAndroid Build Coastguard Worker {
148*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuidGenerator profilingGuidGenerator;
149*89c4ff92SAndroid Build Coastguard Worker     std::vector<std::thread> threads;
150*89c4ff92SAndroid Build Coastguard Worker     for (unsigned int i = 0; i < 3; ++i)
151*89c4ff92SAndroid Build Coastguard Worker     {
152*89c4ff92SAndroid Build Coastguard Worker         threads.push_back(std::thread(GenerateProfilingGUID, std::ref(profilingGuidGenerator)));
153*89c4ff92SAndroid Build Coastguard Worker     }
154*89c4ff92SAndroid Build Coastguard Worker     std::for_each(threads.begin(), threads.end(), [](std::thread& theThread)
__anonfdc18dd50102(std::thread& theThread) 155*89c4ff92SAndroid Build Coastguard Worker     {
156*89c4ff92SAndroid Build Coastguard Worker         theThread.join();
157*89c4ff92SAndroid Build Coastguard Worker     });
158*89c4ff92SAndroid Build Coastguard Worker 
159*89c4ff92SAndroid Build Coastguard Worker     uint64_t guid = profilingGuidGenerator.NextGuid();
160*89c4ff92SAndroid Build Coastguard Worker     CHECK(guid == 3000u);
161*89c4ff92SAndroid Build Coastguard Worker }
162*89c4ff92SAndroid Build Coastguard Worker 
163*89c4ff92SAndroid Build Coastguard Worker }
164