diff --git a/projects/clr/rocclr/runtime/device/pal/palprogram.cpp b/projects/clr/rocclr/runtime/device/pal/palprogram.cpp index 5857a56435..50313dcca3 100644 --- a/projects/clr/rocclr/runtime/device/pal/palprogram.cpp +++ b/projects/clr/rocclr/runtime/device/pal/palprogram.cpp @@ -49,7 +49,7 @@ Segment::alloc( { align = amd::alignUp(align, sizeof(uint32_t)); gpuAccess_ = new pal::Memory(prog.dev(), amd::alignUp(size, align)); - if ((gpuAccess_ == nullptr) || !gpuAccess_->create(pal::Resource::Local)) { + if ((gpuAccess_ == nullptr) || !gpuAccess_->create(pal::Resource::Shader)) { delete gpuAccess_; gpuAccess_ = nullptr; return false; diff --git a/projects/clr/rocclr/runtime/device/pal/palresource.cpp b/projects/clr/rocclr/runtime/device/pal/palresource.cpp index c569c326cc..cbdefc7502 100644 --- a/projects/clr/rocclr/runtime/device/pal/palresource.cpp +++ b/projects/clr/rocclr/runtime/device/pal/palresource.cpp @@ -437,6 +437,10 @@ Resource::create(MemoryType memType, CreateParams* params) amd::ScopedLock lk(dev().lockPAL()); if (memType == Shader) { + if(dev().settings().svmFineGrainSystem_) { + desc_.isAllocExecute_ = true; + desc_.SVMRes_ = true; + } // force to use remote memory for HW DEBUG or use // local memory once we determine if FGS is supported // memType = (!dev().settings().enableHwDebug_) ? Local : RemoteUSWC; @@ -573,6 +577,7 @@ Resource::create(MemoryType memType, CreateParams* params) imgCreateInfo.samples = 1; imgCreateInfo.fragments = 1; imgCreateInfo.tiling = Pal::ImageTiling::Linear; + imgCreateInfo.depthPitch = desc().height_ * imgCreateInfo.rowPitch; switch (misc) { case 1: // NV12 format @@ -635,6 +640,9 @@ Resource::create(MemoryType memType, CreateParams* params) } } result = image_->BindGpuMemory(iMem(), viewOffset); + if (result != Pal::Result::Success) { + return false; + } offset_ = static_cast(viewOffset); hwSrd_ = dev().srds().allocSrdSlot(reinterpret_cast(&hwState_)); if ((0 == hwSrd_) && (memoryType() != ImageView)) { @@ -1010,6 +1018,10 @@ Resource::create(MemoryType memType, CreateParams* params) return false; } + if(dev().settings().svmFineGrainSystem_) { + desc_.SVMRes_ = true; + } + // Ensure page alignment if ((uint64_t)(pinAddress) & (amd::Os::pageSize() - 1)) { return false; @@ -1028,21 +1040,31 @@ Resource::create(MemoryType memType, CreateParams* params) return true; } + Pal::gpusize svmPtr = 0; if ((nullptr != params) && (nullptr != params->owner_) && (nullptr != params->owner_->getSvmPtr())) { - Pal::gpusize svmPtr = reinterpret_cast(params->owner_->getSvmPtr()); + svmPtr = reinterpret_cast(params->owner_->getSvmPtr()); + desc_.SVMRes_ = true; svmPtr = (svmPtr == 1) ? 0 : svmPtr; + } + if (desc_.SVMRes_) { // @todo 64K alignment is too big uint allocSize = amd::alignUp(desc().width_ * elementSize_, MaxGpuAlignment); - if (memoryType() == Remote) { + if ((memoryType() == RemoteUSWC) || + (memoryType() == Remote)) { Pal::SvmGpuMemoryCreateInfo createInfo = {}; + createInfo.isUsedForKernel = desc_.isAllocExecute_; createInfo.size = allocSize; createInfo.alignment = MaxGpuAlignment; if (svmPtr != 0) { createInfo.flags.useReservedGpuVa = true; createInfo.pReservedGpuVaOwner = params->svmBase_->iMem(); } + else { + createInfo.flags.useReservedGpuVa = false; + createInfo.pReservedGpuVaOwner = nullptr; + } memRef_ = GpuMemoryReference::Create(dev(), createInfo); } else { @@ -1063,8 +1085,11 @@ Resource::create(MemoryType memType, CreateParams* params) return false; } desc_.cardMemory_ = false; - desc_.SVMRes_ = true; - params->owner_->setSvmPtr(reinterpret_cast(memRef_->iMem()->Desc().gpuVirtAddr)); + if ((nullptr != params) && + (nullptr != params->owner_) && + (nullptr != params->owner_->getSvmPtr())) { + params->owner_->setSvmPtr(reinterpret_cast(memRef_->iMem()->Desc().gpuVirtAddr)); + } return true; } diff --git a/projects/clr/rocclr/runtime/device/pal/palsettings.cpp b/projects/clr/rocclr/runtime/device/pal/palsettings.cpp index e34eb1c216..b6b1b2dabb 100644 --- a/projects/clr/rocclr/runtime/device/pal/palsettings.cpp +++ b/projects/clr/rocclr/runtime/device/pal/palsettings.cpp @@ -82,9 +82,6 @@ Settings::Settings() // GPU device by default apuSystem_ = false; - // Fine-Grained System is disabled by default - svmFineGrainSystem_ = false; - // Disable 64 bit pointers support by default use64BitPtr_ = false; @@ -361,12 +358,11 @@ Settings::create( // accessing persistent staged buffer may fail if LongIdleDetct is enabled. disablePersistent_ = true; } - - svmFineGrainSystem_ = calAttr.isSVMFineGrainSystem; - - svmAtomics_ = (calAttr.svmAtomics || calAttr.isSVMFineGrainSystem) ? true : false; */ + svmFineGrainSystem_ = palProp.gpuMemoryProperties.flags.iommuv2Support; + svmAtomics_ = svmFineGrainSystem_; + // SVM is not currently supported for DX Interop #if defined(_WIN32) enableExtension(ClKhrD3d9Sharing); diff --git a/projects/clr/rocclr/runtime/device/pal/palvirtual.cpp b/projects/clr/rocclr/runtime/device/pal/palvirtual.cpp index 27b35e9bbf..55b3093c84 100644 --- a/projects/clr/rocclr/runtime/device/pal/palvirtual.cpp +++ b/projects/clr/rocclr/runtime/device/pal/palvirtual.cpp @@ -793,8 +793,7 @@ VirtualGPU::create(bool profiling, uint deviceQueueSize, uint rtCUs, if (dev().numDMAEngines() != 0) { uint sdma; // If only 1 DMA engine is available then use that one - if ((dev().numDMAEngines() < 2) || (idx & 0x1) || - (dev().settings().apuSystem_ && !dev().settings().svmFineGrainSystem_)) { + if ((dev().numDMAEngines() < 2) || ((idx & 0x1) && !dev().settings().svmFineGrainSystem_)) { sdma = 0; } else { @@ -2144,7 +2143,7 @@ VirtualGPU::submitKernelInternal( dispatchParam.pCpuAqlCode = hsaKernel.cpuAqlCode(); dispatchParam.hsaQueueVa = hsaQueueMem_->vmAddress(); dispatchParam.wavesPerSh = hsaKernel.getWavesPerSH(this); - + dispatchParam.useAtc = dev().settings().svmFineGrainSystem_ ? true : false; // Run AQL dispatch in HW eventBegin(MainEngine); iCmd()->CmdDispatchAql(dispatchParam);