Skip to content

Commit 2d5a822

Browse files
Reduce global memory size for sub devices
Related-To: NEO-4484 Change-Id: I6822ceedddde03353d6a2c6b2234f31d91fd9efe Signed-off-by: Mateusz Jablonski <[email protected]>
1 parent 9ac32a6 commit 2d5a822

File tree

7 files changed

+33
-5
lines changed

7 files changed

+33
-5
lines changed

opencl/test/unit_test/device/sub_device_tests.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include "shared/test/unit_test/helpers/debug_manager_state_restore.h"
1111
#include "shared/test/unit_test/helpers/ult_hw_config.h"
1212
#include "shared/test/unit_test/helpers/variable_backup.h"
13+
#include "shared/test/unit_test/mocks/ult_device_factory.h"
1314

1415
#include "opencl/source/cl_device/cl_device.h"
1516
#include "opencl/test/unit_test/mocks/mock_cl_device.h"
@@ -249,3 +250,15 @@ TEST(RootDevicesTest, givenRootDeviceWithSubdevicesWhenCreateEnginesThenDeviceCr
249250
device.createEngines();
250251
EXPECT_EQ(1u, device.engines.size());
251252
}
253+
254+
TEST(SubDevicesTest, givenRootDeviceWithSubDevicesWhenGettingGlobalMemorySizeThenSubDevicesReturnReducedAmountOfGlobalMemAllocSize) {
255+
const uint32_t numSubDevices = 2u;
256+
UltDeviceFactory deviceFactory{1, numSubDevices};
257+
258+
auto totalGlobalMemorySize = deviceFactory.rootDevices[0]->getGlobalMemorySize();
259+
auto expectedGlobalMemorySize = totalGlobalMemorySize / numSubDevices;
260+
261+
for (const auto &subDevice : deviceFactory.subDevices) {
262+
EXPECT_EQ(expectedGlobalMemorySize, static_cast<MockSubDevice *>(subDevice)->getGlobalMemorySize());
263+
}
264+
}

shared/source/device/device.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,4 +227,14 @@ GmmClientContext *Device::getGmmClientContext() const {
227227
return getGmmHelper()->getClientContext();
228228
}
229229

230+
uint64_t Device::getGlobalMemorySize() const {
231+
232+
auto globalMemorySize = getMemoryManager()->isLocalMemorySupported(this->getRootDeviceIndex())
233+
? getMemoryManager()->getLocalMemorySize(this->getRootDeviceIndex())
234+
: getMemoryManager()->getSystemSharedMemory(this->getRootDeviceIndex());
235+
globalMemorySize = std::min(globalMemorySize, getMemoryManager()->getMaxApplicationAddress() + 1);
236+
globalMemorySize = static_cast<uint64_t>(static_cast<double>(globalMemorySize) * 0.8);
237+
return globalMemorySize;
238+
}
239+
230240
} // namespace NEO

shared/source/device/device.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ class Device : public ReferenceTrackedObject<Device> {
103103
virtual bool createEngines();
104104
bool createEngine(uint32_t deviceCsrIndex, aub_stream::EngineType engineType);
105105
MOCKABLE_VIRTUAL std::unique_ptr<CommandStreamReceiver> createCommandStreamReceiver() const;
106+
virtual uint64_t getGlobalMemorySize() const;
106107

107108
DeviceInfo deviceInfo = {};
108109

shared/source/device/device_caps.cpp

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,7 @@ void Device::initializeCaps() {
5050

5151
deviceInfo.globalMemCachelineSize = 64;
5252

53-
deviceInfo.globalMemSize = getMemoryManager()->isLocalMemorySupported(this->getRootDeviceIndex())
54-
? getMemoryManager()->getLocalMemorySize(this->getRootDeviceIndex())
55-
: getMemoryManager()->getSystemSharedMemory(this->getRootDeviceIndex());
56-
deviceInfo.globalMemSize = std::min(deviceInfo.globalMemSize, getMemoryManager()->getMaxApplicationAddress() + 1);
57-
deviceInfo.globalMemSize = static_cast<uint64_t>(static_cast<double>(deviceInfo.globalMemSize) * 0.8);
53+
deviceInfo.globalMemSize = getGlobalMemorySize();
5854

5955
if (DebugManager.flags.Force32bitAddressing.get() || addressing32bitAllowed || is32bit) {
6056
deviceInfo.globalMemSize = std::min(deviceInfo.globalMemSize, static_cast<uint64_t>(4 * GB * 0.8));

shared/source/device/sub_device.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,9 @@ Device *SubDevice::getDeviceById(uint32_t deviceId) const {
4343
return const_cast<SubDevice *>(this);
4444
}
4545

46+
uint64_t SubDevice::getGlobalMemorySize() const {
47+
auto globalMemorySize = Device::getGlobalMemorySize();
48+
return globalMemorySize / rootDevice.getNumAvailableDevices();
49+
}
50+
4651
} // namespace NEO

shared/source/device/sub_device.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ class SubDevice : public Device {
2424

2525
protected:
2626
DeviceBitfield getDeviceBitfield() const override;
27+
uint64_t getGlobalMemorySize() const override;
2728
const uint32_t subDeviceIndex;
2829
RootDevice &rootDevice;
2930
};

shared/test/unit_test/mocks/mock_device.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ class UltCommandStreamReceiver;
2626
extern CommandStreamReceiver *createCommandStream(ExecutionEnvironment &executionEnvironment, uint32_t rootDeviceIndex);
2727

2828
struct MockSubDevice : public SubDevice {
29+
using SubDevice::getGlobalMemorySize;
2930
using SubDevice::SubDevice;
3031

3132
std::unique_ptr<CommandStreamReceiver> createCommandStreamReceiver() const override {
@@ -42,6 +43,7 @@ class MockDevice : public RootDevice {
4243
using Device::deviceInfo;
4344
using Device::engines;
4445
using Device::executionEnvironment;
46+
using Device::getGlobalMemorySize;
4547
using Device::initializeCaps;
4648
using RootDevice::createEngines;
4749
using RootDevice::subdevices;

0 commit comments

Comments
 (0)