From 8f5e9c8a3a179d4b8bc0b23d2edaadf85aa07fa3 Mon Sep 17 00:00:00 2001 From: "Dunajski, Bartosz" Date: Thu, 19 Dec 2019 10:04:04 +0100 Subject: [PATCH] Refactor PerfCounters initialization. Allow only 1 engine type at once Change-Id: I14ba28adb1926b0e67e5b147b7391a7284617c29 Signed-off-by: Dunajski, Bartosz --- runtime/command_queue/command_queue.cpp | 6 +- runtime/os_interface/performance_counters.cpp | 12 +-- runtime/os_interface/performance_counters.h | 4 +- .../performance_counters_tests.cpp | 90 ++++++++++++------- 4 files changed, 68 insertions(+), 44 deletions(-) diff --git a/runtime/command_queue/command_queue.cpp b/runtime/command_queue/command_queue.cpp index fc3d4fdd6b..aaf3c9e1a7 100644 --- a/runtime/command_queue/command_queue.cpp +++ b/runtime/command_queue/command_queue.cpp @@ -8,6 +8,7 @@ #include "runtime/command_queue/command_queue.h" #include "core/helpers/aligned_memory.h" +#include "core/helpers/engine_node_helper.h" #include "core/helpers/options.h" #include "core/helpers/ptr_math.h" #include "core/helpers/string.h" @@ -30,6 +31,7 @@ #include "runtime/mem_obj/buffer.h" #include "runtime/mem_obj/image.h" #include "runtime/memory_manager/internal_allocation_storage.h" +#include "runtime/os_interface/os_context.h" #include "runtime/utilities/api_intercept.h" #include "runtime/utilities/tag_allocator.h" @@ -298,10 +300,10 @@ bool CommandQueue::setPerfCountersEnabled(bool perfCountersEnabled, cl_uint conf return false; } auto perfCounters = device->getPerformanceCounters(); + bool isCcsEngine = isCcs(getGpgpuEngine().osContext->getEngineType()); if (perfCountersEnabled) { - perfCounters->enable(); - if (!perfCounters->isAvailable()) { + if (!perfCounters->enable(isCcsEngine)) { perfCounters->shutdown(); return false; } diff --git a/runtime/os_interface/performance_counters.cpp b/runtime/os_interface/performance_counters.cpp index ff7b0ddde4..f7940673b7 100644 --- a/runtime/os_interface/performance_counters.cpp +++ b/runtime/os_interface/performance_counters.cpp @@ -29,24 +29,20 @@ uint32_t PerformanceCounters::getReferenceNumber() { return referenceCounter; } -////////////////////////////////////////////////////// -// PerformanceCounters::isAvailable -////////////////////////////////////////////////////// -bool PerformanceCounters::isAvailable() { - return available; -} - ////////////////////////////////////////////////////// // PerformanceCounters::enable ////////////////////////////////////////////////////// -void PerformanceCounters::enable() { +bool PerformanceCounters::enable(bool ccsEngine) { std::lock_guard lockMutex(mutex); if (referenceCounter == 0) { available = openMetricsLibrary(); + this->usingCcsEngine = ccsEngine; } referenceCounter++; + + return available && (this->usingCcsEngine == ccsEngine); } ////////////////////////////////////////////////////// diff --git a/runtime/os_interface/performance_counters.h b/runtime/os_interface/performance_counters.h index 7b7b2220e8..4e4b3c000c 100644 --- a/runtime/os_interface/performance_counters.h +++ b/runtime/os_interface/performance_counters.h @@ -34,9 +34,8 @@ class PerformanceCounters { // Performance counters creation. ////////////////////////////////////////////////////// static std::unique_ptr create(class Device *device); - void enable(); + bool enable(bool ccsEngine); void shutdown(); - bool isAvailable(); uint32_t getReferenceNumber(); ///////////////////////////////////////////////////// @@ -79,6 +78,7 @@ class PerformanceCounters { std::mutex mutex; uint32_t referenceCounter = 0; bool available = false; + bool usingCcsEngine = false; ///////////////////////////////////////////////////// // Metrics Library interface. diff --git a/unit_tests/os_interface/performance_counters_tests.cpp b/unit_tests/os_interface/performance_counters_tests.cpp index 624e2fece9..f6a409d55b 100644 --- a/unit_tests/os_interface/performance_counters_tests.cpp +++ b/unit_tests/os_interface/performance_counters_tests.cpp @@ -55,8 +55,6 @@ TEST_F(PerformanceCountersTest, createPerformanceCounters) { auto performanceCounters = PerformanceCounters::create(device.get()); EXPECT_NE(nullptr, performanceCounters); EXPECT_NE(nullptr, performanceCounters.get()); - - EXPECT_FALSE(performanceCounters->isAvailable()); } TEST_F(PerformanceCountersTest, givenPerformanceCountersWhenCreatedThenAllValuesProperlyInitialized) { @@ -163,9 +161,8 @@ TEST_F(PerformanceCountersMetricsLibraryTest, givenPerformanceCountersWhenMetric // Create performance counters. createPerformanceCounters(true, true); EXPECT_NE(nullptr, performanceCountersBase); - performanceCountersBase->enable(); + EXPECT_TRUE(performanceCountersBase->enable(false)); EXPECT_EQ(1u, performanceCountersBase->getReferenceNumber()); - EXPECT_TRUE(performanceCountersBase->isAvailable()); // Check metric library context. auto context = static_cast(performanceCountersBase->getMetricsLibraryContext().data); @@ -181,9 +178,8 @@ TEST_F(PerformanceCountersMetricsLibraryTest, givenPerformanceCountersWhenMetric // Create performance counters. createPerformanceCounters(true, false); EXPECT_NE(nullptr, performanceCountersBase); - performanceCountersBase->enable(); + EXPECT_TRUE(performanceCountersBase->enable(false)); EXPECT_EQ(1u, performanceCountersBase->getReferenceNumber()); - EXPECT_TRUE(performanceCountersBase->isAvailable()); // Obtain required command buffer size. uint32_t commandsSize = performanceCountersBase->getGpuCommandsSize(MetricsLibraryApi::GpuCommandBufferType::Render, true); @@ -201,11 +197,47 @@ TEST_F(PerformanceCountersMetricsLibraryTest, givenPerformanceCountersWhenMetric EXPECT_EQ(0u, performanceCountersBase->getReferenceNumber()); } +TEST_F(PerformanceCountersMetricsLibraryTest, givenInitialNonCcsEngineWhenEnablingThenDontAllowCcsOnNextCalls) { + createPerformanceCounters(true, false); + EXPECT_NE(nullptr, performanceCountersBase); + + EXPECT_TRUE(performanceCountersBase->enable(false)); + EXPECT_TRUE(performanceCountersBase->enable(false)); + EXPECT_FALSE(performanceCountersBase->enable(true)); + + performanceCountersBase->shutdown(); + performanceCountersBase->shutdown(); + performanceCountersBase->shutdown(); + + EXPECT_EQ(0u, performanceCountersBase->getReferenceNumber()); + + EXPECT_TRUE(performanceCountersBase->enable(true)); + performanceCountersBase->shutdown(); +} + +TEST_F(PerformanceCountersMetricsLibraryTest, givenInitialCcsEngineWhenEnablingThenDontAllowNonCcsOnNextCalls) { + createPerformanceCounters(true, false); + EXPECT_NE(nullptr, performanceCountersBase); + + EXPECT_TRUE(performanceCountersBase->enable(true)); + EXPECT_TRUE(performanceCountersBase->enable(true)); + EXPECT_FALSE(performanceCountersBase->enable(false)); + + performanceCountersBase->shutdown(); + performanceCountersBase->shutdown(); + performanceCountersBase->shutdown(); + + EXPECT_EQ(0u, performanceCountersBase->getReferenceNumber()); + + EXPECT_TRUE(performanceCountersBase->enable(false)); + performanceCountersBase->shutdown(); +} + TEST_F(PerformanceCountersMetricsLibraryTest, givenPerformanceCountersWhenMetricLibraryIsInvalidThenQueryReturnsInvalidGpuCommands) { // Create performance counters. createPerformanceCounters(false, false); EXPECT_NE(nullptr, performanceCountersBase); - performanceCountersBase->enable(); + EXPECT_FALSE(performanceCountersBase->enable(true)); // Obtain required command buffer size. uint32_t commandsSize = performanceCountersBase->getGpuCommandsSize(MetricsLibraryApi::GpuCommandBufferType::Render, true); @@ -220,9 +252,8 @@ TEST_F(PerformanceCountersMetricsLibraryTest, givenPerformanceCountersWhenMetric // Create performance counters. createPerformanceCounters(true, true); EXPECT_NE(nullptr, performanceCountersBase); - performanceCountersBase->enable(); + EXPECT_TRUE(performanceCountersBase->enable(false)); EXPECT_EQ(1u, performanceCountersBase->getReferenceNumber()); - EXPECT_TRUE(performanceCountersBase->isAvailable()); // Obtain api report size. uint32_t apiReportSize = performanceCountersBase->getApiReportSize(); @@ -237,7 +268,7 @@ TEST_F(PerformanceCountersMetricsLibraryTest, givenPerformanceCountersWhenMetric // Create performance counters. createPerformanceCounters(false, false); EXPECT_NE(nullptr, performanceCountersBase); - performanceCountersBase->enable(); + EXPECT_FALSE(performanceCountersBase->enable(false)); EXPECT_EQ(1u, performanceCountersBase->getReferenceNumber()); // Obtain api report size. @@ -253,7 +284,7 @@ TEST_F(PerformanceCountersMetricsLibraryTest, givenPerformanceCountersWhenMetric // Create performance counters. createPerformanceCounters(false, false); EXPECT_NE(nullptr, performanceCountersBase); - performanceCountersBase->enable(); + EXPECT_FALSE(performanceCountersBase->enable(false)); EXPECT_EQ(1u, performanceCountersBase->getReferenceNumber()); // Obtain gpu report size. @@ -269,9 +300,8 @@ TEST_F(PerformanceCountersMetricsLibraryTest, givenPerformanceCountersWhenMetric // Create performance counters. createPerformanceCounters(true, true); EXPECT_NE(nullptr, performanceCountersBase); - performanceCountersBase->enable(); + EXPECT_TRUE(performanceCountersBase->enable(false)); EXPECT_EQ(1u, performanceCountersBase->getReferenceNumber()); - EXPECT_TRUE(performanceCountersBase->isAvailable()); // Close library. performanceCountersBase->shutdown(); @@ -282,9 +312,8 @@ TEST_F(PerformanceCountersMetricsLibraryTest, givenPerformanceCountersWhenMetric // Create performance counters. createPerformanceCounters(false, false); EXPECT_NE(nullptr, performanceCountersBase); - performanceCountersBase->enable(); + EXPECT_FALSE(performanceCountersBase->enable(false)); EXPECT_EQ(1u, performanceCountersBase->getReferenceNumber()); - EXPECT_FALSE(performanceCountersBase->isAvailable()); // Close library. performanceCountersBase->shutdown(); @@ -299,9 +328,8 @@ TEST_F(PerformanceCountersMetricsLibraryTest, givenPerformanceCountersWhenMetric metricsLibraryDll->validContextDelete = false; EXPECT_NE(nullptr, performanceCountersBase); EXPECT_EQ(0u, performanceCountersBase->getReferenceNumber()); - performanceCountersBase->enable(); + EXPECT_FALSE(performanceCountersBase->enable(false)); EXPECT_EQ(1u, performanceCountersBase->getReferenceNumber()); - EXPECT_FALSE(performanceCountersBase->isAvailable()); // Close library. performanceCountersBase->shutdown(); @@ -316,9 +344,8 @@ TEST_F(PerformanceCountersMetricsLibraryTest, givenPerformanceCountersWhenMetric metricsLibraryDll->validContextDelete = false; EXPECT_NE(nullptr, performanceCountersBase); EXPECT_EQ(0u, performanceCountersBase->getReferenceNumber()); - performanceCountersBase->enable(); + EXPECT_FALSE(performanceCountersBase->enable(false)); EXPECT_EQ(1u, performanceCountersBase->getReferenceNumber()); - EXPECT_FALSE(performanceCountersBase->isAvailable()); // Close library. performanceCountersBase->shutdown(); @@ -329,9 +356,8 @@ TEST_F(PerformanceCountersMetricsLibraryTest, givenPerformanceCountersWhenMetric // Create performance counters. createPerformanceCounters(true, false); EXPECT_NE(nullptr, performanceCountersBase); - performanceCountersBase->enable(); + EXPECT_TRUE(performanceCountersBase->enable(false)); EXPECT_EQ(1u, performanceCountersBase->getReferenceNumber()); - EXPECT_TRUE(performanceCountersBase->isAvailable()); // Obtain required command buffer size. uint32_t commandsSize = performanceCountersBase->getGpuCommandsSize(MetricsLibraryApi::GpuCommandBufferType::Render, true); @@ -371,9 +397,9 @@ TEST_F(PerformanceCountersMetricsLibraryTest, givenPerformanceCountersWhenMetric createPerformanceCounters(true, true); EXPECT_NE(nullptr, performanceCountersBase); EXPECT_EQ(0u, performanceCountersBase->getReferenceNumber()); - performanceCountersBase->enable(); + EXPECT_TRUE(performanceCountersBase->enable(false)); EXPECT_EQ(1u, performanceCountersBase->getReferenceNumber()); - performanceCountersBase->enable(); + EXPECT_TRUE(performanceCountersBase->enable(false)); EXPECT_EQ(2u, performanceCountersBase->getReferenceNumber()); performanceCountersBase->shutdown(); EXPECT_EQ(1u, performanceCountersBase->getReferenceNumber()); @@ -388,7 +414,7 @@ TEST_F(PerformanceCountersMetricsLibraryTest, givenPerformanceCountersWhenMetric EXPECT_NE(nullptr, performanceCountersBase); EXPECT_EQ(0u, performanceCountersBase->getReferenceNumber()); - performanceCountersBase->enable(); + EXPECT_TRUE(performanceCountersBase->enable(false)); EXPECT_TRUE(performanceCountersBase->getQueryHandle().IsValid()); EXPECT_TRUE(performanceCountersBase->getQueryHandle().IsValid()); @@ -399,7 +425,7 @@ TEST_F(PerformanceCountersMetricsLibraryTest, givenPerformanceCountersWhenMetric TEST_F(PerformanceCountersMetricsLibraryTest, givenPerformanceCountersWhenOaConfigurationIsInvalidThenGpuReportSizeIsInvalid) { createPerformanceCounters(true, false); EXPECT_NE(nullptr, performanceCountersBase); - performanceCountersBase->enable(); + EXPECT_TRUE(performanceCountersBase->enable(false)); EXPECT_EQ(1u, performanceCountersBase->getReferenceNumber()); auto metricLibraryApi = static_cast(performanceCountersBase->getMetricsLibraryContext().data); @@ -415,7 +441,7 @@ TEST_F(PerformanceCountersMetricsLibraryTest, givenPerformanceCountersWhenOaConf TEST_F(PerformanceCountersMetricsLibraryTest, givenPerformanceCountersWhenMetricsLibraryIsInvalidGpuReportSizeIsInvalid) { createPerformanceCounters(true, false); EXPECT_NE(nullptr, performanceCountersBase); - performanceCountersBase->enable(); + EXPECT_TRUE(performanceCountersBase->enable(false)); EXPECT_EQ(1u, performanceCountersBase->getReferenceNumber()); auto metricLibraryApi = static_cast(performanceCountersBase->getMetricsLibraryContext().data); @@ -431,7 +457,7 @@ TEST_F(PerformanceCountersMetricsLibraryTest, givenPerformanceCountersWhenMetric TEST_F(PerformanceCountersMetricsLibraryTest, givenPerformanceCountersWhenAllConfigurationsAreValidThenGpuReportSizeIsValid) { createPerformanceCounters(true, false); EXPECT_NE(nullptr, performanceCountersBase); - performanceCountersBase->enable(); + EXPECT_TRUE(performanceCountersBase->enable(false)); EXPECT_EQ(1u, performanceCountersBase->getReferenceNumber()); auto metricLibraryApi = static_cast(performanceCountersBase->getMetricsLibraryContext().data); @@ -448,7 +474,7 @@ TEST_F(PerformanceCountersMetricsLibraryTest, givenPerformanceCountersWhenAllCon TEST_F(PerformanceCountersMetricsLibraryTest, givenPerformanceCountersWhenOaConfigurationsActivationIsInvalidThenGpuReportSizeIsInvalid) { createPerformanceCounters(true, false); EXPECT_NE(nullptr, performanceCountersBase); - performanceCountersBase->enable(); + EXPECT_TRUE(performanceCountersBase->enable(false)); EXPECT_EQ(1u, performanceCountersBase->getReferenceNumber()); auto metricLibraryApi = static_cast(performanceCountersBase->getMetricsLibraryContext().data); @@ -464,7 +490,7 @@ TEST_F(PerformanceCountersMetricsLibraryTest, givenPerformanceCountersWhenOaConf TEST_F(PerformanceCountersMetricsLibraryTest, givenPerformanceCountersWhenCreatingUserConfigurationThenReturnSuccess) { createPerformanceCounters(true, false); EXPECT_NE(nullptr, performanceCountersBase); - performanceCountersBase->enable(); + EXPECT_TRUE(performanceCountersBase->enable(false)); EXPECT_EQ(1u, performanceCountersBase->getReferenceNumber()); ConfigurationHandle_1_0 configurationHandle = {}; @@ -480,7 +506,7 @@ TEST_F(PerformanceCountersMetricsLibraryTest, givenPerformanceCountersWhenCreati TEST_F(PerformanceCountersMetricsLibraryTest, getHwPerfCounterReturnsValidPointer) { createPerformanceCounters(true, false); EXPECT_NE(nullptr, performanceCountersBase); - performanceCountersBase->enable(); + EXPECT_TRUE(performanceCountersBase->enable(false)); EXPECT_EQ(1u, performanceCountersBase->getReferenceNumber()); ASSERT_NE(nullptr, queue->getPerfCounters()); @@ -504,7 +530,7 @@ TEST_F(PerformanceCountersMetricsLibraryTest, getHwPerfCounterReturnsValidPointe TEST_F(PerformanceCountersMetricsLibraryTest, getHwPerfCounterAllocationReturnsValidPointer) { createPerformanceCounters(true, false); EXPECT_NE(nullptr, performanceCountersBase); - performanceCountersBase->enable(); + EXPECT_TRUE(performanceCountersBase->enable(false)); EXPECT_EQ(1u, performanceCountersBase->getReferenceNumber()); ASSERT_NE(nullptr, queue->getPerfCounters()); @@ -527,7 +553,7 @@ TEST_F(PerformanceCountersMetricsLibraryTest, getHwPerfCounterAllocationReturnsV TEST_F(PerformanceCountersMetricsLibraryTest, hwPerfCounterMemoryIsPlacedInGraphicsAllocation) { createPerformanceCounters(true, false); EXPECT_NE(nullptr, performanceCountersBase); - performanceCountersBase->enable(); + EXPECT_TRUE(performanceCountersBase->enable(false)); EXPECT_EQ(1u, performanceCountersBase->getReferenceNumber()); ASSERT_NE(nullptr, queue->getPerfCounters());