From d4e8dd876ba2eb8d12f2ec7466c61b0b37761f64 Mon Sep 17 00:00:00 2001 From: German Andryeyev Date: Fri, 28 Feb 2020 19:05:17 -0500 Subject: [PATCH] SWDEV-79445 Add MS HWS support. PAL reports just one compute engine in that mode and runtime needs extra logic to detect RT queues. Change-Id: I011f1f1b18dec6a7195a4f1fe939f8029bc269ae [ROCm/clr commit: 622c714165a3e8a1189065f55b17af51691bc0f3] --- projects/clr/rocclr/device/pal/paldevice.cpp | 35 +++++++++---------- projects/clr/rocclr/device/pal/paldevice.hpp | 5 ++- projects/clr/rocclr/device/pal/palvirtual.cpp | 6 +++- 3 files changed, 25 insertions(+), 21 deletions(-) diff --git a/projects/clr/rocclr/device/pal/paldevice.cpp b/projects/clr/rocclr/device/pal/paldevice.cpp index b1af3dcc5b..defb0f9785 100644 --- a/projects/clr/rocclr/device/pal/paldevice.cpp +++ b/projects/clr/rocclr/device/pal/paldevice.cpp @@ -902,27 +902,24 @@ bool Device::create(Pal::IDevice* device) { return false; } + const auto& computeProp = properties().engineProperties[Pal::EngineTypeCompute]; // Find the number of available engines - for (uint i = 0; i < properties().engineProperties[Pal::EngineTypeCompute].engineCount; ++i) { - if (properties().engineProperties[Pal::EngineTypeCompute].capabilities[i].flags.exclusive) { - if ((properties() - .engineProperties[Pal::EngineTypeCompute] - .capabilities[i] - .queuePrioritySupport == Pal::SupportQueuePriorityRealtime) && - (properties().engineProperties[Pal::EngineTypeCompute].maxNumDedicatedCu > 0)) { - if (exclusiveComputeEnginesId_.find(ExclusiveQueueType::RealTime0) != - exclusiveComputeEnginesId_.end()) { - exclusiveComputeEnginesId_.insert({ExclusiveQueueType::RealTime1, i}); - } else { - exclusiveComputeEnginesId_.insert({ExclusiveQueueType::RealTime0, i}); - } - } else if (properties() - .engineProperties[Pal::EngineTypeCompute] - .capabilities[i] - .queuePrioritySupport == Pal::SupportQueuePriorityMedium) { - exclusiveComputeEnginesId_.insert({ExclusiveQueueType::Medium, i}); + for (uint i = 0; i < computeProp.engineCount; ++i) { + const auto& computeCaps = computeProp.capabilities[i]; + if ((computeCaps.queuePrioritySupport & Pal::SupportQueuePriorityRealtime) && + (computeProp.maxNumDedicatedCu > 0)) { + if (exclusiveComputeEnginesId_.find(ExclusiveQueueType::RealTime0) != + exclusiveComputeEnginesId_.end()) { + exclusiveComputeEnginesId_.insert({ExclusiveQueueType::RealTime1, i}); + } else { + exclusiveComputeEnginesId_.insert({ExclusiveQueueType::RealTime0, i}); } - } else { + } + if (computeCaps.queuePrioritySupport & Pal::SupportQueuePriorityMedium) { + exclusiveComputeEnginesId_.insert({ExclusiveQueueType::Medium, i}); + } + + if (computeCaps.queuePrioritySupport & Pal::SupportQueuePriorityNormal) { computeEnginesId_.push_back(i); } } diff --git a/projects/clr/rocclr/device/pal/paldevice.hpp b/projects/clr/rocclr/device/pal/paldevice.hpp index d1c21353b9..dcac1a16ec 100644 --- a/projects/clr/rocclr/device/pal/paldevice.hpp +++ b/projects/clr/rocclr/device/pal/paldevice.hpp @@ -425,7 +425,10 @@ class Device : public NullDevice { } //! Returns the number of available compute rings - uint numExclusiveComputeEngines() const { return exclusiveComputeEnginesId_.size(); } + uint numExclusiveComputeEngines() const { + return exclusiveComputeEnginesId_.size() + + ((exclusiveComputeEnginesId().find(ExclusiveQueueType::RealTime1) == + exclusiveComputeEnginesId().end()) ? 1 : 0); } //! Returns the map of available exclusive compute rings with the engine index const std::map& exclusiveComputeEnginesId() const { diff --git a/projects/clr/rocclr/device/pal/palvirtual.cpp b/projects/clr/rocclr/device/pal/palvirtual.cpp index 706d02b53e..7bc564ebb8 100644 --- a/projects/clr/rocclr/device/pal/palvirtual.cpp +++ b/projects/clr/rocclr/device/pal/palvirtual.cpp @@ -86,7 +86,11 @@ VirtualGPU::Queue* VirtualGPU::Queue::Create(const VirtualGPU& gpu, Pal::QueueTy qCreateInfo.priority = Pal::QueuePriority::Medium; } else if (amd::CommandQueue::RealTimeDisabled != rtCU) { qCreateInfo.numReservedCu = rtCU; - if (priority == amd::CommandQueue::Priority::Medium) { + if ((priority == amd::CommandQueue::Priority::Medium) && + // If Windows HWS is enabled, then the both real time queues are allocated + // on the same engine + (gpu.dev().exclusiveComputeEnginesId().find(ExclusiveQueueType::RealTime1) != + gpu.dev().exclusiveComputeEnginesId().end())) { it = gpu.dev().exclusiveComputeEnginesId().find(ExclusiveQueueType::RealTime1); } else { it = gpu.dev().exclusiveComputeEnginesId().find(ExclusiveQueueType::RealTime0);