P4 to Git Change 1538910 by vsytchen@vsytchen-ocl-win10 on 2018/04/10 11:54:42

SWDEV-150453 - [CQE OCL][DTB][Perf][QR][Vega][DTB-BLOCKER] Performance drop observed on multiple subtests while running Nuke

	1. Clean up suballocation chunk creation logic.
	2. Try to cache a resource if it wasn't a suballocation.

	ReviewBoardURL = http://ocltc.amd.com/reviews/r/14591/diff/

Affected files ...

... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palresource.cpp#62 edit
Bu işleme şunda yer alıyor:
foreman
2018-04-10 12:00:04 -04:00
ebeveyn caa618b3e4
işleme 3e14baceee
+18 -14
Dosyayı Görüntüle
@@ -1803,14 +1803,14 @@ bool MemorySubAllocator::InitAllocator(GpuMemoryReference* mem_ref) {
MemBuddyAllocator* allocator = new MemBuddyAllocator(
device_, device_->settings().subAllocationChunkSize_,
device_->settings().subAllocationMinSize_);
if ((allocator != nullptr) && (allocator->Init() == Pal::Result::Success)) {
heaps_.insert({mem_ref, allocator});
return true;
} else {
if (!((allocator != nullptr) &&
(allocator->Init() == Pal::Result::Success) &&
heaps_.insert({mem_ref, allocator}).second)) {
mem_ref->release();
delete allocator;
return false;
}
return false;
return true;
}
// ================================================================================================
@@ -1868,7 +1868,7 @@ bool FineMemorySubAllocator::CreateChunk(const Pal::IGpuMemory* reserved_va) {
MemorySubAllocator::~MemorySubAllocator()
{
// Release memory heap for suballocations
for (auto it : heaps_) {
for (const auto& it : heaps_) {
it.first->release();
delete it.second;
}
@@ -1887,7 +1887,7 @@ GpuMemoryReference* MemorySubAllocator::Allocate(Pal::gpusize size, Pal::gpusize
size = amd::alignUp(size, device_->settings().subAllocationMinSize_);
do {
// Find if current heap has enough empty space
for (auto it : heaps_) {
for (const auto& it : heaps_) {
mem_ref = it.first;
allocator = it.second;
// SVM allocations may required a fixed VA, make sure we find the heap with the same VA
@@ -1898,17 +1898,16 @@ GpuMemoryReference* MemorySubAllocator::Allocate(Pal::gpusize size, Pal::gpusize
// If we have found a valid chunk, then suballocate memory
if (Pal::Result::Success == allocator->Allocate(size, alignment, offset)) {
return mem_ref;
} else {
mem_ref = nullptr;
}
}
if ((mem_ref == nullptr) && !CreateChunk(reserved_va)) {
// We didn't find a valid chunk, so create a new one
if (!CreateChunk(reserved_va)) {
return nullptr;
}
i++;
} while (i < 2);
}
return mem_ref;
return nullptr;
}
// ================================================================================================
@@ -1950,11 +1949,16 @@ bool ResourceCache::addGpuMemory(Resource::Descriptor* desc,
// Check if runtime can free suballocation
if ((desc->type_ == Resource::Local) && !desc->SVMRes_) {
return mem_sub_alloc_local_.Free(&lockCacheOps_, ref, offset);
result = mem_sub_alloc_local_.Free(&lockCacheOps_, ref, offset);
} else if ((desc->type_ == Resource::Local) && desc->SVMRes_) {
return mem_sub_alloc_coarse_.Free(&lockCacheOps_, ref, offset);
result = mem_sub_alloc_coarse_.Free(&lockCacheOps_, ref, offset);
} else if (desc->SVMRes_) {
return mem_sub_alloc_fine_.Free(&lockCacheOps_, ref, offset);
result = mem_sub_alloc_fine_.Free(&lockCacheOps_, ref, offset);
}
// If a resource was a suballocation, don't try to cache it
if (result == true) {
return result;
}
// Make sure current allocation isn't bigger than cache