From 1fdeb99ca83bac83e0cacb332880e2e62dd22198 Mon Sep 17 00:00:00 2001 From: Jim Flynn Date: Thu, 9 Jul 2020 07:28:37 +0100 Subject: IVGCVSW-5095 Make timeline report the Linux Thread ID not the pthread ID Change-Id: Id69519fd9ef57716de4e389ed4156710a904c701 Signed-off-by: Jim Flynn --- Android.mk | 1 + CMakeLists.txt | 6 +++-- include/armnn/profiling/ISendTimelinePacket.hpp | 5 ++-- src/armnnUtils/Threads.cpp | 31 ++++++++++++++++++++++ src/armnnUtils/Threads.hpp | 16 +++++++++++ src/profiling/ProfilingUtils.cpp | 4 +-- src/profiling/ProfilingUtils.hpp | 6 ++--- src/profiling/SendTimelinePacket.cpp | 4 +-- src/profiling/SendTimelinePacket.hpp | 4 +-- src/profiling/TimelineUtilityMethods.cpp | 6 ++--- src/profiling/test/ProfilingTestUtils.cpp | 5 ++-- src/profiling/test/ProfilingTestUtils.hpp | 2 +- src/profiling/test/SendTimelinePacketTests.cpp | 3 ++- src/profiling/test/TimelinePacketTests.cpp | 9 ++++--- src/timelineDecoder/tests/TimelineTests.cpp | 7 ++--- .../profiling/gatordmock/tests/GatordMockTests.cpp | 2 +- 16 files changed, 82 insertions(+), 29 deletions(-) create mode 100644 src/armnnUtils/Threads.cpp create mode 100644 src/armnnUtils/Threads.hpp diff --git a/Android.mk b/Android.mk index 38b2ad4008..781aba6d45 100644 --- a/Android.mk +++ b/Android.mk @@ -131,6 +131,7 @@ LOCAL_SRC_FILES := \ src/armnnUtils/VerificationHelpers.cpp \ src/armnnUtils/Filesystem.cpp \ src/armnnUtils/Processes.cpp \ + src/armnnUtils/Threads.cpp \ src/armnnUtils/Transpose.cpp \ src/armnn/layers/ActivationLayer.cpp \ src/armnn/layers/AdditionLayer.cpp \ diff --git a/CMakeLists.txt b/CMakeLists.txt index 968c57f9ef..2586d22f0c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,8 +45,6 @@ list(APPEND armnnUtils_sources src/armnnUtils/BFloat16.hpp src/armnnUtils/Filesystem.hpp src/armnnUtils/Filesystem.cpp - src/armnnUtils/Processes.hpp - src/armnnUtils/Processes.cpp src/armnnUtils/GraphTopologicalSort.hpp src/armnnUtils/Half.hpp src/armnnUtils/Permute.cpp @@ -67,11 +65,15 @@ list(APPEND armnnUtils_sources src/armnnUtils/ParserHelper.hpp src/armnnUtils/ParserHelper.cpp src/armnnUtils/ParserPrototxtFixture.hpp + src/armnnUtils/Processes.hpp + src/armnnUtils/Processes.cpp src/armnnUtils/PrototxtConversions.hpp src/armnnUtils/PrototxtConversions.cpp src/armnnUtils/QuantizeHelper.hpp src/armnnUtils/TensorIOUtils.hpp src/armnnUtils/TensorUtils.cpp + src/armnnUtils/Threads.hpp + src/armnnUtils/Threads.cpp src/armnnUtils/Transpose.cpp src/armnnUtils/WindowsWrapper.hpp ) diff --git a/include/armnn/profiling/ISendTimelinePacket.hpp b/include/armnn/profiling/ISendTimelinePacket.hpp index 0eba33361a..c5da5219f7 100644 --- a/include/armnn/profiling/ISendTimelinePacket.hpp +++ b/include/armnn/profiling/ISendTimelinePacket.hpp @@ -1,5 +1,5 @@ // -// Copyright © 2019 Arm Ltd. All rights reserved. +// Copyright © 2019 Arm Ltd and Contributors. All rights reserved. // SPDX-License-Identifier: MIT // @@ -7,7 +7,6 @@ #include #include -#include #include namespace armnn @@ -38,7 +37,7 @@ public: /// Create and write a TimelineEventBinaryPacket from the parameters to the buffer. virtual void - SendTimelineEventBinaryPacket(uint64_t timestamp, std::thread::id threadId, uint64_t profilingGuid) = 0; + SendTimelineEventBinaryPacket(uint64_t timestamp, int threadId, uint64_t profilingGuid) = 0; /// Create and write a TimelineEventClassBinaryPacket from the parameters to the buffer. virtual void SendTimelineEventClassBinaryPacket(uint64_t profilingGuid, uint64_t nameGuid) = 0; diff --git a/src/armnnUtils/Threads.cpp b/src/armnnUtils/Threads.cpp new file mode 100644 index 0000000000..561edcb8b7 --- /dev/null +++ b/src/armnnUtils/Threads.cpp @@ -0,0 +1,31 @@ +// +// Copyright © 2020 Arm Ltd and Contributors. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "Threads.hpp" + +#if defined(__linux__) +#include +#include +#define gettid() syscall(SYS_gettid) +#elif defined(_MSC_VER) +#include "WindowsWrapper.hpp" +#endif + +namespace armnnUtils +{ +namespace Threads +{ + +int GetCurrentThreadId() +{ +#if defined(__linux__) + return static_cast(gettid()); +#elif defined(_MSC_VER) + return ::GetCurrentThreadId(); +#endif +} + +} +} diff --git a/src/armnnUtils/Threads.hpp b/src/armnnUtils/Threads.hpp new file mode 100644 index 0000000000..4cecfd5079 --- /dev/null +++ b/src/armnnUtils/Threads.hpp @@ -0,0 +1,16 @@ +// +// Copyright © 2020 Arm Ltd and Contributors. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#pragma once + +namespace armnnUtils +{ +namespace Threads +{ + +int GetCurrentThreadId(); + +} +} diff --git a/src/profiling/ProfilingUtils.cpp b/src/profiling/ProfilingUtils.cpp index d67694fc33..3f6e56349b 100644 --- a/src/profiling/ProfilingUtils.cpp +++ b/src/profiling/ProfilingUtils.cpp @@ -802,7 +802,7 @@ TimelinePacketStatus WriteTimelineEventClassBinary(uint64_t profilingGuid, } TimelinePacketStatus WriteTimelineEventBinary(uint64_t timestamp, - std::thread::id threadId, + int threadId, uint64_t profilingGuid, unsigned char* buffer, unsigned int remainingBufferSize, @@ -1093,7 +1093,7 @@ Packet ReceivePacket(const unsigned char* buffer, uint32_t length) namespace std { -bool operator==(const std::vector& left, std::thread::id right) +bool operator==(const std::vector& left, int right) { return std::memcmp(left.data(), &right, left.size()) == 0; } diff --git a/src/profiling/ProfilingUtils.hpp b/src/profiling/ProfilingUtils.hpp index 95fa780934..2ead31652d 100644 --- a/src/profiling/ProfilingUtils.hpp +++ b/src/profiling/ProfilingUtils.hpp @@ -28,7 +28,7 @@ namespace armnn namespace profiling { -constexpr unsigned int ThreadIdSize = sizeof(std::thread::id); // Is platform dependent +constexpr unsigned int ThreadIdSize = sizeof(int); // Is platform dependent struct SwTraceHeader { @@ -245,7 +245,7 @@ TimelinePacketStatus WriteTimelineEventClassBinary(uint64_t profilingGuid, unsigned int& numberOfBytesWritten); TimelinePacketStatus WriteTimelineEventBinary(uint64_t timestamp, - std::thread::id threadId, + int threadId, uint64_t profilingGuid, unsigned char* buffer, unsigned int bufferSize, @@ -271,6 +271,6 @@ Packet ReceivePacket(const unsigned char* buffer, uint32_t length); namespace std { -bool operator==(const std::vector& left, std::thread::id right); +bool operator==(const std::vector& left, int right); } // namespace std diff --git a/src/profiling/SendTimelinePacket.cpp b/src/profiling/SendTimelinePacket.cpp index 2ca5f5470b..11e3d2f489 100644 --- a/src/profiling/SendTimelinePacket.cpp +++ b/src/profiling/SendTimelinePacket.cpp @@ -1,5 +1,5 @@ // -// Copyright © 2019 Arm Ltd. All rights reserved. +// Copyright © 2019 Arm Ltd and Contributors. All rights reserved. // SPDX-License-Identifier: MIT // @@ -89,7 +89,7 @@ void SendTimelinePacket::SendTimelineEntityBinaryPacket(uint64_t profilingGuid) } void SendTimelinePacket::SendTimelineEventBinaryPacket(uint64_t timestamp, - std::thread::id threadId, + int threadId, uint64_t profilingGuid) { ForwardWriteBinaryFunction(WriteTimelineEventBinary, diff --git a/src/profiling/SendTimelinePacket.hpp b/src/profiling/SendTimelinePacket.hpp index 2b710c7a25..90016d06f3 100644 --- a/src/profiling/SendTimelinePacket.hpp +++ b/src/profiling/SendTimelinePacket.hpp @@ -1,5 +1,5 @@ // -// Copyright © 2019 Arm Ltd. All rights reserved. +// Copyright © 2019 Arm Ltd and Contributors. All rights reserved. // SPDX-License-Identifier: MIT // @@ -36,7 +36,7 @@ public: void SendTimelineEntityBinaryPacket(uint64_t profilingGuid) override; /// Create and write a TimelineEventBinaryPacket from the parameters to the buffer. - void SendTimelineEventBinaryPacket(uint64_t timestamp, std::thread::id threadId, uint64_t profilingGuid) override; + void SendTimelineEventBinaryPacket(uint64_t timestamp, int threadId, uint64_t profilingGuid) override; /// Create and write a TimelineEventClassBinaryPacket from the parameters to the buffer. void SendTimelineEventClassBinaryPacket(uint64_t profilingGuid, uint64_t nameGuid) override; diff --git a/src/profiling/TimelineUtilityMethods.cpp b/src/profiling/TimelineUtilityMethods.cpp index 2727bd6e9b..fe5c6b1340 100644 --- a/src/profiling/TimelineUtilityMethods.cpp +++ b/src/profiling/TimelineUtilityMethods.cpp @@ -2,9 +2,9 @@ // Copyright © 2019 Arm Ltd and Contributors. All rights reserved. // SPDX-License-Identifier: MIT // - -#include "TimelineUtilityMethods.hpp" #include "LabelsAndEventClasses.hpp" +#include +#include "TimelineUtilityMethods.hpp" namespace armnn { @@ -368,7 +368,7 @@ ProfilingDynamicGuid TimelineUtilityMethods::RecordEvent(ProfilingGuid entityGui uint64_t timestamp = GetTimestamp(); // Get the thread id - std::thread::id threadId = std::this_thread::get_id(); + int threadId = armnnUtils::Threads::GetCurrentThreadId(); // Generate a GUID for the event ProfilingDynamicGuid eventGuid = profiling::ProfilingService::GetNextGuid(); diff --git a/src/profiling/test/ProfilingTestUtils.cpp b/src/profiling/test/ProfilingTestUtils.cpp index 9f6bc43be8..526f3f95fd 100644 --- a/src/profiling/test/ProfilingTestUtils.cpp +++ b/src/profiling/test/ProfilingTestUtils.cpp @@ -8,6 +8,7 @@ #include #include +#include #include #include @@ -295,7 +296,7 @@ ProfilingGuid VerifyTimelineEntityBinaryPacketData(Optional guid, } ProfilingGuid VerifyTimelineEventBinaryPacket(Optional timestamp, - Optional threadId, + Optional threadId, Optional eventGuid, const unsigned char* readableData, unsigned int& offset) @@ -333,7 +334,7 @@ ProfilingGuid VerifyTimelineEventBinaryPacket(Optional timestamp, } else { - BOOST_CHECK(readThreadId == std::this_thread::get_id()); + BOOST_CHECK(readThreadId == armnnUtils::Threads::GetCurrentThreadId()); } // Check the event GUID diff --git a/src/profiling/test/ProfilingTestUtils.hpp b/src/profiling/test/ProfilingTestUtils.hpp index 8f138bb315..4daf9d5f4a 100644 --- a/src/profiling/test/ProfilingTestUtils.hpp +++ b/src/profiling/test/ProfilingTestUtils.hpp @@ -53,7 +53,7 @@ ProfilingGuid VerifyTimelineEntityBinaryPacketData(Optional guid, unsigned int& offset); ProfilingGuid VerifyTimelineEventBinaryPacket(Optional timestamp, - Optional threadId, + Optional threadId, Optional eventGuid, const unsigned char* readableData, unsigned int& offset); diff --git a/src/profiling/test/SendTimelinePacketTests.cpp b/src/profiling/test/SendTimelinePacketTests.cpp index 4b45cfef76..da30cef90c 100644 --- a/src/profiling/test/SendTimelinePacketTests.cpp +++ b/src/profiling/test/SendTimelinePacketTests.cpp @@ -6,6 +6,7 @@ #include "ProfilingMocks.hpp" #include +#include #include #include #include @@ -322,7 +323,7 @@ BOOST_AUTO_TEST_CASE(SendEventClassAfterTimelineEntityPacketTest) // Send TimelineEventBinaryPacket const uint64_t timestamp = 456789u; - const std::thread::id threadId = std::this_thread::get_id(); + const int threadId = armnnUtils::Threads::GetCurrentThreadId(); const uint64_t eventProfilingGuid = 123456u; sendTimelinePacket->SendTimelineEventBinaryPacket(timestamp, threadId, eventProfilingGuid); diff --git a/src/profiling/test/TimelinePacketTests.cpp b/src/profiling/test/TimelinePacketTests.cpp index 96e9bf2400..71c6915a8c 100644 --- a/src/profiling/test/TimelinePacketTests.cpp +++ b/src/profiling/test/TimelinePacketTests.cpp @@ -3,6 +3,7 @@ // SPDX-License-Identifier: MIT // +#include #include #include @@ -724,7 +725,7 @@ BOOST_AUTO_TEST_CASE(TimelineEventClassTestFullConstructionOfData) BOOST_AUTO_TEST_CASE(TimelineEventPacketTestNoBuffer) { const uint64_t timestamp = 456789u; - const std::thread::id threadId = std::this_thread::get_id(); + const int threadId = armnnUtils::Threads::GetCurrentThreadId(); const uint64_t profilingGuid = 123456u; unsigned int numberOfBytesWritten = 789u; TimelinePacketStatus result = WriteTimelineEventBinary(timestamp, @@ -742,7 +743,7 @@ BOOST_AUTO_TEST_CASE(TimelineEventPacketTestBufferExhaustionZeroValue) std::vector buffer(512, 0); const uint64_t timestamp = 456789u; - const std::thread::id threadId = std::this_thread::get_id(); + const int threadId = armnnUtils::Threads::GetCurrentThreadId(); const uint64_t profilingGuid = 123456u; unsigned int numberOfBytesWritten = 789u; TimelinePacketStatus result = WriteTimelineEventBinary(timestamp, @@ -760,7 +761,7 @@ BOOST_AUTO_TEST_CASE(TimelineEventPacketTestBufferExhaustionFixedValue) std::vector buffer(10, 0); const uint64_t timestamp = 456789u; - const std::thread::id threadId = std::this_thread::get_id(); + const int threadId = armnnUtils::Threads::GetCurrentThreadId(); const uint64_t profilingGuid = 123456u; unsigned int numberOfBytesWritten = 789u; TimelinePacketStatus result = WriteTimelineEventBinary(timestamp, @@ -778,7 +779,7 @@ BOOST_AUTO_TEST_CASE(TimelineEventPacketTestFullConstructionOfData) std::vector buffer(512, 0); const uint64_t timestamp = 456789u; - const std::thread::id threadId = std::this_thread::get_id(); + const int threadId = armnnUtils::Threads::GetCurrentThreadId(); const uint64_t profilingGuid = 123456u; unsigned int numberOfBytesWritten = 789u; TimelinePacketStatus result = WriteTimelineEventBinary(timestamp, diff --git a/src/timelineDecoder/tests/TimelineTests.cpp b/src/timelineDecoder/tests/TimelineTests.cpp index 8d0b8a0f08..08d29d0f6a 100644 --- a/src/timelineDecoder/tests/TimelineTests.cpp +++ b/src/timelineDecoder/tests/TimelineTests.cpp @@ -1,5 +1,5 @@ // -// Copyright © 2019 Arm Ltd. All rights reserved. +// Copyright © 2019 Arm Ltd and Contributors. All rights reserved. // SPDX-License-Identifier: MIT // @@ -8,6 +8,7 @@ #include #include +#include #include #include #include @@ -172,7 +173,7 @@ BOOST_AUTO_TEST_CASE(TimelineCaptureTest) const uint64_t timestamp = 33333u; const uint64_t eventGuid = 44444u; - const std::thread::id threadId = std::this_thread::get_id(); + const int threadId = armnnUtils::Threads::GetCurrentThreadId(); // need to do a bit of work here to extract the value from threadId unsigned char* uCharThreadId = new unsigned char[armnn::profiling::ThreadIdSize]();; @@ -285,7 +286,7 @@ BOOST_AUTO_TEST_CASE(TimelineCaptureTestMultipleStringsInBuffer) const uint64_t timestamp = 33333u; const uint64_t eventGuid = 44444u; - const std::thread::id threadId = std::this_thread::get_id(); + const int threadId = armnnUtils::Threads::GetCurrentThreadId(); // need to do a bit of work here to extract the value from threadId unsigned char* uCharThreadId = new unsigned char[armnn::profiling::ThreadIdSize](); diff --git a/tests/profiling/gatordmock/tests/GatordMockTests.cpp b/tests/profiling/gatordmock/tests/GatordMockTests.cpp index 0ee4601931..e99bdb55a7 100644 --- a/tests/profiling/gatordmock/tests/GatordMockTests.cpp +++ b/tests/profiling/gatordmock/tests/GatordMockTests.cpp @@ -127,7 +127,7 @@ void CheckTimelineDirectory(timelinedecoder::TimelineDirectoryCaptureCommandHand uint32_t uint8_t_size = sizeof(uint8_t); uint32_t uint32_t_size = sizeof(uint32_t); uint32_t uint64_t_size = sizeof(uint64_t); - uint32_t threadId_size = sizeof(std::thread::id); + uint32_t threadId_size = sizeof(int); profiling::BufferManager bufferManager(5); profiling::TimelinePacketWriterFactory timelinePacketWriterFactory(bufferManager); -- cgit v1.2.1