8 #include <doctest/doctest.h> 23 return static_cast<size_t>(-1);
26 return profiler->pProfilerImpl->m_EventSequence.size();
33 void RegisterUnregisterProfilerSingleThreadImpl(
bool &res)
45 std::unique_ptr<armnn::IProfiler> profiler = std::make_unique<armnn::IProfiler>();
49 res &= profiler.get() == profilerManager.
GetProfiler();
64 TEST_CASE(
"EnableDisableProfiling")
66 std::unique_ptr<armnn::IProfiler> profiler = std::make_unique<armnn::IProfiler>();
69 CHECK(!profiler->IsProfilingEnabled());
72 profiler->EnableProfiling(
true);
75 CHECK(profiler->IsProfilingEnabled());
78 profiler->EnableProfiling(
false);
81 CHECK(!profiler->IsProfilingEnabled());
84 TEST_CASE(
"RegisterUnregisterProfilerSingleThread")
87 RegisterUnregisterProfilerSingleThreadImpl(res);
91 TEST_CASE(
"RegisterUnregisterProfilerMultipleThreads")
93 bool res[3] = {
false,
false,
false};
94 std::vector<std::thread> threads;
95 for (
unsigned int i = 0; i < 3; ++i)
97 threads.push_back(std::thread([&res, i]() { RegisterUnregisterProfilerSingleThreadImpl(res[i]); }));
99 std::for_each(threads.begin(), threads.end(), [](std::thread& theThread)
104 for (
int i = 0 ; i < 3 ; ++i)
110 TEST_CASE(
"ProfilingMacros")
128 std::unique_ptr<armnn::IProfiler> profiler = std::make_unique<armnn::IProfiler>();
141 CHECK(eventSequenceSizeBefore == eventSequenceSizeAfter);
145 profiler->EnableProfiling(
true);
157 CHECK(eventSequenceSizeAfter == eventSequenceSizeBefore + 1);
161 profiler->EnableProfiling(
false);
164 #if defined(ARMNNREF_ENABLED) 168 TEST_CASE(
"RuntimeLoadNetwork")
181 mockNetwork->AddInputLayer(0,
"test layer");
183 runtime->LoadNetwork(networkIdentifier,
armnn::Optimize(*mockNetwork, backends, runtime->GetDeviceSpec()));
189 runtime->UnloadNetwork(networkIdentifier);
197 TEST_CASE(
"WriteEventResults")
203 std::unique_ptr<armnn::IProfiler> profiler = std::make_unique<armnn::IProfiler>();
207 profiler->EnableProfiling(
true);
223 std::this_thread::sleep_for(std::chrono::milliseconds(10));
228 CHECK(eventSequenceSizeAfter == eventSequenceSizeBefore + 1);
230 std::ostringstream output;
231 profiler->AnalyzeEventsAndWriteResults(output);
232 CHECK(!output.str().empty());
235 CHECK(output.str().find(
"test") != std::string::npos);
238 CHECK(output.str().find(
"Event Sequence - Name") != std::string::npos);
239 CHECK(output.str().find(
"Event Stats - Name") != std::string::npos);
240 CHECK(output.str().find(
"Total") != std::string::npos);
241 CHECK(output.str().find(
"Device") != std::string::npos);
243 CHECK(output.str().find(
"CpuAcc") != std::string::npos);
245 CHECK(output.str().find(
"e+") == std::string::npos);
247 CHECK(output.str().find(
"+") == std::string::npos);
249 CHECK(output.str().find(
" 0 ") == std::string::npos);
253 profiler->EnableProfiling(
false);
256 TEST_CASE(
"ProfilerJsonPrinter")
261 virtual ~TestInstrument() {}
262 void Start()
override {}
263 void Stop()
override {}
265 std::vector<armnn::Measurement> GetMeasurements()
const override 267 std::vector<armnn::Measurement> measurements;
270 armnn::Measurement::Unit::TIME_MS));
273 armnn::Measurement::Unit::TIME_US));
277 const char* GetName()
const override 279 return "TestInstrument";
287 std::unique_ptr<armnn::IProfiler> profiler = std::make_unique<armnn::IProfiler>();
290 profiler->EnableProfiling(
true);
326 std::stringbuf buffer;
327 std::ostream json(&buffer);
328 profiler->Print(json);
330 std::string output = buffer.str();
334 profiler->EnableProfiling(
false);
338 std::string blessedOutput(
"{\n\t\"ArmNN\": {\n\t\t\"inference_measurements_#1\": {\n\t\t\t\"type\": \"" 339 "Event\",\n\t\t\t\"Measurement1_#1\": {\n\t\t\t\t\"type\": \"" 340 "Measurement\",\n\t\t\t\t\"raw\": [\n\t\t\t\t\t1.000000\n\t\t\t\t],\n\t\t\t\t\"" 341 "unit\": \"ms\"\n\t\t\t},\n\t\t\t\"Measurement2_#1\": {\n\t\t\t\t\"type\": \"" 342 "Measurement\",\n\t\t\t\t\"raw\": [\n\t\t\t\t\t2.000000\n\t\t\t\t],\n\t\t\t\t\"" 343 "unit\": \"us\"\n\t\t\t},\n\t\t\t\"Level 0_#2\": {\n\t\t\t\t\"type\": \"" 344 "Event\",\n\t\t\t\t\"Measurement1_#2\": {\n\t\t\t\t\t\"type\": \"" 345 "Measurement\",\n\t\t\t\t\t\"raw\": [\n\t\t\t\t\t\t1.000000\n\t\t\t\t\t],\n\t\t\t\t\t\"" 346 "unit\": \"ms\"\n\t\t\t\t},\n\t\t\t\t\"Measurement2_#2\": {\n\t\t\t\t\t\"type\": \"" 347 "Measurement\",\n\t\t\t\t\t\"raw\": [\n\t\t\t\t\t\t2.000000\n\t\t\t\t\t],\n\t\t\t\t\t\"" 348 "unit\": \"us\"\n\t\t\t\t},\n\t\t\t\t\"Level 1A_#3\": {\n\t\t\t\t\t\"type\": \"" 349 "Event\",\n\t\t\t\t\t\"Measurement1_#3\": {\n\t\t\t\t\t\t\"type\": \"" 350 "Measurement\",\n\t\t\t\t\t\t\"raw\": [\n\t\t\t\t\t\t\t" 351 "1.000000\n\t\t\t\t\t\t],\n\t\t\t\t\t\t\"" 352 "unit\": \"ms\"\n\t\t\t\t\t},\n\t\t\t\t\t\"Measurement2_#3\": {\n\t\t\t\t\t\t\"type\": \"" 353 "Measurement\",\n\t\t\t\t\t\t\"raw\": [\n\t\t\t\t\t\t\t" 354 "2.000000\n\t\t\t\t\t\t],\n\t\t\t\t\t\t\"" 355 "unit\": \"us\"\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t\"Level 1B_#4\": {\n\t\t\t\t\t\"" 356 "type\": \"Event\",\n\t\t\t\t\t\"Measurement1_#4\": {\n\t\t\t\t\t\t\"type\": \"" 357 "Measurement\",\n\t\t\t\t\t\t\"raw\": [\n\t\t\t\t\t\t\t" 358 "1.000000\n\t\t\t\t\t\t],\n\t\t\t\t\t\t\"" 359 "unit\": \"ms\"\n\t\t\t\t\t},\n\t\t\t\t\t\"Measurement2_#4\": {\n\t\t\t\t\t\t\"" 360 "type\": \"Measurement\",\n\t\t\t\t\t\t\"raw\": [\n\t\t\t\t\t\t\t" 361 "2.000000\n\t\t\t\t\t\t],\n\t\t\t\t\t\t\"" 362 "unit\": \"us\"\n\t\t\t\t\t},\n\t\t\t\t\t\"Level 2A_#5\": {\n\t\t\t\t\t\t\"" 363 "type\": \"Event\",\n\t\t\t\t\t\t\"Measurement1_#5\": {\n\t\t\t\t\t\t\t\"type\": \"" 364 "Measurement\",\n\t\t\t\t\t\t\t\"raw\": [\n\t\t\t\t\t\t\t\t" 365 "1.000000\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"" 366 "unit\": \"ms\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"Measurement2_#5\": {\n\t\t\t\t\t\t\t\"" 367 "type\": \"Measurement\",\n\t\t\t\t\t\t\t\"raw\": [\n\t\t\t\t\t\t\t\t" 368 "2.000000\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"" 369 "unit\": \"us\"\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n");
371 CHECK(output == blessedOutput);
TEST_SUITE("TestConstTensorLayerVisitor")
static IRuntimePtr Create(const CreationOptions &options)
CPU Execution: Reference C++ kernels.
static ProfilerManager & GetInstance()
std::unique_ptr< IRuntime, void(*)(IRuntime *runtime)> IRuntimePtr
Copyright (c) 2021 ARM Limited and Contributors.
void IgnoreUnused(Ts &&...)
#define ARMNN_SCOPED_PROFILING_EVENT(backendId, name)
IProfiler * GetProfiler()
size_t GetProfilerEventSequenceSize(armnn::IProfiler *profiler)
IOptimizedNetworkPtr Optimize(const INetwork &network, const std::vector< BackendId > &backendPreferences, const IDeviceSpec &deviceSpec, const OptimizerOptions &options=OptimizerOptions(), Optional< std::vector< std::string > &> messages=EmptyOptional())
Create an optimized version of the network.
EmptyOptional is used to initialize the Optional class in case we want to have default value for an O...
void RegisterProfiler(IProfiler *profiler)
CPU Execution: NEON: ArmCompute.
std::unique_ptr< INetwork, void(*)(INetwork *network)> INetworkPtr
#define ARMNN_SCOPED_PROFILING_EVENT_WITH_INSTRUMENTS(backendId, guid,...)
static INetworkPtr Create(NetworkOptions networkOptions={})