From 284ae9f6db4fdb0aa5293e6afc991ce1d97eae71 Mon Sep 17 00:00:00 2001 From: foreman Date: Fri, 17 Jun 2016 15:58:45 -0400 Subject: [PATCH] P4 to Git Change 1281189 by jatang@jatang-opencl-hsa-stg2 on 2016/06/17 15:16:29 SWDEV-1 - OCL PerfCounter on PAL. Affected files ... ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palbe/src/core/hw/gfxip/computeCmdBuffer.cpp#3 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palbe/src/core/hw/gfxip/computeCmdBuffer.h#2 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palbe/src/core/hw/gfxip/gfx6/gfx6ComputeCmdBuffer.cpp#4 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palbe/src/core/hw/gfxip/gfx6/gfx6ComputeCmdBuffer.h#4 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palbe/src/core/hw/gfxip/gfx6/gfx6PerfCounter.cpp#2 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palbe/src/core/hw/gfxip/gfx6/gfx6PerfTrace.cpp#2 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palcounters.cpp#2 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palcounters.hpp#3 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palvirtual.cpp#12 edit [ROCm/clr commit: 6e099aabfbe0cde451b7a943890b08d7a5ce88ce] --- .../rocclr/runtime/device/pal/palcounters.cpp | 73 ++++++++++++++++++- .../rocclr/runtime/device/pal/palcounters.hpp | 8 +- .../rocclr/runtime/device/pal/palvirtual.cpp | 6 ++ 3 files changed, 78 insertions(+), 9 deletions(-) diff --git a/projects/clr/rocclr/runtime/device/pal/palcounters.cpp b/projects/clr/rocclr/runtime/device/pal/palcounters.cpp index 4835f1a16e..de45322a30 100644 --- a/projects/clr/rocclr/runtime/device/pal/palcounters.cpp +++ b/projects/clr/rocclr/runtime/device/pal/palcounters.cpp @@ -33,7 +33,8 @@ PalCounterReference::Create( return memRef; } -PalCounterReference::~PalCounterReference() { +PalCounterReference::~PalCounterReference() +{ // The counter object is always associated with a particular queue, // so we have to lock just this queue amd::ScopedLock lock(gpu_.execution()); @@ -43,7 +44,8 @@ PalCounterReference::~PalCounterReference() { } bool -PalCounterReference::growResultArray(uint index) { +PalCounterReference::growResultArray(uint index) +{ if (results_ != nullptr) { delete [] results_; } @@ -54,6 +56,68 @@ PalCounterReference::growResultArray(uint index) { return true; } +bool PalCounterReference::finalize() +{ + iPerf()->Finalize(); + + // Acquire GPU memory for the query from the pool and bind it. + Pal::GpuMemoryRequirements gpuMemReqs = {}; + iPerf()->GetGpuMemoryRequirements(&gpuMemReqs); + + Pal::GpuMemoryCreateInfo createInfo = {}; + createInfo.size = amd::alignUp(gpuMemReqs.size, gpuMemReqs.alignment); + createInfo.alignment = gpuMemReqs.alignment; + createInfo.vaRange = Pal::VaRange::Default; + createInfo.heapCount = 1; + //createInfo.heaps[0] = Pal::GpuHeapGartCacheable; + createInfo.heaps[0] = gpuMemReqs.heaps[0]; + createInfo.priority = Pal::GpuMemPriority::Normal; + + Pal::Result result; + size_t gpuMemSize = gpu().dev().iDev()->GetGpuMemorySize(createInfo, &result); + if (result != Pal::Result::Success) { + return false; + } + + char* pMemory = new char[gpuMemSize]; + + if (pMemory != nullptr) { + result = gpu().dev().iDev()->CreateGpuMemory(createInfo, pMemory, &pGpuMemory); + + if (result == Pal::Result::Success) { + // GPU profiler memory is perma-resident. + result = gpu().dev().iDev()->AddGpuMemoryReferences(1, &pGpuMemory, nullptr, Pal::GpuMemoryRefCantTrim); + + if (result == Pal::Result::Success) { + // GPU profiler memory is perma-mapped. + result = pGpuMemory->Map(&pCpuAddr); + } + } + + if (result != Pal::Result::Success) { + if (pGpuMemory != nullptr) { + pGpuMemory->Destroy(); + pGpuMemory = nullptr; + pCpuAddr = nullptr; + } + + delete pMemory; + return false; + } + } + else { + return false; + } + + result = iPerf()->BindGpuMemory(pGpuMemory, 0); + if (result == Pal::Result::Success) { + return true; + } + else { + return false; + } +} + PerfCounter::~PerfCounter() { if (calRef_ == nullptr) { @@ -106,8 +170,9 @@ PerfCounter::getInfo(uint64_t infoType) const return info()->eventIndex_; } case CL_PERFCOUNTER_DATA: { - Unimplemented(); - //gslCounter()->GetResult(gpu().cs(), reinterpret_cast(calRef_->results())); + Pal::GlobalCounterLayout layout = {}; + counter_->GetGlobalCounterLayout(&layout); + return calRef_->results()[index_]; } default: diff --git a/projects/clr/rocclr/runtime/device/pal/palcounters.hpp b/projects/clr/rocclr/runtime/device/pal/palcounters.hpp index 0d4216e7f8..7032c91549 100644 --- a/projects/clr/rocclr/runtime/device/pal/palcounters.hpp +++ b/projects/clr/rocclr/runtime/device/pal/palcounters.hpp @@ -38,11 +38,7 @@ public: uint maxIndex //!< the maximum HW counter index in the PAL counter ); - void finalize() { - iPerf()->Finalize(); - Pal::GlobalCounterLayout layout = {}; - layout.sampleCount = referenceCount() - 1; - iPerf()->GetGlobalCounterLayout(&layout); } + bool finalize(); //! Returns the PAL counter results uint64_t* results() const { return results_; } @@ -62,6 +58,8 @@ private: VirtualGPU& gpu_; //!< The virtual GPU device object uint64_t* results_; //!< Counter results + Pal::IGpuMemory* pGpuMemory; + void* pCpuAddr; }; //! Performance counter implementation on GPU diff --git a/projects/clr/rocclr/runtime/device/pal/palvirtual.cpp b/projects/clr/rocclr/runtime/device/pal/palvirtual.cpp index ecd259e777..145b2fc7cb 100644 --- a/projects/clr/rocclr/runtime/device/pal/palvirtual.cpp +++ b/projects/clr/rocclr/runtime/device/pal/palvirtual.cpp @@ -2303,6 +2303,12 @@ VirtualGPU::submitPerfCounter(amd::PerfCounterCommand& vcmd) // Create performance experiment Pal::PerfExperimentCreateInfo createInfo = {}; + + createInfo.optionFlags.sampleInternalOperations = 1; + createInfo.optionFlags.cacheFlushOnCounterCollection = 1; + createInfo.optionFlags.sqShaderMask = 1; + createInfo.optionValues.sampleInternalOperations = true; + createInfo.optionValues.cacheFlushOnCounterCollection = true; createInfo.optionValues.sqShaderMask = Pal::PerfShaderMaskCs; PalCounterReference* palRef = PalCounterReference::Create(*this, createInfo);