From 61d898a8a504c35b48384fb93ae425b12a168eec Mon Sep 17 00:00:00 2001 From: foreman Date: Wed, 9 May 2018 12:20:05 -0400 Subject: [PATCH] P4 to Git Change 1552596 by gandryey@gera-w8 on 2018/05/09 11:58:01 SWDEV-79445 - OCL generic changes and code clean-up - Disable deferred allocations for single device in order to disable validation code in the dispatch. Improves batch speed in the OCLPerfKernelArguments test upto 10% in some subtests http://ocltc.amd.com/reviews/r/14807/ Affected files ... ... //depot/stg/opencl/drivers/opencl/runtime/platform/command.cpp#84 edit ... //depot/stg/opencl/drivers/opencl/runtime/platform/memory.cpp#131 edit --- rocclr/runtime/platform/command.cpp | 46 ++++++++++++++++++++++++++++- rocclr/runtime/platform/memory.cpp | 2 +- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/rocclr/runtime/platform/command.cpp b/rocclr/runtime/platform/command.cpp index eb6dd0580b..4d5f3ec81e 100644 --- a/rocclr/runtime/platform/command.cpp +++ b/rocclr/runtime/platform/command.cpp @@ -279,6 +279,11 @@ cl_int NativeFnCommand::invoke() { } bool OneMemoryArgCommand::validateMemory() { + // Runtime disables deferred memory allocation for single device. + // Hence ignore memory validations + if (queue()->context().devices().size() == 1) { + return true; + } device::Memory* mem = memory_->getDeviceMemory(queue()->device()); if (NULL == mem) { LogPrintfError("Can't allocate memory size - 0x%08X bytes!", memory_->getSize()); @@ -288,6 +293,11 @@ bool OneMemoryArgCommand::validateMemory() { } bool TwoMemoryArgsCommand::validateMemory() { + // Runtime disables deferred memory allocation for single device. + // Hence ignore memory validations + if (queue()->context().devices().size() == 1) { + return true; + } device::Memory* mem = memory1_->getDeviceMemory(queue()->device()); if (NULL == mem) { LogPrintfError("Can't allocate memory size - 0x%08X bytes!", memory1_->getSize()); @@ -364,6 +374,11 @@ void UnmapMemoryCommand::releaseResources() { } bool MigrateMemObjectsCommand::validateMemory() { + // Runtime disables deferred memory allocation for single device. + // Hence ignore memory validations + if (queue()->context().devices().size() == 1) { + return true; + } for (const auto& it : memObjects_) { device::Memory* mem = it->getDeviceMemory(queue()->device()); if (NULL == mem) { @@ -380,7 +395,11 @@ cl_int NDRangeKernelCommand::validateMemory() { if (!queue()->device().validateKernel(kernel(), queue()->vdev())) { return CL_OUT_OF_RESOURCES; } - + // Runtime disables deferred memory allocation for single device. + // Hence ignore memory validations + if (queue()->context().devices().size() == 1) { + return CL_SUCCESS; + } const amd::KernelSignature& signature = kernel().signature(); for (uint i = 0; i != signature.numParameters(); ++i) { const amd::KernelParameterDescriptor& desc = signature.at(i); @@ -421,6 +440,11 @@ cl_int NDRangeKernelCommand::validateMemory() { } bool ExtObjectsCommand::validateMemory() { + // Runtime disables deferred memory allocation for single device. + // Hence ignore memory validations + if (queue()->context().devices().size() == 1) { + return true; + } bool retVal = true; for (const auto& it : memObjects_) { device::Memory* mem = it->getDeviceMemory(queue()->device()); @@ -442,6 +466,11 @@ bool ReleaseExtObjectsCommand::processGLResource(device::Memory* mem) { } bool MakeBuffersResidentCommand::validateMemory() { + // Runtime disables deferred memory allocation for single device. + // Hence ignore memory validations + if (queue()->context().devices().size() == 1) { + return true; + } for (const auto& it : memObjects_) { device::Memory* mem = it->getDeviceMemory(queue()->device()); if (NULL == mem) { @@ -453,6 +482,11 @@ bool MakeBuffersResidentCommand::validateMemory() { } bool ThreadTraceMemObjectsCommand::validateMemory() { + // Runtime disables deferred memory allocation for single device. + // Hence ignore memory validations + if (queue()->context().devices().size() == 1) { + return true; + } for (auto it = memObjects_.cbegin(); it != memObjects_.cend(); it++) { device::Memory* mem = (*it)->getDeviceMemory(queue()->device()); if (NULL == mem) { @@ -510,6 +544,11 @@ void TransferBufferFileCommand::submit(device::VirtualDevice& device) { } bool TransferBufferFileCommand::validateMemory() { + // Runtime disables deferred memory allocation for single device. + // Hence ignore memory validations + if (queue()->context().devices().size() == 1) { + return true; + } // Check if the destination buffer has direct host access if (!(memory_->getMemFlags() & (CL_MEM_USE_HOST_PTR | CL_MEM_ALLOC_HOST_PTR | CL_MEM_USE_PERSISTENT_MEM_AMD))) { @@ -537,6 +576,11 @@ bool TransferBufferFileCommand::validateMemory() { } bool CopyMemoryP2PCommand::validateMemory() { + // Runtime disables deferred memory allocation for single device. + // Hence ignore memory validations + if (queue()->context().devices().size() == 1) { + return true; + } const std::vector& devices = memory1_->getContext().devices(); if (devices.size() != 1) { LogError("Can't allocate memory object for P2P extension"); diff --git a/rocclr/runtime/platform/memory.cpp b/rocclr/runtime/platform/memory.cpp index c3a5b119b4..b17f4032c2 100644 --- a/rocclr/runtime/platform/memory.cpp +++ b/rocclr/runtime/platform/memory.cpp @@ -238,7 +238,7 @@ bool Memory::create(void* initFrom, bool sysMemAlloc) { deviceMemories_[i].ref_ = devices[i]; deviceMemories_[i].value_ = NULL; - if (DISABLE_DEFERRED_ALLOC) { + if ((devices.size() == 1) || DISABLE_DEFERRED_ALLOC) { device::Memory* mem = getDeviceMemory(*devices[i]); if (NULL == mem) { LogPrintfError("Can't allocate memory size - 0x%08X bytes!", getSize());