From 4417537eb5a97d3d29d350d9587a91ea19fc7571 Mon Sep 17 00:00:00 2001 From: Mateusz Jablonski Date: Tue, 26 Jan 2021 14:31:39 +0000 Subject: [PATCH] Add function to adjust timestamps on Windows Resolves: NEO-5435 Signed-off-by: Mateusz Jablonski --- .../unit_test/os_interface/hw_info_config_tests.cpp | 10 +++++++++- .../os_interface/linux/hw_info_config_linux_tests.cpp | 4 +++- .../os_interface/windows/hw_info_config_win_tests.cpp | 7 +++++-- .../os_interface/windows/os_time_win_tests.cpp | 3 ++- shared/source/os_interface/hw_info_config.h | 4 +++- shared/source/os_interface/hw_info_config.inl | 5 ++++- shared/source/os_interface/windows/os_time_win.cpp | 7 ++++++- shared/source/os_interface/windows/wddm/wddm.h | 2 ++ shared/test/unit_test/mock_gdi/mock_gdi.cpp | 3 ++- 9 files changed, 36 insertions(+), 9 deletions(-) diff --git a/opencl/test/unit_test/os_interface/hw_info_config_tests.cpp b/opencl/test/unit_test/os_interface/hw_info_config_tests.cpp index 7c0e07d8e9..931ba04661 100644 --- a/opencl/test/unit_test/os_interface/hw_info_config_tests.cpp +++ b/opencl/test/unit_test/os_interface/hw_info_config_tests.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017-2020 Intel Corporation + * Copyright (C) 2017-2021 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -111,3 +111,11 @@ TEST_F(HwInfoConfigTest, givenInvalidHwInfoWhenParsingHwInfoConfigThenErrorIsRet success = parseHwInfoConfigString("1x65535x65535", hwInfoConfig); EXPECT_FALSE(success); } + +HWTEST_F(HwInfoConfigTest, whenConvertingTimestampsToCsDomainThenNothingIsChanged) { + auto hwInfoConfig = HwInfoConfig::get(pInHwInfo.platform.eProductFamily); + uint64_t timestampData = 0x1234; + uint64_t initialData = timestampData; + hwInfoConfig->convertTimestampsFromOaToCsDomain(timestampData); + EXPECT_EQ(initialData, timestampData); +} \ No newline at end of file diff --git a/opencl/test/unit_test/os_interface/linux/hw_info_config_linux_tests.cpp b/opencl/test/unit_test/os_interface/linux/hw_info_config_linux_tests.cpp index 5d767339fe..ef0de18f73 100644 --- a/opencl/test/unit_test/os_interface/linux/hw_info_config_linux_tests.cpp +++ b/opencl/test/unit_test/os_interface/linux/hw_info_config_linux_tests.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2020 Intel Corporation + * Copyright (C) 2018-2021 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -79,6 +79,8 @@ bool HwInfoConfigHw::isEvenContextCountRequired() { return false; } +template <> +void HwInfoConfigHw::convertTimestampsFromOaToCsDomain(uint64_t ×tampData){}; } // namespace NEO struct DummyHwConfig : HwInfoConfigHw { diff --git a/opencl/test/unit_test/os_interface/windows/hw_info_config_win_tests.cpp b/opencl/test/unit_test/os_interface/windows/hw_info_config_win_tests.cpp index d6b0c01a1b..afd137acd6 100644 --- a/opencl/test/unit_test/os_interface/windows/hw_info_config_win_tests.cpp +++ b/opencl/test/unit_test/os_interface/windows/hw_info_config_win_tests.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2020 Intel Corporation + * Copyright (C) 2018-2021 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -57,6 +57,9 @@ bool HwInfoConfigHw::isEvenContextCountRequired() { return false; } +template <> +void HwInfoConfigHw::convertTimestampsFromOaToCsDomain(uint64_t ×tampData){}; + HwInfoConfigTestWindows::HwInfoConfigTestWindows() { this->executionEnvironment = std::make_unique(); this->rootDeviceEnvironment = std::make_unique(*executionEnvironment); @@ -124,4 +127,4 @@ HWTEST_F(HwInfoConfigTestWindows, givenFtrIaCoherencyFlagWhenConfiguringHwInfoTh EXPECT_EQ(initialCoherencyStatus, outHwInfo.capabilityTable.ftrSupportsCoherency); } -} // namespace NEO +} // namespace NEO \ No newline at end of file diff --git a/opencl/test/unit_test/os_interface/windows/os_time_win_tests.cpp b/opencl/test/unit_test/os_interface/windows/os_time_win_tests.cpp index 7b6ea95452..6f01053ede 100644 --- a/opencl/test/unit_test/os_interface/windows/os_time_win_tests.cpp +++ b/opencl/test/unit_test/os_interface/windows/os_time_win_tests.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017-2020 Intel Corporation + * Copyright (C) 2017-2021 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -90,6 +90,7 @@ TEST(OSTimeWinTests, givenNoOSInterfaceWhenGetCpuGpuTimeThenReturnsError) { TEST(OSTimeWinTests, givenOSInterfaceWhenGetCpuGpuTimeThenReturnsSuccess) { MockExecutionEnvironment executionEnvironment; RootDeviceEnvironment rootDeviceEnvironment(executionEnvironment); + rootDeviceEnvironment.setHwInfo(defaultHwInfo.get()); auto wddm = new WddmMock(rootDeviceEnvironment); TimeStampData CPUGPUTime01 = {0}; TimeStampData CPUGPUTime02 = {0}; diff --git a/shared/source/os_interface/hw_info_config.h b/shared/source/os_interface/hw_info_config.h index 03b8633029..cff9c0a50c 100644 --- a/shared/source/os_interface/hw_info_config.h +++ b/shared/source/os_interface/hw_info_config.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017-2020 Intel Corporation + * Copyright (C) 2017-2021 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -34,6 +34,7 @@ class HwInfoConfig { virtual uint64_t getCrossDeviceSharedMemCapabilities() = 0; virtual uint64_t getSharedSystemMemCapabilities() = 0; virtual bool isEvenContextCountRequired() = 0; + virtual void convertTimestampsFromOaToCsDomain(uint64_t ×tampData) = 0; uint32_t threadsPerEu; }; @@ -52,6 +53,7 @@ class HwInfoConfigHw : public HwInfoConfig { uint64_t getCrossDeviceSharedMemCapabilities() override; uint64_t getSharedSystemMemCapabilities() override; bool isEvenContextCountRequired() override; + void convertTimestampsFromOaToCsDomain(uint64_t ×tampData) override; protected: HwInfoConfigHw() = default; diff --git a/shared/source/os_interface/hw_info_config.inl b/shared/source/os_interface/hw_info_config.inl index e7b24e2d45..a347e5aa36 100644 --- a/shared/source/os_interface/hw_info_config.inl +++ b/shared/source/os_interface/hw_info_config.inl @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2020 Intel Corporation + * Copyright (C) 2018-2021 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -29,6 +29,9 @@ bool HwInfoConfigHw::isEvenContextCountRequired() { return false; } +template +void HwInfoConfigHw::convertTimestampsFromOaToCsDomain(uint64_t ×tampData){}; + template void HwInfoConfigHw::adjustPlatformForProductFamily(HardwareInfo *hwInfo) {} diff --git a/shared/source/os_interface/windows/os_time_win.cpp b/shared/source/os_interface/windows/os_time_win.cpp index fe6136e1a3..6b8e355527 100644 --- a/shared/source/os_interface/windows/os_time_win.cpp +++ b/shared/source/os_interface/windows/os_time_win.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017-2020 Intel Corporation + * Copyright (C) 2017-2021 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -7,6 +7,8 @@ #include "shared/source/os_interface/windows/os_time_win.h" +#include "shared/source/execution_environment/root_device_environment.h" +#include "shared/source/os_interface/hw_info_config.h" #include "shared/source/os_interface/windows/os_interface.h" #include "shared/source/os_interface/windows/wddm/wddm.h" @@ -54,6 +56,9 @@ bool OSTimeWin::getCpuGpuTime(TimeStampData *pGpuCpuTime) { TimeStampDataHeader escapeInfo = {0}; if (runEscape(wddm, escapeInfo)) { + auto productFamily = wddm->getRootDeviceEnvironment().getHardwareInfo()->platform.eProductFamily; + auto *hwInfoConfig = HwInfoConfig::get(productFamily); + hwInfoConfig->convertTimestampsFromOaToCsDomain(escapeInfo.m_Data.m_Out.gpuPerfTicks); double cpuNanoseconds = escapeInfo.m_Data.m_Out.cpuPerfTicks * (1000000000.0 / escapeInfo.m_Data.m_Out.cpuPerfFreq); diff --git a/shared/source/os_interface/windows/wddm/wddm.h b/shared/source/os_interface/windows/wddm/wddm.h index 38246e6e21..7d48fb3f47 100644 --- a/shared/source/os_interface/windows/wddm/wddm.h +++ b/shared/source/os_interface/windows/wddm/wddm.h @@ -159,6 +159,8 @@ class Wddm { return residencyLogger.get(); } + const RootDeviceEnvironment &getRootDeviceEnvironment() const { return rootDeviceEnvironment; } + protected: std::unique_ptr hwDeviceId; D3DKMT_HANDLE device = 0; diff --git a/shared/test/unit_test/mock_gdi/mock_gdi.cpp b/shared/test/unit_test/mock_gdi/mock_gdi.cpp index 4ce9651637..ad9c4d75a8 100644 --- a/shared/test/unit_test/mock_gdi/mock_gdi.cpp +++ b/shared/test/unit_test/mock_gdi/mock_gdi.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017-2020 Intel Corporation + * Copyright (C) 2017-2021 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -27,6 +27,7 @@ BOOLEAN WINAPI DllMain(IN HINSTANCE hDllHandle, NTSTATUS __stdcall D3DKMTEscape(IN CONST D3DKMT_ESCAPE *pData) { static int PerfTicks = 0; + ++PerfTicks; ((NEO::TimeStampDataHeader *)pData->pPrivateDriverData)->m_Data.m_Out.RetCode = NEO::GTDI_RET_OK; ((NEO::TimeStampDataHeader *)pData->pPrivateDriverData)->m_Data.m_Out.gpuPerfTicks = ++PerfTicks; ((NEO::TimeStampDataHeader *)pData->pPrivateDriverData)->m_Data.m_Out.cpuPerfTicks = PerfTicks;