blob: caec2101506c7a3ace693f185a526fa31ec5b055 [file] [log] [blame]
Narumol Prangnawarat15effd82019-10-22 14:17:11 +01001//
2// Copyright © 2019 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
janeil01c4946c72019-11-07 09:32:28 +00006#include <armnn/Types.hpp>
Narumol Prangnawarat15effd82019-10-22 14:17:11 +01007
Nikhil Raj77fe76b2021-06-09 14:55:32 +01008#include <common/include/LabelsAndEventClasses.hpp>
9
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +000010#include <set>
Sadik Armagan1625efc2021-06-10 18:24:34 +010011#include <doctest/doctest.h>
Jan Eilers156113c2020-09-09 19:11:16 +010012#include <fmt/format.h>
Finn Williams38939ff2020-04-16 16:57:59 +010013#include <thread>
Narumol Prangnawarat15effd82019-10-22 14:17:11 +010014
15using namespace armnn::profiling;
16
Sadik Armagan1625efc2021-06-10 18:24:34 +010017TEST_SUITE("ProfilingGuidTests")
18{
19TEST_CASE("GuidTest")
Narumol Prangnawarat15effd82019-10-22 14:17:11 +010020{
21 ProfilingGuid guid0(0);
22 ProfilingGuid guid1(1);
23 ProfilingGuid guid2(1);
24
Sadik Armagan1625efc2021-06-10 18:24:34 +010025 CHECK(guid0 != guid1);
26 CHECK(guid1 == guid2);
27 CHECK(guid0 < guid1);
28 CHECK(guid0 <= guid1);
29 CHECK(guid1 <= guid2);
30 CHECK(guid1 > guid0);
31 CHECK(guid1 >= guid0);
32 CHECK(guid1 >= guid2);
Narumol Prangnawarat15effd82019-10-22 14:17:11 +010033}
34
Sadik Armagan1625efc2021-06-10 18:24:34 +010035TEST_CASE("StaticGuidTest")
Narumol Prangnawarat15effd82019-10-22 14:17:11 +010036{
37 ProfilingStaticGuid guid0(0);
38 ProfilingStaticGuid guid1(1);
39 ProfilingStaticGuid guid2(1);
40
Sadik Armagan1625efc2021-06-10 18:24:34 +010041 CHECK(guid0 != guid1);
42 CHECK(guid1 == guid2);
43 CHECK(guid0 < guid1);
44 CHECK(guid0 <= guid1);
45 CHECK(guid1 <= guid2);
46 CHECK(guid1 > guid0);
47 CHECK(guid1 >= guid0);
48 CHECK(guid1 >= guid2);
Narumol Prangnawarat15effd82019-10-22 14:17:11 +010049}
50
Sadik Armagan1625efc2021-06-10 18:24:34 +010051TEST_CASE("DynamicGuidTest")
Narumol Prangnawarat15effd82019-10-22 14:17:11 +010052{
53 ProfilingDynamicGuid guid0(0);
54 ProfilingDynamicGuid guid1(1);
55 ProfilingDynamicGuid guid2(1);
56
Sadik Armagan1625efc2021-06-10 18:24:34 +010057 CHECK(guid0 != guid1);
58 CHECK(guid1 == guid2);
59 CHECK(guid0 < guid1);
60 CHECK(guid0 <= guid1);
61 CHECK(guid1 <= guid2);
62 CHECK(guid1 > guid0);
63 CHECK(guid1 >= guid0);
64 CHECK(guid1 >= guid2);
Narumol Prangnawarat15effd82019-10-22 14:17:11 +010065}
66
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +000067void CheckStaticGuid(uint64_t guid, uint64_t expectedGuid)
68{
Sadik Armagan1625efc2021-06-10 18:24:34 +010069 CHECK(guid == expectedGuid);
70 CHECK(guid >= MIN_STATIC_GUID);
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +000071}
72
73void CheckDynamicGuid(uint64_t guid, uint64_t expectedGuid)
74{
Sadik Armagan1625efc2021-06-10 18:24:34 +010075 CHECK(guid == expectedGuid);
76 CHECK(guid < MIN_STATIC_GUID);
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +000077}
78
Sadik Armagan1625efc2021-06-10 18:24:34 +010079TEST_CASE("StaticGuidGeneratorCollisionTest")
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +000080{
81 ProfilingGuidGenerator generator;
82 std::set<uint64_t> guids;
Colm Donelan2ba48d22019-11-29 09:10:59 +000083 for ( int i = 0; i < 100000; ++i )
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +000084 {
Matteo Martincigh15717002019-11-22 14:13:02 +000085 std::stringstream ss;
86 ss << i;
87 std::string str = ss.str();
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +000088 ProfilingStaticGuid guid = generator.GenerateStaticId(str.c_str());
89 if (guids.find(guid) != guids.end())
90 {
Colm Donelan94c97882020-05-12 17:17:59 +010091 // If we're running on a 32bit system it is more likely to get a GUID clash over 1 million executions.
92 // We can generally detect this when the GUID turns out to be MIN_STATIC_GUID. Output a warning
93 // message rather than error in this case.
94 if (guid == ProfilingGuid(armnn::profiling::MIN_STATIC_GUID))
95 {
Sadik Armagan1625efc2021-06-10 18:24:34 +010096 WARN("MIN_STATIC_GUID returned more than once from GenerateStaticId.");
Colm Donelan94c97882020-05-12 17:17:59 +010097 }
98 else
99 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100100 FAIL(fmt::format("GUID collision occurred: {} -> {}", str, guid));
Colm Donelan94c97882020-05-12 17:17:59 +0100101 }
Matteo Martincigh15717002019-11-22 14:13:02 +0000102 break;
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000103 }
104 guids.insert(guid);
105 }
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000106}
107
Sadik Armagan1625efc2021-06-10 18:24:34 +0100108TEST_CASE("StaticGuidGeneratorTest")
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000109{
110 ProfilingGuidGenerator generator;
111
112 ProfilingStaticGuid staticGuid0 = generator.GenerateStaticId("name");
113 CheckStaticGuid(staticGuid0, LabelsAndEventClasses::NAME_GUID);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100114 CHECK(staticGuid0 != generator.GenerateStaticId("Name"));
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000115
116 ProfilingStaticGuid staticGuid1 = generator.GenerateStaticId("type");
117 CheckStaticGuid(staticGuid1, LabelsAndEventClasses::TYPE_GUID);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100118 CHECK(staticGuid1 != generator.GenerateStaticId("Type"));
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000119
120 ProfilingStaticGuid staticGuid2 = generator.GenerateStaticId("index");
121 CheckStaticGuid(staticGuid2, LabelsAndEventClasses::INDEX_GUID);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100122 CHECK(staticGuid2 != generator.GenerateStaticId("Index"));
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000123}
124
Sadik Armagan1625efc2021-06-10 18:24:34 +0100125TEST_CASE("DynamicGuidGeneratorTest")
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000126{
127 ProfilingGuidGenerator generator;
128
129 for (unsigned int i = 0; i < 100; ++i)
130 {
131 ProfilingDynamicGuid guid = generator.NextGuid();
132 CheckDynamicGuid(guid, i);
133 }
134}
135
Sadik Armagan1625efc2021-06-10 18:24:34 +0100136TEST_CASE("ProfilingGuidThreadTest")
Finn Williams38939ff2020-04-16 16:57:59 +0100137{
138 ProfilingGuidGenerator profilingGuidGenerator;
139
140 auto guidGenerator = [&profilingGuidGenerator]()
141 {
142 for (int i = 0; i < 1000; ++i)
143 {
144 profilingGuidGenerator.NextGuid();
145 }
146 };
147
148 std::thread t1(guidGenerator);
149 std::thread t2(guidGenerator);
150 std::thread t3(guidGenerator);
151
152 t1.join();
153 t2.join();
154 t3.join();
155
156 uint64_t guid = profilingGuidGenerator.NextGuid();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100157 CHECK(guid == 3000u);
Finn Williams38939ff2020-04-16 16:57:59 +0100158}
159
Sadik Armagan1625efc2021-06-10 18:24:34 +0100160}