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());