blob: 0537badc334d339247de1ebd64b01cf9bf6e5bc8 [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
Sadik Armagan95e9efc2021-08-05 15:01:07 +010010#include <algorithm>
11#include <functional>
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +000012#include <set>
Sadik Armagan1625efc2021-06-10 18:24:34 +010013#include <doctest/doctest.h>
Jan Eilers156113c2020-09-09 19:11:16 +010014#include <fmt/format.h>
Finn Williams38939ff2020-04-16 16:57:59 +010015#include <thread>
Narumol Prangnawarat15effd82019-10-22 14:17:11 +010016
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000017using namespace arm::pipe;
Narumol Prangnawarat15effd82019-10-22 14:17:11 +010018
Sadik Armagan1625efc2021-06-10 18:24:34 +010019TEST_SUITE("ProfilingGuidTests")
20{
21TEST_CASE("GuidTest")
Narumol Prangnawarat15effd82019-10-22 14:17:11 +010022{
23 ProfilingGuid guid0(0);
24 ProfilingGuid guid1(1);
25 ProfilingGuid guid2(1);
26
Sadik Armagan1625efc2021-06-10 18:24:34 +010027 CHECK(guid0 != guid1);
28 CHECK(guid1 == guid2);
29 CHECK(guid0 < guid1);
30 CHECK(guid0 <= guid1);
31 CHECK(guid1 <= guid2);
32 CHECK(guid1 > guid0);
33 CHECK(guid1 >= guid0);
34 CHECK(guid1 >= guid2);
Narumol Prangnawarat15effd82019-10-22 14:17:11 +010035}
36
Sadik Armagan1625efc2021-06-10 18:24:34 +010037TEST_CASE("StaticGuidTest")
Narumol Prangnawarat15effd82019-10-22 14:17:11 +010038{
39 ProfilingStaticGuid guid0(0);
40 ProfilingStaticGuid guid1(1);
41 ProfilingStaticGuid guid2(1);
42
Sadik Armagan1625efc2021-06-10 18:24:34 +010043 CHECK(guid0 != guid1);
44 CHECK(guid1 == guid2);
45 CHECK(guid0 < guid1);
46 CHECK(guid0 <= guid1);
47 CHECK(guid1 <= guid2);
48 CHECK(guid1 > guid0);
49 CHECK(guid1 >= guid0);
50 CHECK(guid1 >= guid2);
Narumol Prangnawarat15effd82019-10-22 14:17:11 +010051}
52
Sadik Armagan1625efc2021-06-10 18:24:34 +010053TEST_CASE("DynamicGuidTest")
Narumol Prangnawarat15effd82019-10-22 14:17:11 +010054{
55 ProfilingDynamicGuid guid0(0);
56 ProfilingDynamicGuid guid1(1);
57 ProfilingDynamicGuid guid2(1);
58
Sadik Armagan1625efc2021-06-10 18:24:34 +010059 CHECK(guid0 != guid1);
60 CHECK(guid1 == guid2);
61 CHECK(guid0 < guid1);
62 CHECK(guid0 <= guid1);
63 CHECK(guid1 <= guid2);
64 CHECK(guid1 > guid0);
65 CHECK(guid1 >= guid0);
66 CHECK(guid1 >= guid2);
Narumol Prangnawarat15effd82019-10-22 14:17:11 +010067}
68
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +000069void CheckStaticGuid(uint64_t guid, uint64_t expectedGuid)
70{
Sadik Armagan1625efc2021-06-10 18:24:34 +010071 CHECK(guid == expectedGuid);
72 CHECK(guid >= MIN_STATIC_GUID);
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +000073}
74
75void CheckDynamicGuid(uint64_t guid, uint64_t expectedGuid)
76{
Sadik Armagan1625efc2021-06-10 18:24:34 +010077 CHECK(guid == expectedGuid);
78 CHECK(guid < MIN_STATIC_GUID);
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +000079}
80
Sadik Armagan1625efc2021-06-10 18:24:34 +010081TEST_CASE("StaticGuidGeneratorCollisionTest")
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +000082{
83 ProfilingGuidGenerator generator;
84 std::set<uint64_t> guids;
Colm Donelan2ba48d22019-11-29 09:10:59 +000085 for ( int i = 0; i < 100000; ++i )
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +000086 {
Matteo Martincigh15717002019-11-22 14:13:02 +000087 std::stringstream ss;
88 ss << i;
89 std::string str = ss.str();
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +000090 ProfilingStaticGuid guid = generator.GenerateStaticId(str.c_str());
91 if (guids.find(guid) != guids.end())
92 {
Colm Donelan94c97882020-05-12 17:17:59 +010093 // If we're running on a 32bit system it is more likely to get a GUID clash over 1 million executions.
94 // We can generally detect this when the GUID turns out to be MIN_STATIC_GUID. Output a warning
95 // message rather than error in this case.
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000096 if (guid == ProfilingGuid(MIN_STATIC_GUID))
Colm Donelan94c97882020-05-12 17:17:59 +010097 {
Sadik Armagan1625efc2021-06-10 18:24:34 +010098 WARN("MIN_STATIC_GUID returned more than once from GenerateStaticId.");
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000099 }
Colm Donelan94c97882020-05-12 17:17:59 +0100100 else
101 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100102 FAIL(fmt::format("GUID collision occurred: {} -> {}", str, guid));
Colm Donelan94c97882020-05-12 17:17:59 +0100103 }
Matteo Martincigh15717002019-11-22 14:13:02 +0000104 break;
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000105 }
106 guids.insert(guid);
107 }
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000108}
109
Sadik Armagan1625efc2021-06-10 18:24:34 +0100110TEST_CASE("StaticGuidGeneratorTest")
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000111{
112 ProfilingGuidGenerator generator;
113
114 ProfilingStaticGuid staticGuid0 = generator.GenerateStaticId("name");
115 CheckStaticGuid(staticGuid0, LabelsAndEventClasses::NAME_GUID);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100116 CHECK(staticGuid0 != generator.GenerateStaticId("Name"));
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000117
118 ProfilingStaticGuid staticGuid1 = generator.GenerateStaticId("type");
119 CheckStaticGuid(staticGuid1, LabelsAndEventClasses::TYPE_GUID);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100120 CHECK(staticGuid1 != generator.GenerateStaticId("Type"));
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000121
122 ProfilingStaticGuid staticGuid2 = generator.GenerateStaticId("index");
123 CheckStaticGuid(staticGuid2, LabelsAndEventClasses::INDEX_GUID);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100124 CHECK(staticGuid2 != generator.GenerateStaticId("Index"));
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000125}
126
Sadik Armagan1625efc2021-06-10 18:24:34 +0100127TEST_CASE("DynamicGuidGeneratorTest")
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000128{
129 ProfilingGuidGenerator generator;
130
131 for (unsigned int i = 0; i < 100; ++i)
132 {
133 ProfilingDynamicGuid guid = generator.NextGuid();
134 CheckDynamicGuid(guid, i);
135 }
136}
137
Sadik Armagan95e9efc2021-08-05 15:01:07 +0100138void GenerateProfilingGUID(ProfilingGuidGenerator& guidGenerator)
139{
140 for (int i = 0; i < 1000; ++i)
141 {
142 guidGenerator.NextGuid();
143 }
144}
145
Sadik Armagan1625efc2021-06-10 18:24:34 +0100146TEST_CASE("ProfilingGuidThreadTest")
Finn Williams38939ff2020-04-16 16:57:59 +0100147{
148 ProfilingGuidGenerator profilingGuidGenerator;
Sadik Armagan95e9efc2021-08-05 15:01:07 +0100149 std::vector<std::thread> threads;
150 for (unsigned int i = 0; i < 3; ++i)
Finn Williams38939ff2020-04-16 16:57:59 +0100151 {
Sadik Armagan95e9efc2021-08-05 15:01:07 +0100152 threads.push_back(std::thread(GenerateProfilingGUID, std::ref(profilingGuidGenerator)));
153 }
154 std::for_each(threads.begin(), threads.end(), [](std::thread& theThread)
155 {
156 theThread.join();
157 });
Finn Williams38939ff2020-04-16 16:57:59 +0100158
159 uint64_t guid = profilingGuidGenerator.NextGuid();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100160 CHECK(guid == 3000u);
Finn Williams38939ff2020-04-16 16:57:59 +0100161}
162
Sadik Armagan1625efc2021-06-10 18:24:34 +0100163}