Skip to content

Commit 1762701

Browse files
Simplify RootDevice class
Signed-off-by: Bartosz Dunajski <[email protected]>
1 parent 3521d89 commit 1762701

File tree

8 files changed

+66
-49
lines changed

8 files changed

+66
-49
lines changed

level_zero/core/test/unit_tests/sources/memory/test_memory.cpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1982,8 +1982,7 @@ struct MemoryBitfieldTest : testing::Test {
19821982
executionEnvironment->rootDeviceEnvironments[0]->setHwInfo(defaultHwInfo.get());
19831983
memoryManager = new NEO::MockMemoryManager(*executionEnvironment);
19841984
executionEnvironment->memoryManager.reset(memoryManager);
1985-
neoDevice = new NEO::RootDevice(executionEnvironment, 0);
1986-
static_cast<RootDevice *>(neoDevice)->createDeviceImpl();
1985+
neoDevice = NEO::Device::create<RootDevice>(executionEnvironment, 0u);
19871986
NEO::DeviceVector devices;
19881987
devices.push_back(std::unique_ptr<NEO::Device>(neoDevice));
19891988
driverHandle = std::make_unique<Mock<L0::DriverHandleImp>>();
@@ -2041,11 +2040,10 @@ TEST(MemoryBitfieldTests, givenDeviceWithValidBitfieldWhenAllocatingSharedMemory
20412040
}
20422041
auto memoryManager = new NEO::MockMemoryManager(*executionEnvironment);
20432042
executionEnvironment->memoryManager.reset(memoryManager);
2044-
NEO::Device *neoDevice0 = new NEO::RootDevice(executionEnvironment, 0);
2045-
static_cast<NEO::RootDevice *>(neoDevice0)->createDeviceImpl();
2043+
NEO::Device *neoDevice0 = NEO::Device::create<RootDevice>(executionEnvironment, 0u);
20462044
DebugManager.flags.CreateMultipleSubDevices.set(4);
2047-
NEO::Device *neoDevice1 = new NEO::RootDevice(executionEnvironment, 1);
2048-
static_cast<NEO::RootDevice *>(neoDevice1)->createDeviceImpl();
2045+
NEO::Device *neoDevice1 = NEO::Device::create<RootDevice>(executionEnvironment, 1u);
2046+
20492047
NEO::DeviceVector devices;
20502048
devices.push_back(std::unique_ptr<NEO::Device>(neoDevice0));
20512049
devices.push_back(std::unique_ptr<NEO::Device>(neoDevice1));

opencl/test/unit_test/device/device_caps_tests.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -545,9 +545,15 @@ TEST_F(DeviceGetCapsTest, givenEnableSharingFormatQuerySetTrueAndEnabledMultiple
545545
DebugManagerStateRestore dbgRestorer;
546546
DebugManager.flags.EnableFormatQuery.set(true);
547547
DebugManager.flags.CreateMultipleSubDevices.set(2);
548-
auto device = std::make_unique<MockClDevice>(MockDevice::createWithNewExecutionEnvironment<MockDevice>(defaultHwInfo.get()));
549-
const auto &caps = device->getDeviceInfo();
550-
EXPECT_THAT(caps.deviceExtensions, ::testing::HasSubstr(std::string("cl_intel_sharing_format_query ")));
548+
549+
auto rootDevice = std::make_unique<MockClDevice>(MockDevice::createWithNewExecutionEnvironment<MockDevice>(defaultHwInfo.get()));
550+
EXPECT_THAT(rootDevice->getDeviceInfo().deviceExtensions, ::testing::Not(::testing::HasSubstr(std::string("cl_intel_sharing_format_query "))));
551+
552+
auto subDevice0 = rootDevice->getDeviceById(0);
553+
EXPECT_THAT(subDevice0->getDeviceInfo().deviceExtensions, ::testing::HasSubstr(std::string("cl_intel_sharing_format_query ")));
554+
555+
auto subDevice1 = rootDevice->getDeviceById(1);
556+
EXPECT_THAT(subDevice1->getDeviceInfo().deviceExtensions, ::testing::HasSubstr(std::string("cl_intel_sharing_format_query ")));
551557
}
552558

553559
TEST_F(DeviceGetCapsTest, givenOpenCLVersion20WhenCapsAreCreatedThenDeviceDoesntReportClKhrSubgroupsExtension) {

shared/source/device/device.cpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,46 @@ Device::~Device() {
5757
executionEnvironment->decRefInternal();
5858
}
5959

60+
SubDevice *Device::createSubDevice(uint32_t subDeviceIndex) {
61+
return Device::create<SubDevice>(executionEnvironment, subDeviceIndex, *getRootDevice());
62+
}
63+
64+
bool Device::createSubDevices() {
65+
if (!subDevicesAllowed()) {
66+
return true;
67+
}
68+
69+
auto deviceMask = executionEnvironment->rootDeviceEnvironments[getRootDeviceIndex()]->deviceAffinityMask;
70+
uint32_t subDeviceCount = HwHelper::getSubDevicesCount(&getHardwareInfo());
71+
deviceBitfield = maxNBitValue(subDeviceCount);
72+
deviceBitfield &= deviceMask;
73+
numSubDevices = static_cast<uint32_t>(deviceBitfield.count());
74+
if (numSubDevices == 1) {
75+
numSubDevices = 0;
76+
}
77+
UNRECOVERABLE_IF(!subdevices.empty());
78+
if (numSubDevices) {
79+
subdevices.resize(subDeviceCount, nullptr);
80+
for (auto i = 0u; i < subDeviceCount; i++) {
81+
if (!deviceBitfield.test(i)) {
82+
continue;
83+
}
84+
auto subDevice = createSubDevice(i);
85+
if (!subDevice) {
86+
return false;
87+
}
88+
subdevices[i] = subDevice;
89+
}
90+
}
91+
92+
return true;
93+
}
94+
6095
bool Device::createDeviceImpl() {
96+
if (!createSubDevices()) {
97+
return false;
98+
}
99+
61100
auto &hwInfo = getHardwareInfo();
62101
preemptionMode = PreemptionHelper::getDefaultPreemptionMode(hwInfo);
63102

@@ -120,6 +159,8 @@ bool Device::createDeviceImpl() {
120159
getRootDeviceEnvironment().tagsManager->initialize(*this);
121160
}
122161

162+
createBindlessHeapsHelper();
163+
123164
return true;
124165
}
125166

shared/source/device/device.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,12 +126,16 @@ class Device : public ReferenceTrackedObject<Device> {
126126
return device;
127127
}
128128

129-
virtual bool createDeviceImpl();
129+
MOCKABLE_VIRTUAL bool createDeviceImpl();
130130
virtual bool createEngines();
131131
void addEngineToEngineGroup(EngineControl &engine);
132132
bool createEngine(uint32_t deviceCsrIndex, EngineTypeUsage engineTypeUsage);
133133
MOCKABLE_VIRTUAL std::unique_ptr<CommandStreamReceiver> createCommandStreamReceiver() const;
134+
MOCKABLE_VIRTUAL SubDevice *createSubDevice(uint32_t subDeviceIndex);
134135
virtual uint64_t getGlobalMemorySize(uint32_t deviceBitfield) const;
136+
virtual void createBindlessHeapsHelper() {}
137+
bool createSubDevices();
138+
virtual bool subDevicesAllowed() const { return true; };
135139

136140
DeviceInfo deviceInfo = {};
137141

shared/source/device/root_device.cpp

Lines changed: 1 addition & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
#include "shared/source/debug_settings/debug_settings_manager.h"
1313
#include "shared/source/device/sub_device.h"
1414
#include "shared/source/helpers/api_specific_config.h"
15-
#include "shared/source/helpers/bindless_heaps_helper.h"
1615
#include "shared/source/helpers/hw_helper.h"
1716
#include "shared/source/memory_manager/memory_manager.h"
1817
#include "shared/source/utilities/software_tags_manager.h"
@@ -38,42 +37,10 @@ Device *RootDevice::getRootDevice() const {
3837
return const_cast<RootDevice *>(this);
3938
}
4039

41-
SubDevice *RootDevice::createSubDevice(uint32_t subDeviceIndex) {
42-
return Device::create<SubDevice>(executionEnvironment, subDeviceIndex, *this);
43-
}
44-
45-
bool RootDevice::createDeviceImpl() {
46-
auto deviceMask = executionEnvironment->rootDeviceEnvironments[this->rootDeviceIndex]->deviceAffinityMask;
47-
uint32_t subDeviceCount = HwHelper::getSubDevicesCount(&getHardwareInfo());
48-
deviceBitfield = maxNBitValue(subDeviceCount);
49-
deviceBitfield &= deviceMask;
50-
numSubDevices = static_cast<uint32_t>(deviceBitfield.count());
51-
if (numSubDevices == 1) {
52-
numSubDevices = 0;
53-
}
54-
UNRECOVERABLE_IF(!subdevices.empty());
55-
if (numSubDevices) {
56-
subdevices.resize(subDeviceCount, nullptr);
57-
for (auto i = 0u; i < subDeviceCount; i++) {
58-
if (!deviceBitfield.test(i)) {
59-
continue;
60-
}
61-
auto subDevice = createSubDevice(i);
62-
if (!subDevice) {
63-
return false;
64-
}
65-
subdevices[i] = subDevice;
66-
}
67-
}
68-
auto status = Device::createDeviceImpl();
69-
if (!status) {
70-
return status;
71-
}
40+
void RootDevice::createBindlessHeapsHelper() {
7241
if (ApiSpecificConfig::getBindlessConfiguration()) {
7342
this->executionEnvironment->rootDeviceEnvironments[getRootDeviceIndex()]->createBindlessHeapsHelper(getMemoryManager(), getNumAvailableDevices() > 1, rootDeviceIndex);
7443
}
75-
76-
return true;
7744
}
7845

7946
bool RootDevice::createEngines() {

shared/source/device/root_device.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,16 @@ class RootDevice : public Device {
1616
public:
1717
RootDevice(ExecutionEnvironment *executionEnvironment, uint32_t rootDeviceIndex);
1818
~RootDevice() override;
19-
bool createDeviceImpl() override;
2019

2120
uint32_t getRootDeviceIndex() const override;
2221
Device *getRootDevice() const override;
2322
bool isSubDevice() const override { return false; }
2423

2524
protected:
2625
bool createEngines() override;
26+
void createBindlessHeapsHelper() override;
2727

2828
void initializeRootCommandStreamReceiver();
29-
MOCKABLE_VIRTUAL SubDevice *createSubDevice(uint32_t subDeviceIndex);
3029

3130
const uint32_t rootDeviceIndex;
3231
};

shared/source/device/sub_device.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@
1111

1212
namespace NEO {
1313

14-
SubDevice::SubDevice(ExecutionEnvironment *executionEnvironment, uint32_t subDeviceIndex, RootDevice &rootDevice)
15-
: Device(executionEnvironment), subDeviceIndex(subDeviceIndex), rootDevice(rootDevice) {
14+
SubDevice::SubDevice(ExecutionEnvironment *executionEnvironment, uint32_t subDeviceIndex, Device &rootDevice)
15+
: Device(executionEnvironment), subDeviceIndex(subDeviceIndex), rootDevice(static_cast<RootDevice &>(rootDevice)) {
16+
UNRECOVERABLE_IF(rootDevice.isSubDevice());
1617
deviceBitfield = 0;
1718
deviceBitfield.set(subDeviceIndex);
1819
}

shared/source/device/sub_device.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ namespace NEO {
1212
class RootDevice;
1313
class SubDevice : public Device {
1414
public:
15-
SubDevice(ExecutionEnvironment *executionEnvironment, uint32_t subDeviceIndex, RootDevice &rootDevice);
15+
SubDevice(ExecutionEnvironment *executionEnvironment, uint32_t subDeviceIndex, Device &rootDevice);
1616
void incRefInternal() override;
1717
unique_ptr_if_unused<Device> decRefInternal() override;
1818

@@ -25,6 +25,7 @@ class SubDevice : public Device {
2525

2626
protected:
2727
uint64_t getGlobalMemorySize(uint32_t deviceBitfield) const override;
28+
bool subDevicesAllowed() const override { return false; };
2829
const uint32_t subDeviceIndex;
2930
RootDevice &rootDevice;
3031
};

0 commit comments

Comments
 (0)