Skip to content

Commit c86fa77

Browse files
Add method to get device from device
Related-To: NEO-3691 Change-Id: I710d740d82803e2a844b30a5cd3e4b017192f6f1 Signed-off-by: Mateusz Jablonski <[email protected]>
1 parent 6a7b701 commit c86fa77

File tree

6 files changed

+44
-0
lines changed

6 files changed

+44
-0
lines changed

runtime/device/device.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ class Device : public BaseObject<_cl_device_id> {
9898
return this->deviceInfo.sharedSystemMemCapabilities != 0u;
9999
}
100100
virtual uint32_t getNumAvailableDevices() const = 0;
101+
virtual Device *getDeviceById(uint32_t deviceId) const = 0;
101102

102103
protected:
103104
Device() = delete;

runtime/device/root_device.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,14 @@ uint32_t RootDevice::getNumAvailableDevices() const {
2525
return getNumSubDevices();
2626
}
2727

28+
Device *RootDevice::getDeviceById(uint32_t deviceId) const {
29+
UNRECOVERABLE_IF(deviceId >= getNumAvailableDevices());
30+
if (subdevices.empty()) {
31+
return const_cast<RootDevice *>(this);
32+
}
33+
return subdevices[deviceId].get();
34+
};
35+
2836
RootDevice::RootDevice(ExecutionEnvironment *executionEnvironment, uint32_t deviceIndex) : Device(executionEnvironment, deviceIndex) {}
2937
bool RootDevice::createDeviceImpl() {
3038
auto status = Device::createDeviceImpl();

runtime/device/root_device.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ class RootDevice : public Device {
1919
bool createDeviceImpl() override;
2020
uint32_t getNumAvailableDevices() const override;
2121
uint32_t getNumSubDevices() const;
22+
Device *getDeviceById(uint32_t deviceId) const override;
2223

2324
/* We hide the retain and release function of BaseObject. */
2425
void retain() override;

runtime/device/sub_device.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,5 +35,9 @@ DeviceBitfield SubDevice::getDeviceBitfieldForOsContext() const {
3535
uint32_t SubDevice::getNumAvailableDevices() const {
3636
return 1u;
3737
}
38+
Device *SubDevice::getDeviceById(uint32_t deviceId) const {
39+
UNRECOVERABLE_IF(deviceId >= getNumAvailableDevices());
40+
return const_cast<SubDevice *>(this);
41+
}
3842

3943
} // namespace NEO

runtime/device/sub_device.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ class SubDevice : public Device {
1818
void retainInternal();
1919
void releaseInternal();
2020
uint32_t getNumAvailableDevices() const override;
21+
Device *getDeviceById(uint32_t deviceId) const override;
2122

2223
protected:
2324
DeviceBitfield getDeviceBitfieldForOsContext() const override;

unit_tests/device/sub_device_tests.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,3 +100,32 @@ TEST(SubDevicesTest, givenSubDeviceWhenOsContextIsCreatedThenItsBitfieldBasesOnS
100100
EXPECT_EQ(firstSubDeviceMask, static_cast<uint32_t>(firstSubDevice->getDefaultEngine().osContext->getDeviceBitfield().to_ulong()));
101101
EXPECT_EQ(secondSubDeviceMask, static_cast<uint32_t>(secondSubDevice->getDefaultEngine().osContext->getDeviceBitfield().to_ulong()));
102102
}
103+
104+
TEST(SubDevicesTest, givenDeviceWithoutSubDevicesWhenGettingDeviceByIdZeroThenGetThisDevice) {
105+
auto device = std::unique_ptr<MockDevice>(MockDevice::createWithNewExecutionEnvironment<MockDevice>(*platformDevices));
106+
107+
EXPECT_EQ(1u, device->getNumAvailableDevices());
108+
EXPECT_EQ(device.get(), device->getDeviceById(0u));
109+
EXPECT_THROW(device->getDeviceById(1), std::exception);
110+
}
111+
112+
TEST(SubDevicesTest, givenDeviceWithSubDevicesWhenGettingDeviceByIdThenGetCorrectSubDevice) {
113+
DebugManagerStateRestore restorer;
114+
DebugManager.flags.CreateMultipleSubDevices.set(2);
115+
auto device = std::unique_ptr<MockDevice>(MockDevice::createWithNewExecutionEnvironment<MockDevice>(*platformDevices));
116+
EXPECT_EQ(2u, device->getNumSubDevices());
117+
EXPECT_EQ(device->subdevices.at(0).get(), device->getDeviceById(0));
118+
EXPECT_EQ(device->subdevices.at(1).get(), device->getDeviceById(1));
119+
EXPECT_THROW(device->getDeviceById(2), std::exception);
120+
}
121+
122+
TEST(SubDevicesTest, givenSubDevicesWhenGettingDeviceByIdZeroThenGetThisSubDevice) {
123+
DebugManagerStateRestore restorer;
124+
DebugManager.flags.CreateMultipleSubDevices.set(2);
125+
auto device = std::unique_ptr<MockDevice>(MockDevice::createWithNewExecutionEnvironment<MockDevice>(*platformDevices));
126+
EXPECT_EQ(2u, device->getNumSubDevices());
127+
auto subDevice = device->subdevices.at(0).get();
128+
129+
EXPECT_EQ(subDevice, subDevice->getDeviceById(0));
130+
EXPECT_THROW(subDevice->getDeviceById(1), std::exception);
131+
}

0 commit comments

Comments
 (0)