aboutsummaryrefslogtreecommitdiff
path: root/src/armnn/Profiling.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/armnn/Profiling.cpp')
-rw-r--r--src/armnn/Profiling.cpp101
1 files changed, 59 insertions, 42 deletions
diff --git a/src/armnn/Profiling.cpp b/src/armnn/Profiling.cpp
index 171d22bd0f..509e9dec08 100644
--- a/src/armnn/Profiling.cpp
+++ b/src/armnn/Profiling.cpp
@@ -6,7 +6,6 @@
#include <armnn/BackendId.hpp>
#include <armnn/utility/Assert.hpp>
-#include <armnn/utility/IgnoreUnused.hpp>
#include "JsonPrinter.hpp"
@@ -156,8 +155,8 @@ void ProfilerImpl::AnalyzeEventSequenceAndWriteResults(ItertType first, ItertTyp
const double avgMs = eventStats.m_TotalMs / double(eventStats.m_Count);
outStream << "\t" << std::setw(50) << eventLabel << " " << std::setw(9) << avgMs << " "
- << std::setw(9) << eventStats.m_MinMs << " " << std::setw(9) << eventStats.m_MaxMs << " "
- << std::setw(9) << eventStats.m_TotalMs << " " << std::setw(9) << eventStats.m_Count << std::endl;
+ << std::setw(9) << eventStats.m_MinMs << " " << std::setw(9) << eventStats.m_MaxMs << " "
+ << std::setw(9) << eventStats.m_TotalMs << " " << std::setw(9) << eventStats.m_Count << std::endl;
}
outStream << std::endl;
}
@@ -198,12 +197,18 @@ void ProfilerImpl::EnableProfiling(bool enableProfiling)
}
Event* ProfilerImpl::BeginEvent(armnn::IProfiler* profiler,
- const BackendId& backendId,
- const std::string& label,
- std::vector<InstrumentPtr>&& instruments)
+ const BackendId& backendId,
+ const std::string& label,
+ std::vector<InstrumentPtr>&& instruments,
+ const Optional<profiling::ProfilingGuid>& guid)
{
Event* parent = m_Parents.empty() ? nullptr : m_Parents.top();
- m_EventSequence.push_back(std::make_unique<Event>(label, profiler, parent, backendId, std::move(instruments)));
+ m_EventSequence.push_back(std::make_unique<Event>(label,
+ profiler,
+ parent,
+ backendId,
+ std::move(instruments),
+ guid));
Event* event = m_EventSequence.back().get();
event->Start();
@@ -234,7 +239,7 @@ void ProfilerImpl::EndEvent(Event* event)
int CalcLevel(const Event* eventPtr)
{
- int level=0;
+ int level = 0;
while (eventPtr != nullptr)
{
eventPtr = eventPtr->GetParentEvent();
@@ -272,7 +277,7 @@ void ProfilerImpl::PopulateDescendants(std::map<const Event*, std::vector<const
auto it = outDescendantsMap.find(parent);
if (it == outDescendantsMap.end())
{
- outDescendantsMap.emplace(parent, std::vector<const Event*>({eventPtrRaw}));
+ outDescendantsMap.emplace(parent, std::vector<const Event*>({ eventPtrRaw }));
}
else
{
@@ -295,14 +300,22 @@ void ExtractJsonObjects(unsigned int inferenceIndex,
std::map<const Event*, std::vector<const Event*>> descendantsMap)
{
ARMNN_ASSERT(parentEvent);
+
+ // If profiling GUID is entered, process it
+ if (parentEvent->GetProfilingGuid().has_value())
+ {
+ profiling::ProfilingGuid profilingGuid;
+ profilingGuid = parentEvent->GetProfilingGuid().value();
+ parentObject.SetGuid(profilingGuid);
+ }
std::vector<Measurement> instrumentMeasurements = parentEvent->GetMeasurements();
- unsigned int childIdx=0;
- for(size_t measurementIndex = 0; measurementIndex < instrumentMeasurements.size(); ++measurementIndex, ++childIdx)
+ unsigned int childIdx = 0;
+ for (size_t measurementIndex = 0; measurementIndex < instrumentMeasurements.size(); ++measurementIndex, ++childIdx)
{
if (inferenceIndex == 0)
{
// Only add kernel measurement once, in case of multiple inferences
- JsonChildObject measurementObject{instrumentMeasurements[measurementIndex].m_Name};
+ JsonChildObject measurementObject{ instrumentMeasurements[measurementIndex].m_Name };
measurementObject.SetUnit(instrumentMeasurements[measurementIndex].m_Unit);
measurementObject.SetType(JsonObjectType::Measurement);
@@ -313,7 +326,6 @@ void ExtractJsonObjects(unsigned int inferenceIndex,
parentObject.GetChild(childIdx).AddMeasurement(instrumentMeasurements[measurementIndex].m_Value);
}
-
auto childEventsIt = descendantsMap.find(parentEvent);
if (childEventsIt != descendantsMap.end())
{
@@ -322,7 +334,7 @@ void ExtractJsonObjects(unsigned int inferenceIndex,
if (inferenceIndex == 0)
{
// Only add second level once, in case of multiple inferences
- JsonChildObject childObject{childEvent->GetName()};
+ JsonChildObject childObject{ childEvent->GetName() };
childObject.SetType(JsonObjectType::Event);
parentObject.AddChild(childObject);
}
@@ -353,7 +365,7 @@ void ProfilerImpl::Print(std::ostream& outStream) const
std::map<const Event*, std::vector<const Event*>> descendantsMap;
PopulateDescendants(descendantsMap);
- JsonChildObject inferenceObject{"inference_measurements"};
+ JsonChildObject inferenceObject{ "inference_measurements" };
std::vector<JsonChildObject> workloadObjects;
std::map<unsigned int, std::vector<JsonChildObject>> workloadToKernelObjects;
@@ -368,15 +380,15 @@ void ProfilerImpl::Print(std::ostream& outStream) const
if (m_ProfilingDetails.get()->DetailsExist())
{
- JsonChildObject detailsObject{"layer_details"};
+ JsonChildObject detailsObject{ "layer_details" };
ConfigureDetailsObject(detailsObject, m_ProfilingDetails.get()->GetProfilingDetails());
- size_t id=0;
+ size_t id = 0;
printer.PrintJsonChildObject(detailsObject, id);
}
// print inference object, also prints child layer and kernel measurements
- size_t id=0;
+ size_t id = 0;
printer.PrintJsonChildObject(inferenceObject, id);
// end of ArmNN
@@ -403,9 +415,9 @@ void ProfilerImpl::AnalyzeEventsAndWriteResults(std::ostream& outStream) const
if (!saneMarkerSequence)
{
outStream << "Cannot write profiling stats. "
- "Unexpected errors were found when analyzing the sequence of logged events, which may lead to plainly "
- "wrong stats. The profiling system may contain implementation issues or could have been used in an "
- "unsafe manner." << std::endl;
+ "Unexpected errors were found when analyzing the sequence of logged events, "
+ "which may lead to plainly wrong stats. The profiling system may contain implementation "
+ "issues or could have been used in an unsafe manner." << std::endl;
return;
}
@@ -431,9 +443,8 @@ void ProfilerImpl::AnalyzeEventsAndWriteResults(std::ostream& outStream) const
std::map<const Event*, std::vector<const Event*>> descendantsMap;
PopulateDescendants(descendantsMap);
- std::function<void (const Event*, std::vector<const Event*>&)>
- FindDescendantEvents = [&](const Event* eventPtr,
- std::vector<const Event*>& sequence)
+ std::function<void(const Event*, std::vector<const Event*>&)>
+ FindDescendantEvents = [&](const Event* eventPtr, std::vector<const Event*>& sequence)
{
sequence.push_back(eventPtr);
@@ -481,26 +492,31 @@ std::uint32_t ProfilerImpl::GetEventColor(const BackendId& backendId) const
static BackendId cpuRef("CpuRef");
static BackendId cpuAcc("CpuAcc");
static BackendId gpuAcc("GpuAcc");
- if (backendId == cpuRef) {
- // Cyan
- return 0xffff001b;
- } else if (backendId == cpuAcc) {
- // Green
- return 0x00ff001b;
- } else if (backendId == gpuAcc) {
- // Purple
- return 0xff007f1b;
- } else {
- // Dark gray
- return 0x5555551b;
+ if (backendId == cpuRef)
+ {
+ // Cyan
+ return 0xffff001b;
+ }
+ else if (backendId == cpuAcc)
+ {
+ // Green
+ return 0x00ff001b;
+ }
+ else if (backendId == gpuAcc)
+ {
+ // Purple
+ return 0xff007f1b;
+ }
+ else
+ {
+ // Dark gray
+ return 0x5555551b;
}
}
// The thread_local pointer to the profiler instance.
thread_local IProfiler* tl_Profiler = nullptr;
-
-
ProfilerManager& ProfilerManager::GetInstance()
{
// Global reference to the single ProfileManager instance allowed.
@@ -518,7 +534,6 @@ IProfiler* ProfilerManager::GetProfiler()
return tl_Profiler;
}
-
void IProfiler::EnableProfiling(bool enableProfiling)
{
pProfilerImpl->EnableProfiling(enableProfiling);
@@ -541,12 +556,14 @@ void IProfiler::Print(std::ostream& outStream) const
Event* IProfiler::BeginEvent(const BackendId& backendId,
const std::string& label,
- std::vector<InstrumentPtr>&& instruments)
+ std::vector<InstrumentPtr>&& instruments,
+ const Optional<profiling::ProfilingGuid>& guid)
{
- return pProfilerImpl->BeginEvent(this, backendId, label, std::move(instruments));
+ return pProfilerImpl->BeginEvent(this, backendId, label, std::move(instruments), guid);
}
IProfiler::~IProfiler() = default;
-IProfiler::IProfiler() : pProfilerImpl(new ProfilerImpl()) {};
+IProfiler::IProfiler() : pProfilerImpl(new ProfilerImpl())
+{};
} // namespace armnn