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