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);
361 std::stringbuf buffer;
362 std::ostream json(&buffer);
363 profiler->Print(json);
365 std::string output = buffer.str();
369 profiler->EnableProfiling(
false);
373 std::string blessedOutput(
"{\n\t\"ArmNN\": {\n\t\t\"optimize_measurements_#1\": {\n\t\t\t\"type\": \"Event\"" 374 ",\n\t\t\t\"Measurement1_#1\": {\n\t\t\t\t\"type\": \"Measurement\",\n\t\t\t\t\"raw\"" 375 ": [\n\t\t\t\t\t1.000000\n\t\t\t\t],\n\t\t\t\t\"unit\": \"ms\"\n\t\t\t},\n\t\t\t\"" 376 "Measurement2_#1\": {\n\t\t\t\t\"type\": \"Measurement\",\n\t\t\t\t\"raw\": [\n\t\t\t" 377 "\t\t2.000000\n\t\t\t\t],\n\t\t\t\t\"unit\": \"us\"\n\t\t\t},\n\t\t\t\"Level 0_#2\": {\n" 378 "\t\t\t\t\"type\": \"Event\",\n\t\t\t\t\"Measurement1_#2\": {\n\t\t\t\t\t\"type\": \"" 379 "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\"" 380 "unit\": \"ms\"\n\t\t\t\t},\n\t\t\t\t\"Measurement2_#2\": {\n\t\t\t\t\t\"type\": \"" 381 "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\"" 382 "unit\": \"us\"\n\t\t\t\t},\n\t\t\t\t\"Level 1A_#3\": {\n\t\t\t\t\t\"type\": \"Event\",\n" 383 "\t\t\t\t\t\"Measurement1_#3\": {\n\t\t\t\t\t\t\"type\": \"Measurement\",\n" 384 "\t\t\t\t\t\t\"raw\": [\n\t\t\t\t\t\t\t1.000000\n\t\t\t\t\t\t],\n\t\t\t\t\t\t\"unit\"" 385 ": \"ms\"\n\t\t\t\t\t},\n\t\t\t\t\t\"Measurement2_#3\": {\n\t\t\t\t\t\t\"type\": \"" 386 "Measurement\",\n\t\t\t\t\t\t\"raw\": [\n\t\t\t\t\t\t\t2.000000\n\t\t\t\t\t\t],\n\t\t\t" 387 "\t\t\t\"unit\": \"us\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t\"" 388 "loaded_network_measurements_#4\": {\n\t\t\t\"type\": \"Event\",\n\t\t\t\"" 389 "Measurement1_#4\": {\n\t\t\t\t\"type\": \"Measurement\",\n\t\t\t\t\"raw\": [\n\t\t\t\t" 390 "\t1.000000\n\t\t\t\t],\n\t\t\t\t\"unit\": \"ms\"\n\t\t\t},\n\t\t\t\"Measurement2_#4\"" 391 ": {\n\t\t\t\t\"type\": \"Measurement\",\n\t\t\t\t\"raw\": [\n\t\t\t\t\t2.000000\n" 392 "\t\t\t\t],\n\t\t\t\t\"unit\": \"us\"\n\t\t\t},\n\t\t\t\"Level 0_#5\": {\n\t\t\t\t\"" 393 "type\": \"Event\",\n\t\t\t\t\"Measurement1_#5\": {\n\t\t\t\t\t\"type\": \"Measurement\"" 394 ",\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\"unit\": \"" 395 "ms\"\n\t\t\t\t},\n\t\t\t\t\"Measurement2_#5\": {\n\t\t\t\t\t\"type\": \"Measurement\"" 396 ",\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\"unit\": \"us\"" 397 "\n\t\t\t\t},\n\t\t\t\t\"Level 1A_#6\": {\n\t\t\t\t\t\"type\": \"Event\",\n\t\t\t\t\t\"" 398 "Measurement1_#6\": {\n\t\t\t\t\t\t\"type\": \"Measurement\",\n\t\t\t\t\t\t\"raw\": [\n" 399 "\t\t\t\t\t\t\t1.000000\n\t\t\t\t\t\t],\n\t\t\t\t\t\t\"unit\": \"ms\"\n\t\t\t\t\t},\n" 400 "\t\t\t\t\t\"Measurement2_#6\": {\n\t\t\t\t\t\t\"type\": \"Measurement\",\n\t\t\t\t\t\t\"" 401 "raw\": [\n\t\t\t\t\t\t\t2.000000\n\t\t\t\t\t\t],\n\t\t\t\t\t\t\"unit\": \"us\"" 402 "\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t\"inference_measurements_#7\": {\n" 403 "\t\t\t\"type\": \"Event\",\n\t\t\t\"Measurement1_#7\": {\n\t\t\t\t\"type\": \"" 404 "Measurement\",\n\t\t\t\t\"raw\": [\n\t\t\t\t\t1.000000\n\t\t\t\t],\n\t\t\t\t\"unit\": \"" 405 "ms\"\n\t\t\t},\n\t\t\t\"Measurement2_#7\": {\n\t\t\t\t\"type\": \"Measurement\",\n" 406 "\t\t\t\t\"raw\": [\n\t\t\t\t\t2.000000\n\t\t\t\t],\n\t\t\t\t\"unit\": \"us\"\n\t\t\t},\n" 407 "\t\t\t\"Level 0_#8\": {\n\t\t\t\t\"type\": \"Event\",\n\t\t\t\t\"Measurement1_#8\": {\n" 408 "\t\t\t\t\t\"type\": \"Measurement\",\n\t\t\t\t\t\"raw\": [\n\t\t\t\t\t\t1.000000\n" 409 "\t\t\t\t\t],\n\t\t\t\t\t\"unit\": \"ms\"\n\t\t\t\t},\n\t\t\t\t\"Measurement2_#8\": {\n" 410 "\t\t\t\t\t\"type\": \"Measurement\",\n\t\t\t\t\t\"raw\": [\n\t\t\t\t\t\t2.000000\n" 411 "\t\t\t\t\t],\n\t\t\t\t\t\"unit\": \"us\"\n\t\t\t\t},\n\t\t\t\t\"Level 1A_#9\": {\n" 412 "\t\t\t\t\t\"type\": \"Event\",\n\t\t\t\t\t\"Measurement1_#9\": {\n\t\t\t\t\t\t\"type\"" 413 ": \"Measurement\",\n\t\t\t\t\t\t\"raw\": [\n\t\t\t\t\t\t\t1.000000\n\t\t\t\t\t\t],\n" 414 "\t\t\t\t\t\t\"unit\": \"ms\"\n\t\t\t\t\t},\n\t\t\t\t\t\"Measurement2_#9\": {\n" 415 "\t\t\t\t\t\t\"type\": \"Measurement\",\n\t\t\t\t\t\t\"raw\": [\n\t\t\t\t\t\t\t2.000000\n" 416 "\t\t\t\t\t\t],\n\t\t\t\t\t\t\"unit\": \"us\"\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t\"" 417 "Level 1B_#10\": {\n\t\t\t\t\t\"type\": \"Event\",\n\t\t\t\t\t\"Measurement1_#10\"" 418 ": {\n\t\t\t\t\t\t\"type\": \"Measurement\",\n\t\t\t\t\t\t\"raw\": [\n\t\t\t\t\t\t\t" 419 "1.000000\n\t\t\t\t\t\t],\n\t\t\t\t\t\t\"unit\": \"ms\"\n\t\t\t\t\t},\n\t\t\t\t\t\"" 420 "Measurement2_#10\": {\n\t\t\t\t\t\t\"type\": \"Measurement\",\n\t\t\t\t\t\t\"raw\"" 421 ": [\n\t\t\t\t\t\t\t2.000000\n\t\t\t\t\t\t],\n\t\t\t\t\t\t\"unit\": \"us\"\n" 422 "\t\t\t\t\t},\n\t\t\t\t\t\"Level 2A_#11\": {\n\t\t\t\t\t\t\"type\": \"Event\",\n\t\t\t" 423 "\t\t\t\"Measurement1_#11\": {\n\t\t\t\t\t\t\t\"type\": \"Measurement\",\n\t\t\t\t\t\t" 424 "\t\"raw\": [\n\t\t\t\t\t\t\t\t1.000000\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"unit\": \"" 425 "ms\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"Measurement2_#11\": {\n\t\t\t\t\t\t\t\"type\": \"" 426 "Measurement\",\n\t\t\t\t\t\t\t\"raw\": [\n\t\t\t\t\t\t\t\t2.000000\n\t\t\t\t\t\t\t],\n" 427 "\t\t\t\t\t\t\t\"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" 430 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={})