diff --git a/rocclr/runtime/device/gpu/gpuvirtual.cpp b/rocclr/runtime/device/gpu/gpuvirtual.cpp index 3b0438c3c9..2754cf4af4 100644 --- a/rocclr/runtime/device/gpu/gpuvirtual.cpp +++ b/rocclr/runtime/device/gpu/gpuvirtual.cpp @@ -495,7 +495,8 @@ VirtualGPU::create( // hwRing_ should be set 0 if forced to have single scratch buffer hwRing_ = (dev().settings().useSingleScratch_) ? 0 : idx; - engineMask = dev().engines().getMask((gslEngineID)(GSL_ENGINEID_COMPUTE0 + idx)); + engineMask = dev().engines().getMask((gslEngineID)(dev().isComputeRingIDForced() ? + dev().getforcedComputeEngineID() : (GSL_ENGINEID_COMPUTE0 + idx))); if (dev().canDMA()) { if (index() & 0x1) { engineMask |= dev().engines().getMask(GSL_ENGINEID_DRMDMA0); diff --git a/rocclr/runtime/device/gpu/gslbe/src/rt/GSLDevice.cpp b/rocclr/runtime/device/gpu/gslbe/src/rt/GSLDevice.cpp index 5477bb2025..0f7c67a8b3 100644 --- a/rocclr/runtime/device/gpu/gslbe/src/rt/GSLDevice.cpp +++ b/rocclr/runtime/device/gpu/gslbe/src/rt/GSLDevice.cpp @@ -42,7 +42,8 @@ void CALGSLDevice::Initialize() m_vpuMask = 1; m_PerformLazyDeviceInit = false; m_computeRing = false; - + m_isComputeRingIDForced = false; + m_forcedComputeEngineID = GSL_ENGINEID_INVALID; gslDeviceOps_ = NULL; } @@ -313,8 +314,6 @@ CALGSLDevice::open(uint32 gpuIndex, bool enableHighPerformanceState, bool report return false; } - m_adp->queryAvailableEngines(&m_nEngines, m_engines); - if (m_PerformLazyDeviceInit) { // close the adaptor @@ -411,7 +410,9 @@ CALGSLDevice::SetupAdapter(int32 &asic_id) m_canDMA = hasDmaEngine; - //Disable DRMDMA on CFX mode for linux on all GPUs. + m_adp->queryAvailableEngines(&m_nEngines, m_engines); + + //Disable DRMDMA on CFX mode for linux on all GPUs. #ifdef ATI_OS_LINUX if ((m_vpucount > 1) && !DRMDMA_FOR_LNX_CF) { @@ -426,7 +427,7 @@ CALGSLDevice::SetupAdapter(int32 &asic_id) m_computeRing = false; } else - { + { m_computeRing = true; } @@ -435,6 +436,22 @@ CALGSLDevice::SetupAdapter(int32 &asic_id) m_computeRing = (GPU_NUM_COMPUTE_RINGS != 0); } + if ((!flagIsDefault(GPU_SELECT_COMPUTE_RINGS_ID)) && (m_computeRing)) + { + gslEngineID engineID; + engineID = static_cast(GPU_SELECT_COMPUTE_RINGS_ID + GSL_ENGINEID_COMPUTE0); + if ((engineID >= GSL_ENGINEID_COMPUTE0) && (engineID <= GSL_ENGINEID_COMPUTE7)) + { + for (uint i = 0; i < m_nEngines; ++i) { + if (m_engines[i].id == engineID){ + m_isComputeRingIDForced = true; + m_forcedComputeEngineID = engineID; + break; + } + } + } + } + if (m_computeRing && !hasComputeEngine) { return false; @@ -446,8 +463,8 @@ CALGSLDevice::SetupAdapter(int32 &asic_id) bool CALGSLDevice::SetupContext(int32 &asic_id) { - gsl::gsCtx* temp_cs = m_adp->createComputeContext(m_computeRing ? GSL_ENGINEID_COMPUTE0 : GSL_ENGINEID_3DCOMPUTE0, - m_canDMA ? GSL_ENGINEID_DRMDMA0 : GSL_ENGINEID_INVALID); + gsl::gsCtx* temp_cs = m_adp->createComputeContext(m_computeRing ? (m_isComputeRingIDForced ? m_forcedComputeEngineID : GSL_ENGINEID_COMPUTE0) + : GSL_ENGINEID_3DCOMPUTE0, m_canDMA ? GSL_ENGINEID_DRMDMA0 : GSL_ENGINEID_INVALID); temp_cs->getMainSubCtx()->setVPUMask(m_vpuMask); m_revision = temp_cs->getChipRev(); @@ -632,8 +649,8 @@ CALGSLDevice::PerformFullInitialization_int() if (m_cs == 0) { - m_cs = m_adp->createComputeContext(m_computeRing ? GSL_ENGINEID_COMPUTE0 : GSL_ENGINEID_3DCOMPUTE0, - m_canDMA ? GSL_ENGINEID_DRMDMA0 : GSL_ENGINEID_INVALID); + m_cs = m_adp->createComputeContext(m_computeRing ? (m_isComputeRingIDForced ? m_forcedComputeEngineID : GSL_ENGINEID_COMPUTE0) + : GSL_ENGINEID_3DCOMPUTE0, m_canDMA ? GSL_ENGINEID_DRMDMA0 : GSL_ENGINEID_INVALID); m_cs->getMainSubCtx()->setVPUMask(m_vpuMask); // diff --git a/rocclr/runtime/device/gpu/gslbe/src/rt/GSLDevice.h b/rocclr/runtime/device/gpu/gslbe/src/rt/GSLDevice.h index 9ab0f91ec8..bc0e87e17e 100644 --- a/rocclr/runtime/device/gpu/gslbe/src/rt/GSLDevice.h +++ b/rocclr/runtime/device/gpu/gslbe/src/rt/GSLDevice.h @@ -134,6 +134,9 @@ public: gsl::gsCtx* gslCtx() const { return m_cs; } + bool isComputeRingIDForced() const { return m_isComputeRingIDForced; } + gslEngineID getforcedComputeEngineID() const { return m_forcedComputeEngineID; } + protected: // /// channel order enumerants @@ -211,7 +214,7 @@ private: CALdevicestatus m_deviceStatus; gslTextureResourceObject m_textureResource; gslSamplerObject m_textureSampler; - bool m_isOpenCL200Device; + gslEngineID m_forcedComputeEngineID; union { struct { @@ -222,6 +225,8 @@ private: uint m_PerformLazyDeviceInit : 1; uint m_vmMode : 1; uint m_uavInCB : 1; + uint m_isComputeRingIDForced : 1; + bool m_isOpenCL200Device : 1; }; }; diff --git a/rocclr/runtime/utils/flags.hpp b/rocclr/runtime/utils/flags.hpp index 211b7dd323..b7b508c8cf 100644 --- a/rocclr/runtime/utils/flags.hpp +++ b/rocclr/runtime/utils/flags.hpp @@ -122,6 +122,8 @@ release(uint, GPU_SINGLE_ALLOC_PERCENT, 75, \ "Maximum size of a single allocation as percentage of total") \ release(uint, GPU_NUM_COMPUTE_RINGS, 2, \ "GPU number of compute rings. 0 - disabled, 1 , 2,.. - the number of compute rings") \ +release(int, GPU_SELECT_COMPUTE_RINGS_ID, -1, \ + "GPU select the compute rings ID -1 - disabled, 0 , 1,.. - the forced compute rings ID for submission") \ release_on_stg(bool, C1X_ATOMICS, !IS_MAINLINE, \ "Runtime will report c1x atomics support") \ release(uint, GPU_WORKLOAD_SPLIT, 22, \