blob: 80236ae4eb9fff4cd0b04c3997be3584bd506c7c [file] [log] [blame]
Keith Davis3201eea2019-10-24 17:30:41 +01001//
2// Copyright © 2019 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
Jim Flynn4e755a52020-03-29 17:48:26 +01006#include <Filesystem.hpp>
Aron Virginas-Tar8bf442e2019-11-07 18:41:40 +00007#include <ProfilingService.hpp>
Keith Davis3201eea2019-10-24 17:30:41 +01008#include <Runtime.hpp>
Jim Flynn4e755a52020-03-29 17:48:26 +01009#include "PrintPacketHeaderHandler.hpp"
10#include "TestTimelinePacketHandler.hpp"
Keith Davis3201eea2019-10-24 17:30:41 +010011
Keith Davis3201eea2019-10-24 17:30:41 +010012#include <boost/filesystem.hpp>
13#include <boost/numeric/conversion/cast.hpp>
14#include <boost/test/unit_test.hpp>
15
Keith Davis3201eea2019-10-24 17:30:41 +010016#include <cstdio>
Keith Davis3201eea2019-10-24 17:30:41 +010017#include <sstream>
18#include <sys/stat.h>
19
Keith Davis3201eea2019-10-24 17:30:41 +010020using namespace armnn::profiling;
21using namespace armnn;
22
23using namespace std::chrono_literals;
24
Finn Williams09ad6f92019-12-19 17:05:18 +000025class FileOnlyHelperService : public ProfilingService
26{
27 public:
28 // Wait for a notification from the send thread
29 bool WaitForPacketsSent(uint32_t timeout = 1000)
30 {
Sadik Armagan3184c902020-03-18 10:57:30 +000031 return ProfilingService::WaitForPacketSent(m_ProfilingService, timeout);
Finn Williams09ad6f92019-12-19 17:05:18 +000032 }
Sadik Armagan3184c902020-03-18 10:57:30 +000033 armnn::profiling::ProfilingService m_ProfilingService;
Finn Williams09ad6f92019-12-19 17:05:18 +000034};
35
Keith Davis3201eea2019-10-24 17:30:41 +010036BOOST_AUTO_TEST_SUITE(FileOnlyProfilingDecoratorTests)
37
Jim Flynn4e755a52020-03-29 17:48:26 +010038std::string UniqueFileName()
39{
40 std::time_t t = std::time(nullptr);
41 char mbstr[100];
42 std::strftime(mbstr, sizeof(mbstr), "%Y_%m_%d_%H_%M_%S_", std::localtime(&t));
43 std::stringstream ss;
44 ss << mbstr;
45 ss << t;
46 ss << ".bin";
47 return ss.str();
48}
49
50BOOST_AUTO_TEST_CASE(TestFileOnlyProfiling)
51{
Finn Williams0c32ccf2020-05-12 13:37:06 +010052 // This test requires the CpuRef backend to be enabled
53 if(!BackendRegistryInstance().IsBackendRegistered("CpuRef"))
54 {
55 return;
56 }
57
Jim Flynn4e755a52020-03-29 17:48:26 +010058 // Create a temporary file name.
59 boost::filesystem::path tempPath = boost::filesystem::temp_directory_path();
60 boost::filesystem::path tempFile = UniqueFileName();
61 tempPath = tempPath / tempFile;
62 armnn::Runtime::CreationOptions creationOptions;
63 creationOptions.m_ProfilingOptions.m_EnableProfiling = true;
64 creationOptions.m_ProfilingOptions.m_FileOnly = true;
65 creationOptions.m_ProfilingOptions.m_CapturePeriod = 100;
66 creationOptions.m_ProfilingOptions.m_TimelineEnabled = true;
67 ILocalPacketHandlerSharedPtr localPacketHandlerPtr = std::make_shared<TestTimelinePacketHandler>();
68 creationOptions.m_ProfilingOptions.m_LocalPacketHandlers.push_back(localPacketHandlerPtr);
69
70 armnn::Runtime runtime(creationOptions);
71
72 // Load a simple network
73 // build up the structure of the network
74 INetworkPtr net(INetwork::Create());
75
76 IConnectableLayer* input = net->AddInputLayer(0, "input");
77
78 NormalizationDescriptor descriptor;
79 IConnectableLayer* normalize = net->AddNormalizationLayer(descriptor, "normalization");
80
81 IConnectableLayer* output = net->AddOutputLayer(0, "output");
82
83 input->GetOutputSlot(0).Connect(normalize->GetInputSlot(0));
84 normalize->GetOutputSlot(0).Connect(output->GetInputSlot(0));
85
86 input->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
87 normalize->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
88
89 // optimize the network
90 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
91 IOptimizedNetworkPtr optNet = Optimize(*net, backends, runtime.GetDeviceSpec());
92
93 // Load it into the runtime. It should succeed.
94 armnn::NetworkId netId;
95 BOOST_TEST(runtime.LoadNetwork(netId, std::move(optNet)) == Status::Success);
96
97 static_cast<TestTimelinePacketHandler*>(localPacketHandlerPtr.get())->WaitOnInferenceCompletion(3000);
98}
99
Jan Eilers158997a2020-01-30 13:50:36 +0000100BOOST_AUTO_TEST_CASE(DumpOutgoingValidFileEndToEnd, * boost::unit_test::disabled())
Keith Davis3201eea2019-10-24 17:30:41 +0100101{
102 // Create a temporary file name.
103 boost::filesystem::path tempPath = boost::filesystem::temp_directory_path();
Jim Flynn4e755a52020-03-29 17:48:26 +0100104 boost::filesystem::path tempFile = UniqueFileName();
Keith Davis3201eea2019-10-24 17:30:41 +0100105 tempPath = tempPath / tempFile;
106 armnn::Runtime::CreationOptions::ExternalProfilingOptions options;
107 options.m_EnableProfiling = true;
108 options.m_FileOnly = true;
109 options.m_IncomingCaptureFile = "";
Rob Hughes270233f2019-11-13 11:53:48 +0000110 options.m_OutgoingCaptureFile = tempPath.string();
Keith Davis3201eea2019-10-24 17:30:41 +0100111 options.m_CapturePeriod = 100;
112
Finn Williams09ad6f92019-12-19 17:05:18 +0000113 FileOnlyHelperService helper;
114
Keith Davis3201eea2019-10-24 17:30:41 +0100115 // Enable the profiling service
Sadik Armagan3184c902020-03-18 10:57:30 +0000116 armnn::profiling::ProfilingService profilingService;
Keith Davis3201eea2019-10-24 17:30:41 +0100117 profilingService.ResetExternalProfilingOptions(options, true);
118 // Bring the profiling service to the "WaitingForAck" state
119 profilingService.Update();
120 profilingService.Update();
121
Keith Davis3201eea2019-10-24 17:30:41 +0100122
Finn Williams09ad6f92019-12-19 17:05:18 +0000123 BOOST_CHECK(profilingService.GetCurrentState() == ProfilingState::WaitingForAck);
Keith Davis3201eea2019-10-24 17:30:41 +0100124
125 profilingService.Update();
Finn Williams09ad6f92019-12-19 17:05:18 +0000126 // First packet sent will be the SendStreamMetaDataPacket, it's possible though unlikely that it will be sent twice
127 // The second or possibly third packet will be the CounterDirectoryPacket which means the
128 // ConnectionAcknowledgedCommandHandler has set the state to active
129 uint32_t packetCount = 0;
130 while(profilingService.GetCurrentState() != ProfilingState::Active && packetCount < 3)
Keith Davis3201eea2019-10-24 17:30:41 +0100131 {
Finn Williams09ad6f92019-12-19 17:05:18 +0000132 if(!helper.WaitForPacketsSent())
Keith Davis3201eea2019-10-24 17:30:41 +0100133 {
Finn Williams09ad6f92019-12-19 17:05:18 +0000134 BOOST_FAIL("Timeout waiting for packets");
Keith Davis3201eea2019-10-24 17:30:41 +0100135 }
Finn Williams09ad6f92019-12-19 17:05:18 +0000136 packetCount++;
Keith Davis3201eea2019-10-24 17:30:41 +0100137 }
138
Finn Williams09ad6f92019-12-19 17:05:18 +0000139 BOOST_CHECK(profilingService.GetCurrentState() == ProfilingState::Active);
Keith Davis3201eea2019-10-24 17:30:41 +0100140 // Minimum test here is to check that the file was created.
141 BOOST_CHECK(boost::filesystem::exists(tempPath.c_str()) == true);
142
143 // Increment a counter.
144 BOOST_CHECK(profilingService.IsCounterRegistered(0) == true);
145 profilingService.IncrementCounterValue(0);
Finn Williamsf3fcf322020-05-11 14:38:02 +0100146 BOOST_CHECK(profilingService.GetAbsoluteCounterValue(0) > 0);
147 BOOST_CHECK(profilingService.GetDeltaCounterValue(0) > 0);
Keith Davis3201eea2019-10-24 17:30:41 +0100148
149 // At this point the profiling service is active and we've activated all the counters. Waiting a collection
150 // period should be enough to have some data in the file.
151
152 // Wait for 1 collection period plus a bit of overhead..
Finn Williams09ad6f92019-12-19 17:05:18 +0000153 helper.WaitForPacketsSent();
Keith Davis3201eea2019-10-24 17:30:41 +0100154
155 // In order to flush the files we need to gracefully close the profiling service.
156 options.m_EnableProfiling = false;
157 profilingService.ResetExternalProfilingOptions(options, true);
Keith Davis3201eea2019-10-24 17:30:41 +0100158
159 // The output file size should be greater than 0.
Rob Hughesbdee4262020-01-07 17:05:24 +0000160 BOOST_CHECK(armnnUtils::Filesystem::GetFileSize(tempPath.string().c_str()) > 0);
Keith Davis3201eea2019-10-24 17:30:41 +0100161
162 // Delete the tmp file.
Rob Hughesbdee4262020-01-07 17:05:24 +0000163 BOOST_CHECK(armnnUtils::Filesystem::Remove(tempPath.string().c_str()));
Keith Davis3201eea2019-10-24 17:30:41 +0100164}
165
166BOOST_AUTO_TEST_SUITE_END()