Skip to content

Commit 7764ac4

Browse files
Implement support for zeDeviceGetGlobalTimestamps
Related-To: LOCI-1933 Signed-off-by: Aravind Gopalakrishnan <[email protected]>
1 parent 3c6d026 commit 7764ac4

File tree

7 files changed

+132
-1
lines changed

7 files changed

+132
-1
lines changed

level_zero/api/core/ze_core_loader.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,7 @@ zeGetDeviceProcAddrTable(
219219
pDdiTable->pfnCanAccessPeer = zeDeviceCanAccessPeer;
220220
pDdiTable->pfnGetStatus = zeDeviceGetStatus;
221221
pDdiTable->pfnGetExternalMemoryProperties = zeDeviceGetExternalMemoryProperties;
222+
pDdiTable->pfnGetGlobalTimestamps = zeDeviceGetGlobalTimestamps;
222223
driver_ddiTable.core_ddiTable.Device = *pDdiTable;
223224
if (driver_ddiTable.enableTracing) {
224225
pDdiTable->pfnGet = zeDeviceGet_Tracing;

level_zero/api/core/ze_device.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2019-2020 Intel Corporation
2+
* Copyright (C) 2019-2021 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
@@ -114,3 +114,11 @@ zeDeviceGetStatus(
114114
ze_device_handle_t hDevice) {
115115
return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE;
116116
}
117+
118+
ZE_APIEXPORT ze_result_t ZE_APICALL
119+
zeDeviceGetGlobalTimestamps(
120+
ze_device_handle_t hDevice,
121+
uint64_t *hostTimestamp,
122+
uint64_t *deviceTimestamp) {
123+
return L0::Device::fromHandle(hDevice)->getGlobalTimestamps(hostTimestamp, deviceTimestamp);
124+
}

level_zero/core/source/device/device.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ struct Device : _ze_device_handle_t {
7070
virtual ze_result_t imageGetProperties(const ze_image_desc_t *desc, ze_image_properties_t *pImageProperties) = 0;
7171
virtual ze_result_t getDeviceImageProperties(ze_device_image_properties_t *pDeviceImageProperties) = 0;
7272
virtual ze_result_t getExternalMemoryProperties(ze_device_external_memory_properties_t *pExternalMemoryProperties) = 0;
73+
virtual ze_result_t getGlobalTimestamps(uint64_t *hostTimestamp, uint64_t *deviceTimestamp) = 0;
7374

7475
virtual ze_result_t getCommandQueueGroupProperties(uint32_t *pCount,
7576
ze_command_queue_group_properties_t *pCommandQueueGroupProperties) = 0;

level_zero/core/source/device/device_imp.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,21 @@ ze_result_t DeviceImp::getExternalMemoryProperties(ze_device_external_memory_pro
431431
return ZE_RESULT_SUCCESS;
432432
}
433433

434+
ze_result_t DeviceImp::getGlobalTimestamps(uint64_t *hostTimestamp, uint64_t *deviceTimestamp) {
435+
NEO::TimeStampData queueTimeStamp;
436+
bool retVal = this->neoDevice->getOSTime()->getCpuGpuTime(&queueTimeStamp);
437+
if (!retVal)
438+
return ZE_RESULT_ERROR_DEVICE_LOST;
439+
440+
*deviceTimestamp = queueTimeStamp.GPUTimeStamp;
441+
442+
retVal = this->neoDevice->getOSTime()->getCpuTime(hostTimestamp);
443+
if (!retVal)
444+
return ZE_RESULT_ERROR_DEVICE_LOST;
445+
446+
return ZE_RESULT_SUCCESS;
447+
}
448+
434449
ze_result_t DeviceImp::getSubDevices(uint32_t *pCount, ze_device_handle_t *phSubdevices) {
435450
if (*pCount == 0) {
436451
*pCount = this->numSubDevices;

level_zero/core/source/device/device_imp.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ struct DeviceImp : public Device {
4646
ze_result_t getCommandQueueGroupProperties(uint32_t *pCount,
4747
ze_command_queue_group_properties_t *pCommandQueueGroupProperties) override;
4848
ze_result_t getExternalMemoryProperties(ze_device_external_memory_properties_t *pExternalMemoryProperties) override;
49+
ze_result_t getGlobalTimestamps(uint64_t *hostTimestamp, uint64_t *deviceTimestamp) override;
4950
ze_result_t getDebugProperties(zet_device_debug_properties_t *pDebugProperties) override;
5051

5152
ze_result_t systemBarrier() override;

level_zero/core/test/unit_tests/mocks/mock_device.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,11 @@ struct Mock<Device> : public Device {
131131
getExternalMemoryProperties,
132132
(ze_device_external_memory_properties_t * pExternalMemoryProperties),
133133
(override));
134+
MOCK_METHOD(ze_result_t,
135+
getGlobalTimestamps,
136+
(uint64_t * hostTimestamp,
137+
uint64_t *deviceTimestamp),
138+
(override));
134139
MOCK_METHOD(ze_result_t,
135140
systemBarrier,
136141
(),

level_zero/core/test/unit_tests/sources/device/test_device.cpp

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "shared/source/device/root_device.h"
99
#include "shared/source/helpers/bindless_heaps_helper.h"
1010
#include "shared/source/os_interface/hw_info_config.h"
11+
#include "shared/source/os_interface/os_time.h"
1112
#include "shared/test/common/helpers/debug_manager_state_restore.h"
1213
#include "shared/test/common/mocks/mock_device.h"
1314
#include "shared/test/common/mocks/ult_device_factory.h"
@@ -326,6 +327,105 @@ TEST_F(DeviceTest, whenGetExternalMemoryPropertiesIsCalledThenSuccessIsReturnedA
326327
EXPECT_TRUE(externalMemoryProperties.memoryAllocationImportTypes & ZE_EXTERNAL_MEMORY_TYPE_FLAG_DMA_BUF);
327328
}
328329

330+
TEST_F(DeviceTest, whenGetGlobalTimestampIsCalledThenSuccessIsReturnedAndValuesSetCorrectly) {
331+
uint64_t hostTs = 0u;
332+
uint64_t deviceTs = 0u;
333+
334+
ze_result_t result = device->getGlobalTimestamps(&hostTs, &deviceTs);
335+
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
336+
337+
EXPECT_NE(0u, hostTs);
338+
EXPECT_NE(0u, deviceTs);
339+
}
340+
341+
class FalseCpuGpuTime : public NEO::OSTime {
342+
public:
343+
bool getCpuGpuTime(TimeStampData *pGpuCpuTime) override {
344+
return false;
345+
}
346+
bool getCpuTime(uint64_t *timeStamp) override {
347+
return true;
348+
};
349+
double getHostTimerResolution() const override {
350+
return 0;
351+
}
352+
double getDynamicDeviceTimerResolution(HardwareInfo const &hwInfo) const override {
353+
return NEO::OSTime::getDeviceTimerResolution(hwInfo);
354+
}
355+
uint64_t getCpuRawTimestamp() override {
356+
return 0;
357+
}
358+
static std::unique_ptr<OSTime> create() {
359+
return std::unique_ptr<OSTime>(new FalseCpuGpuTime());
360+
}
361+
};
362+
363+
struct GlobalTimestampTest : public ::testing::Test {
364+
void SetUp() override {
365+
DebugManager.flags.CreateMultipleRootDevices.set(numRootDevices);
366+
neoDevice = NEO::MockDevice::createWithNewExecutionEnvironment<NEO::MockDevice>(NEO::defaultHwInfo.get(), rootDeviceIndex);
367+
}
368+
369+
DebugManagerStateRestore restorer;
370+
std::unique_ptr<Mock<L0::DriverHandleImp>> driverHandle;
371+
NEO::MockDevice *neoDevice = nullptr;
372+
L0::Device *device = nullptr;
373+
const uint32_t rootDeviceIndex = 1u;
374+
const uint32_t numRootDevices = 2u;
375+
};
376+
377+
TEST_F(GlobalTimestampTest, whenGetGlobalTimestampCalledAndGetCpuGpuTimeIsFalseReturnError) {
378+
uint64_t hostTs = 0u;
379+
uint64_t deviceTs = 0u;
380+
381+
neoDevice->setOSTime(new FalseCpuGpuTime());
382+
NEO::DeviceVector devices;
383+
devices.push_back(std::unique_ptr<NEO::Device>(neoDevice));
384+
driverHandle = std::make_unique<Mock<L0::DriverHandleImp>>();
385+
driverHandle->initialize(std::move(devices));
386+
device = driverHandle->devices[0];
387+
388+
ze_result_t result = device->getGlobalTimestamps(&hostTs, &deviceTs);
389+
EXPECT_EQ(ZE_RESULT_ERROR_DEVICE_LOST, result);
390+
}
391+
392+
class FalseCpuTime : public NEO::OSTime {
393+
public:
394+
bool getCpuGpuTime(TimeStampData *pGpuCpuTime) override {
395+
return true;
396+
}
397+
bool getCpuTime(uint64_t *timeStamp) override {
398+
return false;
399+
};
400+
double getHostTimerResolution() const override {
401+
return 0;
402+
}
403+
double getDynamicDeviceTimerResolution(HardwareInfo const &hwInfo) const override {
404+
return NEO::OSTime::getDeviceTimerResolution(hwInfo);
405+
}
406+
uint64_t getCpuRawTimestamp() override {
407+
return 0;
408+
}
409+
static std::unique_ptr<OSTime> create() {
410+
return std::unique_ptr<OSTime>(new FalseCpuTime());
411+
}
412+
};
413+
414+
TEST_F(GlobalTimestampTest, whenGetGlobalTimestampCalledAndGetCpuTimeIsFalseReturnError) {
415+
uint64_t hostTs = 0u;
416+
uint64_t deviceTs = 0u;
417+
418+
neoDevice->setOSTime(new FalseCpuTime());
419+
NEO::DeviceVector devices;
420+
devices.push_back(std::unique_ptr<NEO::Device>(neoDevice));
421+
driverHandle = std::make_unique<Mock<L0::DriverHandleImp>>();
422+
driverHandle->initialize(std::move(devices));
423+
device = driverHandle->devices[0];
424+
425+
ze_result_t result = device->getGlobalTimestamps(&hostTs, &deviceTs);
426+
EXPECT_EQ(ZE_RESULT_ERROR_DEVICE_LOST, result);
427+
}
428+
329429
using DeviceGetMemoryTests = DeviceTest;
330430

331431
TEST_F(DeviceGetMemoryTests, whenCallingGetMemoryPropertiesWithCountZeroThenOneIsReturned) {

0 commit comments

Comments
 (0)