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: 622c714165]
This commit is contained in:
German Andryeyev
2020-02-28 19:05:17 -05:00
والد a753002d41
کامیت d4e8dd876b
3فایلهای تغییر یافته به همراه25 افزوده شده و 21 حذف شده
@@ -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);
}
}
@@ -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<ExclusiveQueueType, uint32_t>& exclusiveComputeEnginesId() const {
@@ -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);