diff --git a/opencl/source/command_queue/cpu_data_transfer_handler.cpp b/opencl/source/command_queue/cpu_data_transfer_handler.cpp index 784e97220c..0ad47ef0a3 100644 --- a/opencl/source/command_queue/cpu_data_transfer_handler.cpp +++ b/opencl/source/command_queue/cpu_data_transfer_handler.cpp @@ -96,9 +96,7 @@ void *CommandQueue::cpuDataTransferHandler(TransferProperties &transferPropertie bool modifySimulationFlags = false; if (outEventObj) { - TimeStampData submitTimeStamp; - getDevice().getOSTime()->getGpuCpuTime(&submitTimeStamp); - outEventObj->setSubmitTimeStamp(submitTimeStamp); + outEventObj->setSubmitTimeStamp(); } // wait for the completness of previous commands if (transferProperties.finishRequired) { diff --git a/opencl/source/command_queue/enqueue_common.h b/opencl/source/command_queue/enqueue_common.h index 07c7412264..8ec3ba8ebd 100644 --- a/opencl/source/command_queue/enqueue_common.h +++ b/opencl/source/command_queue/enqueue_common.h @@ -420,9 +420,7 @@ cl_int CommandQueueHw::enqueueHandler(Surface **surfacesForResidency, completionStamp.taskLevel = taskLevel; if (eventBuilder.getEvent() && isProfilingEnabled()) { - TimeStampData submitTimeStamp; - getDevice().getOSTime()->getGpuCpuTime(&submitTimeStamp); - eventBuilder.getEvent()->setSubmitTimeStamp(submitTimeStamp); + eventBuilder.getEvent()->setSubmitTimeStamp(); eventBuilder.getEvent()->setStartTimeStamp(); } @@ -846,9 +844,7 @@ CompletionStamp CommandQueueHw::enqueueNonBlocked( } if (isProfilingEnabled() && eventBuilder.getEvent()) { - TimeStampData submitTimeStamp; - getDevice().getOSTime()->getGpuCpuTime(&submitTimeStamp); - eventBuilder.getEvent()->setSubmitTimeStamp(submitTimeStamp); + eventBuilder.getEvent()->setSubmitTimeStamp(); auto hwTimestampNode = eventBuilder.getEvent()->getHwTimeStampNode(); if (hwTimestampNode) { @@ -1113,9 +1109,7 @@ CompletionStamp CommandQueueHw::enqueueCommandWithoutKernel( } if (eventBuilder.getEvent() && isProfilingEnabled()) { - TimeStampData submitTimeStamp; - getDevice().getOSTime()->getGpuCpuTime(&submitTimeStamp); - eventBuilder.getEvent()->setSubmitTimeStamp(submitTimeStamp); + eventBuilder.getEvent()->setSubmitTimeStamp(); eventBuilder.getEvent()->setStartTimeStamp(); } diff --git a/opencl/source/event/event.cpp b/opencl/source/event/event.cpp index e93f43a0e0..7cecd6216a 100644 --- a/opencl/source/event/event.cpp +++ b/opencl/source/event/event.cpp @@ -291,15 +291,18 @@ void Event::setupRelativeProfilingInfo(ProfilingInfo &profilingInfo) { } } -void Event::setSubmitTimeStamp(const TimeStampData &submitTimeStamp) { +void Event::setSubmitTimeStamp() { UNRECOVERABLE_IF(!cmdQueue); auto &device = cmdQueue->getDevice(); auto &gfxCoreHelper = device.getGfxCoreHelper(); double resolution = device.getDeviceInfo().profilingTimerResolution; UNRECOVERABLE_IF(resolution == 0.0); - this->submitTimeStamp.cpuTimeInNs = submitTimeStamp.cpuTimeinNS; - this->submitTimeStamp.gpuTimeInNs = gfxCoreHelper.getGpuTimeStampInNS(submitTimeStamp.gpuTimeStamp, resolution); - this->submitTimeStamp.gpuTimeStamp = submitTimeStamp.gpuTimeStamp; + + this->cmdQueue->getDevice().getOSTime()->getCpuTime(&this->submitTimeStamp.cpuTimeInNs); + TimeStampData submitCpuGpuTime{}; + this->cmdQueue->getDevice().getOSTime()->getGpuCpuTime(&submitCpuGpuTime); + this->submitTimeStamp.gpuTimeInNs = gfxCoreHelper.getGpuTimeStampInNS(submitCpuGpuTime.gpuTimeStamp, resolution); + this->submitTimeStamp.gpuTimeStamp = submitCpuGpuTime.gpuTimeStamp; setupRelativeProfilingInfo(queueTimeStamp); } @@ -608,9 +611,7 @@ void Event::submitCommand(bool abortTasks) { this->cmdQueue->getGpgpuCommandStreamReceiver().makeResident(*timeStampNode->getBaseGraphicsAllocation()); cmdToProcess->timestamp = timeStampNode; } - TimeStampData submitTimeStamp{}; - this->cmdQueue->getDevice().getOSTime()->getGpuCpuTime(&submitTimeStamp); - this->setSubmitTimeStamp(submitTimeStamp); + this->setSubmitTimeStamp(); if (profilingCpuPath) { setStartTimeStamp(); } else { diff --git a/opencl/source/event/event.h b/opencl/source/event/event.h index 347fddf9ac..370529a2f4 100644 --- a/opencl/source/event/event.h +++ b/opencl/source/event/event.h @@ -294,7 +294,7 @@ class Event : public BaseObject<_cl_event>, public IDNode { } void setQueueTimeStamp(); - void setSubmitTimeStamp(const TimeStampData &submitTimeStamp); + void setSubmitTimeStamp(); void setStartTimeStamp(); void setEndTimeStamp(); diff --git a/opencl/test/unit_test/event/event_tests.cpp b/opencl/test/unit_test/event/event_tests.cpp index 3f6b02c33f..f7a839eeb3 100644 --- a/opencl/test/unit_test/event/event_tests.cpp +++ b/opencl/test/unit_test/event/event_tests.cpp @@ -1357,7 +1357,14 @@ TEST_F(EventTest, whenSettingSubmitTimestampThenQueueAndSubmitTimestampsAreSet) submitTimeStamp.cpuTimeinNS = cpuTimeStamp + expectedCpuDiff; submitTimeStamp.gpuTimeStamp = expectedQueueGpuTimeStamp + expectedGpuDiff; - event.setSubmitTimeStamp(submitTimeStamp); + auto osTime = static_cast(pDevice->getOSTime()); + osTime->cpuTimeResult = submitTimeStamp.cpuTimeinNS; + + auto deviceTime = static_cast(osTime->deviceTime.get()); + deviceTime->cpuTimeResult = submitTimeStamp.cpuTimeinNS; + deviceTime->gpuTimeStampResult = submitTimeStamp.gpuTimeStamp; + + event.setSubmitTimeStamp(); EXPECT_EQ(expectedQueueGpuTimeStamp, event.queueTimeStamp.gpuTimeStamp); EXPECT_EQ(cpuTimeStamp, event.queueTimeStamp.cpuTimeInNs); diff --git a/shared/test/common/mocks/mock_ostime.h b/shared/test/common/mocks/mock_ostime.h index 4e094eda0b..c963573178 100644 --- a/shared/test/common/mocks/mock_ostime.h +++ b/shared/test/common/mocks/mock_ostime.h @@ -14,9 +14,19 @@ namespace NEO { static std::atomic PerfTicks{0}; constexpr uint64_t convertToNs = 100; class MockDeviceTime : public DeviceTime { + public: + ~MockDeviceTime() override = default; bool getGpuCpuTimeImpl(TimeStampData *pGpuCpuTime, OSTime *osTime) override { - pGpuCpuTime->gpuTimeStamp = ++PerfTicks; - pGpuCpuTime->cpuTimeinNS = PerfTicks * convertToNs; + if (gpuTimeStampResult) { + pGpuCpuTime->gpuTimeStamp = *gpuTimeStampResult; + } else { + pGpuCpuTime->gpuTimeStamp = ++PerfTicks; + } + if (cpuTimeResult) { + pGpuCpuTime->cpuTimeinNS = *cpuTimeResult; + } else { + pGpuCpuTime->cpuTimeinNS = PerfTicks * convertToNs; + } return true; } @@ -27,16 +37,24 @@ class MockDeviceTime : public DeviceTime { uint64_t getDynamicDeviceTimerClock(HardwareInfo const &hwInfo) const override { return static_cast(1000000000.0 / OSTime::getDeviceTimerResolution(hwInfo)); } + std::optional gpuTimeStampResult{}; + std::optional cpuTimeResult{}; }; class MockOSTime : public OSTime { public: + using OSTime::deviceTime; MockOSTime() { this->deviceTime = std::make_unique(); } + ~MockOSTime() override = default; bool getCpuTime(uint64_t *timeStamp) override { - *timeStamp = ++PerfTicks * convertToNs; + if (cpuTimeResult) { + *timeStamp = *cpuTimeResult; + } else { + *timeStamp = ++PerfTicks * convertToNs; + } return true; }; double getHostTimerResolution() const override { @@ -49,6 +67,7 @@ class MockOSTime : public OSTime { static std::unique_ptr create() { return std::unique_ptr(new MockOSTime()); } + std::optional cpuTimeResult{}; }; class MockDeviceTimeWithConstTimestamp : public DeviceTime {