1 // 2 // Copyright © 2020 Arm Ltd and Contributors. All rights reserved. 3 // SPDX-License-Identifier: MIT 4 // 5 6 #pragma once 7 8 #include <Holder.hpp> 9 #include <IProfilingConnectionFactory.hpp> 10 #include <IProfilingServiceStatus.hpp> 11 #include <ProfilingService.hpp> 12 #include <ProfilingGuidGenerator.hpp> 13 #include <ProfilingUtils.hpp> 14 #include <SendCounterPacket.hpp> 15 #include <SendThread.hpp> 16 17 #include <armnn/Exceptions.hpp> 18 #include <armnn/Optional.hpp> 19 #include <armnn/Conversion.hpp> 20 #include <armnn/utility/Assert.hpp> 21 #include <armnn/utility/IgnoreUnused.hpp> 22 #include <armnn/utility/NumericCast.hpp> 23 24 #include <atomic> 25 #include <condition_variable> 26 #include <mutex> 27 #include <thread> 28 29 namespace armnn 30 { 31 32 namespace profiling 33 { 34 35 class MockProfilingConnection : public IProfilingConnection 36 { 37 public: MockProfilingConnection()38 MockProfilingConnection() 39 : m_IsOpen(true) 40 , m_WrittenData() 41 , m_Packet() 42 {} 43 44 enum class PacketType 45 { 46 StreamMetaData, 47 ConnectionAcknowledge, 48 CounterDirectory, 49 ReqCounterDirectory, 50 PeriodicCounterSelection, 51 PerJobCounterSelection, 52 TimelineMessageDirectory, 53 PeriodicCounterCapture, 54 ActivateTimelineReporting, 55 DeactivateTimelineReporting, 56 Unknown 57 }; 58 IsOpen() const59 bool IsOpen() const override 60 { 61 std::lock_guard<std::mutex> lock(m_Mutex); 62 63 return m_IsOpen; 64 } 65 Close()66 void Close() override 67 { 68 std::lock_guard<std::mutex> lock(m_Mutex); 69 70 m_IsOpen = false; 71 } 72 WritePacket(const unsigned char * buffer,uint32_t length)73 bool WritePacket(const unsigned char* buffer, uint32_t length) override 74 { 75 if (buffer == nullptr || length == 0) 76 { 77 return false; 78 } 79 80 uint32_t header = ReadUint32(buffer, 0); 81 82 uint32_t packetFamily = (header >> 26); 83 uint32_t packetId = ((header >> 16) & 1023); 84 85 PacketType packetType; 86 87 switch (packetFamily) 88 { 89 case 0: 90 packetType = packetId < 8 ? PacketType(packetId) : PacketType::Unknown; 91 break; 92 case 1: 93 packetType = packetId == 0 ? PacketType::TimelineMessageDirectory : PacketType::Unknown; 94 break; 95 case 3: 96 packetType = packetId == 0 ? PacketType::PeriodicCounterCapture : PacketType::Unknown; 97 break; 98 default: 99 packetType = PacketType::Unknown; 100 } 101 102 std::lock_guard<std::mutex> lock(m_Mutex); 103 104 m_WrittenData.push_back({ packetType, length }); 105 return true; 106 } 107 CheckForPacket(const std::pair<PacketType,uint32_t> packetInfo)108 long CheckForPacket(const std::pair<PacketType, uint32_t> packetInfo) 109 { 110 std::lock_guard<std::mutex> lock(m_Mutex); 111 112 if(packetInfo.second != 0) 113 { 114 return static_cast<long>(std::count(m_WrittenData.begin(), m_WrittenData.end(), packetInfo)); 115 } 116 else 117 { 118 return static_cast<long>(std::count_if(m_WrittenData.begin(), m_WrittenData.end(), 119 [&packetInfo](const std::pair<PacketType, uint32_t> pair) { return packetInfo.first == pair.first; })); 120 } 121 } 122 WritePacket(arm::pipe::Packet && packet)123 bool WritePacket(arm::pipe::Packet&& packet) 124 { 125 std::lock_guard<std::mutex> lock(m_Mutex); 126 127 m_Packet = std::move(packet); 128 return true; 129 } 130 ReadPacket(uint32_t timeout)131 arm::pipe::Packet ReadPacket(uint32_t timeout) override 132 { 133 IgnoreUnused(timeout); 134 135 // Simulate a delay in the reading process. The default timeout is way too long. 136 std::this_thread::sleep_for(std::chrono::milliseconds(5)); 137 std::lock_guard<std::mutex> lock(m_Mutex); 138 return std::move(m_Packet); 139 } 140 GetWrittenDataSize()141 unsigned long GetWrittenDataSize() 142 { 143 std::lock_guard<std::mutex> lock(m_Mutex); 144 145 return static_cast<unsigned long>(m_WrittenData.size()); 146 } 147 Clear()148 void Clear() 149 { 150 std::lock_guard<std::mutex> lock(m_Mutex); 151 152 m_WrittenData.clear(); 153 } 154 155 private: 156 bool m_IsOpen; 157 std::vector<std::pair<PacketType, uint32_t>> m_WrittenData; 158 arm::pipe::Packet m_Packet; 159 mutable std::mutex m_Mutex; 160 }; 161 162 class MockProfilingConnectionFactory : public IProfilingConnectionFactory 163 { 164 public: GetProfilingConnection(const ExternalProfilingOptions & options) const165 IProfilingConnectionPtr GetProfilingConnection(const ExternalProfilingOptions& options) const override 166 { 167 IgnoreUnused(options); 168 return std::make_unique<MockProfilingConnection>(); 169 } 170 }; 171 172 class MockPacketBuffer : public IPacketBuffer 173 { 174 public: MockPacketBuffer(unsigned int maxSize)175 MockPacketBuffer(unsigned int maxSize) 176 : m_MaxSize(maxSize) 177 , m_Size(0) 178 , m_Data(std::make_unique<unsigned char[]>(m_MaxSize)) 179 {} 180 ~MockPacketBuffer()181 ~MockPacketBuffer() {} 182 GetReadableData() const183 const unsigned char* GetReadableData() const override { return m_Data.get(); } 184 GetSize() const185 unsigned int GetSize() const override { return m_Size; } 186 MarkRead()187 void MarkRead() override { m_Size = 0; } 188 Commit(unsigned int size)189 void Commit(unsigned int size) override { m_Size = size; } 190 Release()191 void Release() override { m_Size = 0; } 192 GetWritableData()193 unsigned char* GetWritableData() override { return m_Data.get(); } 194 Destroy()195 void Destroy() override {m_Data.reset(nullptr); m_Size = 0; m_MaxSize =0;} 196 197 private: 198 unsigned int m_MaxSize; 199 unsigned int m_Size; 200 std::unique_ptr<unsigned char[]> m_Data; 201 }; 202 203 class MockBufferManager : public IBufferManager 204 { 205 public: MockBufferManager(unsigned int size)206 MockBufferManager(unsigned int size) 207 : m_BufferSize(size), 208 m_Buffer(std::make_unique<MockPacketBuffer>(size)) {} 209 ~MockBufferManager()210 ~MockBufferManager() {} 211 Reserve(unsigned int requestedSize,unsigned int & reservedSize)212 IPacketBufferPtr Reserve(unsigned int requestedSize, unsigned int& reservedSize) override 213 { 214 if (requestedSize > m_BufferSize) 215 { 216 reservedSize = m_BufferSize; 217 } 218 else 219 { 220 reservedSize = requestedSize; 221 } 222 223 return std::move(m_Buffer); 224 } 225 Commit(IPacketBufferPtr & packetBuffer,unsigned int size,bool notifyConsumer=true)226 void Commit(IPacketBufferPtr& packetBuffer, unsigned int size, bool notifyConsumer = true) override 227 { 228 packetBuffer->Commit(size); 229 m_Buffer = std::move(packetBuffer); 230 231 if (notifyConsumer) 232 { 233 FlushReadList(); 234 } 235 } 236 GetReadableBuffer()237 IPacketBufferPtr GetReadableBuffer() override 238 { 239 return std::move(m_Buffer); 240 } 241 Release(IPacketBufferPtr & packetBuffer)242 void Release(IPacketBufferPtr& packetBuffer) override 243 { 244 packetBuffer->Release(); 245 m_Buffer = std::move(packetBuffer); 246 } 247 MarkRead(IPacketBufferPtr & packetBuffer)248 void MarkRead(IPacketBufferPtr& packetBuffer) override 249 { 250 packetBuffer->MarkRead(); 251 m_Buffer = std::move(packetBuffer); 252 } 253 SetConsumer(IConsumer * consumer)254 void SetConsumer(IConsumer* consumer) override 255 { 256 if (consumer != nullptr) 257 { 258 m_Consumer = consumer; 259 } 260 } 261 FlushReadList()262 void FlushReadList() override 263 { 264 // notify consumer that packet is ready to read 265 if (m_Consumer != nullptr) 266 { 267 m_Consumer->SetReadyToRead(); 268 } 269 } 270 271 private: 272 unsigned int m_BufferSize; 273 IPacketBufferPtr m_Buffer; 274 IConsumer* m_Consumer = nullptr; 275 }; 276 277 class MockStreamCounterBuffer : public IBufferManager 278 { 279 public: MockStreamCounterBuffer(unsigned int maxBufferSize=4096)280 MockStreamCounterBuffer(unsigned int maxBufferSize = 4096) 281 : m_MaxBufferSize(maxBufferSize) 282 , m_BufferList() 283 , m_CommittedSize(0) 284 , m_ReadableSize(0) 285 , m_ReadSize(0) 286 {} ~MockStreamCounterBuffer()287 ~MockStreamCounterBuffer() {} 288 Reserve(unsigned int requestedSize,unsigned int & reservedSize)289 IPacketBufferPtr Reserve(unsigned int requestedSize, unsigned int& reservedSize) override 290 { 291 std::lock_guard<std::mutex> lock(m_Mutex); 292 293 reservedSize = 0; 294 if (requestedSize > m_MaxBufferSize) 295 { 296 throw armnn::InvalidArgumentException("The maximum buffer size that can be requested is [" + 297 std::to_string(m_MaxBufferSize) + "] bytes"); 298 } 299 reservedSize = requestedSize; 300 return std::make_unique<MockPacketBuffer>(requestedSize); 301 } 302 Commit(IPacketBufferPtr & packetBuffer,unsigned int size,bool notifyConsumer=true)303 void Commit(IPacketBufferPtr& packetBuffer, unsigned int size, bool notifyConsumer = true) override 304 { 305 std::lock_guard<std::mutex> lock(m_Mutex); 306 307 packetBuffer->Commit(size); 308 m_BufferList.push_back(std::move(packetBuffer)); 309 m_CommittedSize += size; 310 311 if (notifyConsumer) 312 { 313 FlushReadList(); 314 } 315 } 316 Release(IPacketBufferPtr & packetBuffer)317 void Release(IPacketBufferPtr& packetBuffer) override 318 { 319 std::lock_guard<std::mutex> lock(m_Mutex); 320 321 packetBuffer->Release(); 322 } 323 GetReadableBuffer()324 IPacketBufferPtr GetReadableBuffer() override 325 { 326 std::lock_guard<std::mutex> lock(m_Mutex); 327 328 if (m_BufferList.empty()) 329 { 330 return nullptr; 331 } 332 IPacketBufferPtr buffer = std::move(m_BufferList.back()); 333 m_BufferList.pop_back(); 334 m_ReadableSize += buffer->GetSize(); 335 return buffer; 336 } 337 MarkRead(IPacketBufferPtr & packetBuffer)338 void MarkRead(IPacketBufferPtr& packetBuffer) override 339 { 340 std::lock_guard<std::mutex> lock(m_Mutex); 341 342 m_ReadSize += packetBuffer->GetSize(); 343 packetBuffer->MarkRead(); 344 } 345 SetConsumer(IConsumer * consumer)346 void SetConsumer(IConsumer* consumer) override 347 { 348 if (consumer != nullptr) 349 { 350 m_Consumer = consumer; 351 } 352 } 353 FlushReadList()354 void FlushReadList() override 355 { 356 // notify consumer that packet is ready to read 357 if (m_Consumer != nullptr) 358 { 359 m_Consumer->SetReadyToRead(); 360 } 361 } 362 GetCommittedSize() const363 unsigned int GetCommittedSize() const { return m_CommittedSize; } GetReadableSize() const364 unsigned int GetReadableSize() const { return m_ReadableSize; } GetReadSize() const365 unsigned int GetReadSize() const { return m_ReadSize; } 366 367 private: 368 // The maximum buffer size when creating a new buffer 369 unsigned int m_MaxBufferSize; 370 371 // A list of buffers 372 std::vector<IPacketBufferPtr> m_BufferList; 373 374 // The mutex to synchronize this mock's methods 375 std::mutex m_Mutex; 376 377 // The total size of the buffers that has been committed for reading 378 unsigned int m_CommittedSize; 379 380 // The total size of the buffers that can be read 381 unsigned int m_ReadableSize; 382 383 // The total size of the buffers that has already been read 384 unsigned int m_ReadSize; 385 386 // Consumer thread to notify packet is ready to read 387 IConsumer* m_Consumer = nullptr; 388 }; 389 390 class MockSendCounterPacket : public ISendCounterPacket 391 { 392 public: MockSendCounterPacket(IBufferManager & sendBuffer)393 MockSendCounterPacket(IBufferManager& sendBuffer) : m_BufferManager(sendBuffer) {} 394 SendStreamMetaDataPacket()395 void SendStreamMetaDataPacket() override 396 { 397 std::string message("SendStreamMetaDataPacket"); 398 unsigned int reserved = 0; 399 IPacketBufferPtr buffer = m_BufferManager.Reserve(1024, reserved); 400 memcpy(buffer->GetWritableData(), message.c_str(), static_cast<unsigned int>(message.size()) + 1); 401 m_BufferManager.Commit(buffer, reserved, false); 402 } 403 SendCounterDirectoryPacket(const ICounterDirectory & counterDirectory)404 void SendCounterDirectoryPacket(const ICounterDirectory& counterDirectory) override 405 { 406 IgnoreUnused(counterDirectory); 407 408 std::string message("SendCounterDirectoryPacket"); 409 unsigned int reserved = 0; 410 IPacketBufferPtr buffer = m_BufferManager.Reserve(1024, reserved); 411 memcpy(buffer->GetWritableData(), message.c_str(), static_cast<unsigned int>(message.size()) + 1); 412 m_BufferManager.Commit(buffer, reserved); 413 } 414 SendPeriodicCounterCapturePacket(uint64_t timestamp,const std::vector<CounterValue> & values)415 void SendPeriodicCounterCapturePacket(uint64_t timestamp, 416 const std::vector<CounterValue>& values) override 417 { 418 IgnoreUnused(timestamp, values); 419 420 std::string message("SendPeriodicCounterCapturePacket"); 421 unsigned int reserved = 0; 422 IPacketBufferPtr buffer = m_BufferManager.Reserve(1024, reserved); 423 memcpy(buffer->GetWritableData(), message.c_str(), static_cast<unsigned int>(message.size()) + 1); 424 m_BufferManager.Commit(buffer, reserved); 425 } 426 SendPeriodicCounterSelectionPacket(uint32_t capturePeriod,const std::vector<uint16_t> & selectedCounterIds)427 void SendPeriodicCounterSelectionPacket(uint32_t capturePeriod, 428 const std::vector<uint16_t>& selectedCounterIds) override 429 { 430 IgnoreUnused(capturePeriod, selectedCounterIds); 431 432 std::string message("SendPeriodicCounterSelectionPacket"); 433 unsigned int reserved = 0; 434 IPacketBufferPtr buffer = m_BufferManager.Reserve(1024, reserved); 435 memcpy(buffer->GetWritableData(), message.c_str(), static_cast<unsigned int>(message.size()) + 1); 436 m_BufferManager.Commit(buffer, reserved); 437 } 438 439 private: 440 IBufferManager& m_BufferManager; 441 }; 442 443 class MockCounterDirectory : public ICounterDirectory 444 { 445 public: 446 MockCounterDirectory() = default; 447 ~MockCounterDirectory() = default; 448 449 // Register profiling objects RegisterCategory(const std::string & categoryName)450 const Category* RegisterCategory(const std::string& categoryName) 451 { 452 // Create the category 453 CategoryPtr category = std::make_unique<Category>(categoryName); 454 ARMNN_ASSERT(category); 455 456 // Get the raw category pointer 457 const Category* categoryPtr = category.get(); 458 ARMNN_ASSERT(categoryPtr); 459 460 // Register the category 461 m_Categories.insert(std::move(category)); 462 463 return categoryPtr; 464 } 465 RegisterDevice(const std::string & deviceName,uint16_t cores=0)466 const Device* RegisterDevice(const std::string& deviceName, 467 uint16_t cores = 0) 468 { 469 // Get the device UID 470 uint16_t deviceUid = GetNextUid(); 471 472 // Create the device 473 DevicePtr device = std::make_unique<Device>(deviceUid, deviceName, cores); 474 ARMNN_ASSERT(device); 475 476 // Get the raw device pointer 477 const Device* devicePtr = device.get(); 478 ARMNN_ASSERT(devicePtr); 479 480 // Register the device 481 m_Devices.insert(std::make_pair(deviceUid, std::move(device))); 482 483 return devicePtr; 484 } 485 RegisterCounterSet(const std::string & counterSetName,uint16_t count=0)486 const CounterSet* RegisterCounterSet( 487 const std::string& counterSetName, 488 uint16_t count = 0) 489 { 490 // Get the counter set UID 491 uint16_t counterSetUid = GetNextUid(); 492 493 // Create the counter set 494 CounterSetPtr counterSet = std::make_unique<CounterSet>(counterSetUid, counterSetName, count); 495 ARMNN_ASSERT(counterSet); 496 497 // Get the raw counter set pointer 498 const CounterSet* counterSetPtr = counterSet.get(); 499 ARMNN_ASSERT(counterSetPtr); 500 501 // Register the counter set 502 m_CounterSets.insert(std::make_pair(counterSetUid, std::move(counterSet))); 503 504 return counterSetPtr; 505 } 506 RegisterCounter(const BackendId & backendId,const uint16_t uid,const std::string & parentCategoryName,uint16_t counterClass,uint16_t interpolation,double multiplier,const std::string & name,const std::string & description,const armnn::Optional<std::string> & units=armnn::EmptyOptional (),const armnn::Optional<uint16_t> & numberOfCores=armnn::EmptyOptional (),const armnn::Optional<uint16_t> & deviceUid=armnn::EmptyOptional (),const armnn::Optional<uint16_t> & counterSetUid=armnn::EmptyOptional ())507 const Counter* RegisterCounter(const BackendId& backendId, 508 const uint16_t uid, 509 const std::string& parentCategoryName, 510 uint16_t counterClass, 511 uint16_t interpolation, 512 double multiplier, 513 const std::string& name, 514 const std::string& description, 515 const armnn::Optional<std::string>& units = armnn::EmptyOptional(), 516 const armnn::Optional<uint16_t>& numberOfCores = armnn::EmptyOptional(), 517 const armnn::Optional<uint16_t>& deviceUid = armnn::EmptyOptional(), 518 const armnn::Optional<uint16_t>& counterSetUid = armnn::EmptyOptional()) 519 { 520 IgnoreUnused(backendId); 521 522 // Get the number of cores from the argument only 523 uint16_t deviceCores = numberOfCores.has_value() ? numberOfCores.value() : 0; 524 525 // Get the device UID 526 uint16_t deviceUidValue = deviceUid.has_value() ? deviceUid.value() : 0; 527 528 // Get the counter set UID 529 uint16_t counterSetUidValue = counterSetUid.has_value() ? counterSetUid.value() : 0; 530 531 // Get the counter UIDs and calculate the max counter UID 532 std::vector<uint16_t> counterUids = GetNextCounterUids(uid, deviceCores); 533 ARMNN_ASSERT(!counterUids.empty()); 534 uint16_t maxCounterUid = deviceCores <= 1 ? counterUids.front() : counterUids.back(); 535 536 // Get the counter units 537 const std::string unitsValue = units.has_value() ? units.value() : ""; 538 539 // Create the counter 540 CounterPtr counter = std::make_shared<Counter>(armnn::profiling::BACKEND_ID, 541 counterUids.front(), 542 maxCounterUid, 543 counterClass, 544 interpolation, 545 multiplier, 546 name, 547 description, 548 unitsValue, 549 deviceUidValue, 550 counterSetUidValue); 551 ARMNN_ASSERT(counter); 552 553 // Get the raw counter pointer 554 const Counter* counterPtr = counter.get(); 555 ARMNN_ASSERT(counterPtr); 556 557 // Process multiple counters if necessary 558 for (uint16_t counterUid : counterUids) 559 { 560 // Connect the counter to the parent category 561 Category* parentCategory = const_cast<Category*>(GetCategory(parentCategoryName)); 562 ARMNN_ASSERT(parentCategory); 563 parentCategory->m_Counters.push_back(counterUid); 564 565 // Register the counter 566 m_Counters.insert(std::make_pair(counterUid, counter)); 567 } 568 569 return counterPtr; 570 } 571 572 // Getters for counts GetCategoryCount() const573 uint16_t GetCategoryCount() const override { return armnn::numeric_cast<uint16_t>(m_Categories.size()); } GetDeviceCount() const574 uint16_t GetDeviceCount() const override { return armnn::numeric_cast<uint16_t>(m_Devices.size()); } GetCounterSetCount() const575 uint16_t GetCounterSetCount() const override { return armnn::numeric_cast<uint16_t>(m_CounterSets.size()); } GetCounterCount() const576 uint16_t GetCounterCount() const override { return armnn::numeric_cast<uint16_t>(m_Counters.size()); } 577 578 // Getters for collections GetCategories() const579 const Categories& GetCategories() const override { return m_Categories; } GetDevices() const580 const Devices& GetDevices() const override { return m_Devices; } GetCounterSets() const581 const CounterSets& GetCounterSets() const override { return m_CounterSets; } GetCounters() const582 const Counters& GetCounters() const override { return m_Counters; } 583 584 // Getters for profiling objects GetCategory(const std::string & name) const585 const Category* GetCategory(const std::string& name) const override 586 { 587 auto it = std::find_if(m_Categories.begin(), m_Categories.end(), [&name](const CategoryPtr& category) 588 { 589 ARMNN_ASSERT(category); 590 591 return category->m_Name == name; 592 }); 593 594 if (it == m_Categories.end()) 595 { 596 return nullptr; 597 } 598 599 return it->get(); 600 } 601 GetDevice(uint16_t uid) const602 const Device* GetDevice(uint16_t uid) const override 603 { 604 IgnoreUnused(uid); 605 return nullptr; // Not used by the unit tests 606 } 607 GetCounterSet(uint16_t uid) const608 const CounterSet* GetCounterSet(uint16_t uid) const override 609 { 610 IgnoreUnused(uid); 611 return nullptr; // Not used by the unit tests 612 } 613 GetCounter(uint16_t uid) const614 const Counter* GetCounter(uint16_t uid) const override 615 { 616 IgnoreUnused(uid); 617 return nullptr; // Not used by the unit tests 618 } 619 620 private: 621 Categories m_Categories; 622 Devices m_Devices; 623 CounterSets m_CounterSets; 624 Counters m_Counters; 625 }; 626 627 class MockProfilingService : public ProfilingService 628 { 629 public: MockProfilingService(MockBufferManager & mockBufferManager,bool isProfilingEnabled,const CaptureData & captureData)630 MockProfilingService(MockBufferManager& mockBufferManager, 631 bool isProfilingEnabled, 632 const CaptureData& captureData) : 633 m_SendCounterPacket(mockBufferManager), 634 m_IsProfilingEnabled(isProfilingEnabled), 635 m_CaptureData(captureData) 636 {} 637 638 /// Return the next random Guid in the sequence NextGuid()639 ProfilingDynamicGuid NextGuid() override 640 { 641 return m_GuidGenerator.NextGuid(); 642 } 643 644 /// Create a ProfilingStaticGuid based on a hash of the string GenerateStaticId(const std::string & str)645 ProfilingStaticGuid GenerateStaticId(const std::string& str) override 646 { 647 return m_GuidGenerator.GenerateStaticId(str); 648 } 649 GetSendTimelinePacket() const650 std::unique_ptr<ISendTimelinePacket> GetSendTimelinePacket() const override 651 { 652 return nullptr; 653 } 654 GetCounterMappings() const655 const ICounterMappings& GetCounterMappings() const override 656 { 657 return m_CounterMapping; 658 } 659 GetSendCounterPacket()660 ISendCounterPacket& GetSendCounterPacket() override 661 { 662 return m_SendCounterPacket; 663 } 664 IsProfilingEnabled() const665 bool IsProfilingEnabled() const override 666 { 667 return m_IsProfilingEnabled; 668 } 669 GetCaptureData()670 CaptureData GetCaptureData() override 671 { 672 CaptureData copy(m_CaptureData); 673 return copy; 674 } 675 RegisterMapping(uint16_t globalCounterId,uint16_t backendCounterId,const armnn::BackendId & backendId)676 void RegisterMapping(uint16_t globalCounterId, 677 uint16_t backendCounterId, 678 const armnn::BackendId& backendId) 679 { 680 m_CounterMapping.RegisterMapping(globalCounterId, backendCounterId, backendId); 681 } 682 Reset()683 void Reset() 684 { 685 m_CounterMapping.Reset(); 686 } 687 688 private: 689 ProfilingGuidGenerator m_GuidGenerator; 690 CounterIdMap m_CounterMapping; 691 SendCounterPacket m_SendCounterPacket; 692 bool m_IsProfilingEnabled; 693 CaptureData m_CaptureData; 694 }; 695 696 class MockProfilingServiceStatus : public IProfilingServiceStatus 697 { 698 public: NotifyProfilingServiceActive()699 void NotifyProfilingServiceActive() override {} WaitForProfilingServiceActivation(unsigned int timeout)700 void WaitForProfilingServiceActivation(unsigned int timeout) override { IgnoreUnused(timeout); } 701 }; 702 703 } // namespace profiling 704 705 } // namespace armnn 706