From ac8ac62c922587769a041df81caa560ff869f72f Mon Sep 17 00:00:00 2001 From: "Cencelewska, Katarzyna" Date: Thu, 20 Apr 2023 00:18:51 +0000 Subject: [PATCH] fix: add bcs engine type only if engine exist - check bcs availability before insert to bcsEnginesTypes Resolves: NEO-7886 Signed-off-by: Cencelewska, Katarzyna --- opencl/source/command_queue/command_queue.cpp | 17 ++++++++++------- opencl/source/command_queue/command_queue.h | 3 ++- opencl/source/command_queue/enqueue_common.h | 4 ++-- .../command_queue/command_queue_tests.cpp | 2 +- .../command_queue_tests_pvc_and_later.cpp | 1 + .../test/unit_test/mocks/mock_command_queue.h | 11 ++++++----- 6 files changed, 22 insertions(+), 16 deletions(-) diff --git a/opencl/source/command_queue/command_queue.cpp b/opencl/source/command_queue/command_queue.cpp index 7592e74ccd..003cd1ac56 100644 --- a/opencl/source/command_queue/command_queue.cpp +++ b/opencl/source/command_queue/command_queue.cpp @@ -254,7 +254,7 @@ CommandStreamReceiver *CommandQueue::getBcsForAuxTranslation() { CommandStreamReceiver &CommandQueue::selectCsrForBuiltinOperation(const CsrSelectionArgs &args) { initializeBcsEngine(isSpecial()); if (isCopyOnly) { - return *getBcsCommandStreamReceiver(bcsEngineTypes[0]); + return *getBcsCommandStreamReceiver(*bcsQueueEngineType); } if (!blitEnqueueAllowed(args)) { @@ -308,8 +308,8 @@ CommandStreamReceiver &CommandQueue::selectCsrForBuiltinOperation(const CsrSelec selectedCsr = getBcsCommandStreamReceiver(preferredBcsEngineType); } - if (selectedCsr == nullptr && !bcsEngineTypes.empty()) { - selectedCsr = getBcsCommandStreamReceiver(bcsEngineTypes[0]); + if (selectedCsr == nullptr && bcsQueueEngineType.has_value()) { + selectedCsr = getBcsCommandStreamReceiver(*bcsQueueEngineType); } } if (selectedCsr == nullptr) { @@ -335,12 +335,12 @@ void CommandQueue::constructBcsEngine(bool internalUsage) { bcsEngines[bcsIndex] = neoDevice.tryGetEngine(bcsEngineType, engineUsage); } - bcsEngineTypes.push_back(bcsEngineType); - bcsInitialized = true; if (bcsEngines[bcsIndex]) { + bcsQueueEngineType = bcsEngineType; bcsEngines[bcsIndex]->osContext->ensureContextInitialized(); bcsEngines[bcsIndex]->commandStreamReceiver->initDirectSubmission(); } + bcsInitialized = true; } } @@ -362,8 +362,9 @@ void CommandQueue::constructBcsEnginesForSplit() { auto &neoDevice = device->getNearestGenericSubDevice(0)->getDevice(); auto engineType = EngineHelpers::mapBcsIndexToEngineType(i, true); bcsEngines[i] = neoDevice.tryGetEngine(engineType, EngineUsage::Regular); - bcsEngineTypes.push_back(engineType); + if (bcsEngines[i]) { + bcsQueueEngineType = engineType; bcsEngines[i]->commandStreamReceiver->initializeResources(); bcsEngines[i]->commandStreamReceiver->initDirectSubmission(); } @@ -1177,7 +1178,9 @@ void CommandQueue::overrideEngine(aub_stream::EngineType engineType, EngineUsage } else { bcsEngines[engineIndex] = &device->getEngine(engineType, EngineUsage::Regular); } - bcsEngineTypes = {engineType}; + if (bcsEngines[engineIndex]) { + bcsQueueEngineType = engineType; + } timestampPacketContainer = std::make_unique(); deferredTimestampPackets = std::make_unique(); isCopyOnly = true; diff --git a/opencl/source/command_queue/command_queue.h b/opencl/source/command_queue/command_queue.h index f76627c193..22080b200f 100644 --- a/opencl/source/command_queue/command_queue.h +++ b/opencl/source/command_queue/command_queue.h @@ -24,6 +24,7 @@ #include "opencl/source/helpers/properties_helper.h" #include +#include enum InternalMemoryType : uint32_t; @@ -412,7 +413,7 @@ class CommandQueue : public BaseObject<_cl_command_queue> { ClDevice *device = nullptr; mutable EngineControl *gpgpuEngine = nullptr; std::array bcsEngines = {}; - std::vector bcsEngineTypes = {}; + std::optional bcsQueueEngineType{}; cl_command_queue_properties commandQueueProperties = 0; std::vector propertiesVector; diff --git a/opencl/source/command_queue/enqueue_common.h b/opencl/source/command_queue/enqueue_common.h index 081027bd64..02653b1772 100644 --- a/opencl/source/command_queue/enqueue_common.h +++ b/opencl/source/command_queue/enqueue_common.h @@ -397,8 +397,8 @@ cl_int CommandQueueHw::enqueueHandler(Surface **surfacesForResidency, } // check if we have BCS associated, if so we need to make sure it is completed as well - if (eventBuilder.getEvent() && this->bcsEngineTypes.size() > 0u) { - eventBuilder.getEvent()->setupBcs(this->getBcsCommandStreamReceiver(this->bcsEngineTypes[0u])->getOsContext().getEngineType()); + if (eventBuilder.getEvent() && this->bcsQueueEngineType.has_value()) { + eventBuilder.getEvent()->setupBcs(this->getBcsCommandStreamReceiver(*bcsQueueEngineType)->getOsContext().getEngineType()); } } if (eventBuilder.getEvent()) { diff --git a/opencl/test/unit_test/command_queue/command_queue_tests.cpp b/opencl/test/unit_test/command_queue/command_queue_tests.cpp index 0feaa9c6e6..3547398062 100644 --- a/opencl/test/unit_test/command_queue/command_queue_tests.cpp +++ b/opencl/test/unit_test/command_queue/command_queue_tests.cpp @@ -1987,7 +1987,7 @@ TEST_F(CsrSelectionCommandQueueWithBlitterTests, givenBlitterAndAssignBCSAtEnque auto &csr = queue->selectCsrForBuiltinOperation(args); - EXPECT_EQ(&csr, queue->getBcsCommandStreamReceiver(queue->bcsEngineTypes[0])); + EXPECT_EQ(&csr, queue->getBcsCommandStreamReceiver(*queue->bcsQueueEngineType)); } TEST_F(CsrSelectionCommandQueueWithQueueFamiliesBlitterTests, givenBlitterSelectedWithQueueFamiliesWhenSelectingBlitterThenSelectBlitter) { diff --git a/opencl/test/unit_test/command_queue/command_queue_tests_pvc_and_later.cpp b/opencl/test/unit_test/command_queue/command_queue_tests_pvc_and_later.cpp index 234859c9ba..9a305eb546 100644 --- a/opencl/test/unit_test/command_queue/command_queue_tests_pvc_and_later.cpp +++ b/opencl/test/unit_test/command_queue/command_queue_tests_pvc_and_later.cpp @@ -759,6 +759,7 @@ HWTEST2_F(BcsCsrSelectionCommandQueueTests, givenMultipleEnginesInQueueWhenSelec aub_stream::ENGINE_BCS7, aub_stream::ENGINE_BCS8, }); + queue->bcsInitialized = false; EXPECT_EQ(queue->getBcsCommandStreamReceiver(aub_stream::ENGINE_BCS2), &queue->selectCsrForBuiltinOperation(args)); EXPECT_EQ(queue->getBcsCommandStreamReceiver(aub_stream::ENGINE_BCS1), &queue->selectCsrForBuiltinOperation(args)); EXPECT_EQ(queue->getBcsCommandStreamReceiver(aub_stream::ENGINE_BCS2), &queue->selectCsrForBuiltinOperation(args)); diff --git a/opencl/test/unit_test/mocks/mock_command_queue.h b/opencl/test/unit_test/mocks/mock_command_queue.h index b810686021..0c986f0ffd 100644 --- a/opencl/test/unit_test/mocks/mock_command_queue.h +++ b/opencl/test/unit_test/mocks/mock_command_queue.h @@ -23,8 +23,8 @@ namespace NEO { class MockCommandQueue : public CommandQueue { public: using CommandQueue::bcsEngines; - using CommandQueue::bcsEngineTypes; using CommandQueue::bcsInitialized; + using CommandQueue::bcsQueueEngineType; using CommandQueue::bcsStates; using CommandQueue::bcsTimestampPacketContainers; using CommandQueue::blitEnqueueAllowed; @@ -47,14 +47,15 @@ class MockCommandQueue : public CommandQueue { void clearBcsEngines() { std::fill(bcsEngines.begin(), bcsEngines.end(), nullptr); - bcsEngineTypes.clear(); + bcsQueueEngineType = std::nullopt; } void insertBcsEngine(aub_stream::EngineType bcsEngineType) { const auto index = NEO::EngineHelpers::getBcsIndex(bcsEngineType); const auto engine = &getDevice().getEngine(bcsEngineType, EngineUsage::Regular); bcsEngines[index] = engine; - bcsEngineTypes.push_back(bcsEngineType); + bcsQueueEngineType = bcsEngineType; + bcsInitialized = true; } size_t countBcsEngines() const { @@ -241,7 +242,7 @@ class MockCommandQueueHw : public CommandQueueHw { public: using BaseClass::bcsEngines; - using BaseClass::bcsEngineTypes; + using BaseClass::bcsQueueEngineType; using BaseClass::bcsStates; using BaseClass::blitEnqueueAllowed; using BaseClass::commandQueueProperties; @@ -270,7 +271,7 @@ class MockCommandQueueHw : public CommandQueueHw { const auto index = NEO::EngineHelpers::getBcsIndex(bcsEngineType); const auto engine = &getDevice().getEngine(bcsEngineType, EngineUsage::Regular); bcsEngines[index] = engine; - bcsEngineTypes.push_back(bcsEngineType); + bcsQueueEngineType = bcsEngineType; } MockCommandQueueHw(Context *context,