2019-08-28 19:12:44 +08:00
|
|
|
/*
|
2021-01-25 17:24:00 +08:00
|
|
|
* Copyright (C) 2019-2021 Intel Corporation
|
2019-08-28 19:12:44 +08:00
|
|
|
*
|
|
|
|
* SPDX-License-Identifier: MIT
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2020-02-24 05:44:01 +08:00
|
|
|
#include "shared/source/device/sub_device.h"
|
2021-04-23 18:56:13 +08:00
|
|
|
#include "shared/source/os_interface/device_factory.h"
|
2020-03-19 21:26:08 +08:00
|
|
|
#include "shared/source/os_interface/os_context.h"
|
2021-01-21 20:10:13 +08:00
|
|
|
#include "shared/test/common/helpers/debug_manager_state_restore.h"
|
|
|
|
#include "shared/test/common/helpers/ult_hw_config.h"
|
|
|
|
#include "shared/test/common/helpers/variable_backup.h"
|
|
|
|
#include "shared/test/common/mocks/ult_device_factory.h"
|
2020-02-24 17:22:30 +08:00
|
|
|
|
2020-03-20 18:15:25 +08:00
|
|
|
#include "opencl/source/cl_device/cl_device.h"
|
2020-04-02 22:38:42 +08:00
|
|
|
#include "opencl/test/unit_test/mocks/mock_cl_device.h"
|
2020-02-23 22:20:22 +08:00
|
|
|
#include "opencl/test/unit_test/mocks/mock_memory_manager.h"
|
|
|
|
#include "opencl/test/unit_test/mocks/mock_platform.h"
|
2020-02-07 19:15:46 +08:00
|
|
|
|
2019-08-28 19:12:44 +08:00
|
|
|
using namespace NEO;
|
|
|
|
|
|
|
|
TEST(SubDevicesTest, givenDefaultConfigWhenCreateRootDeviceThenItDoesntContainSubDevices) {
|
2020-03-25 01:07:46 +08:00
|
|
|
auto device = std::unique_ptr<MockDevice>(MockDevice::createWithNewExecutionEnvironment<MockDevice>(defaultHwInfo.get()));
|
2019-08-28 19:12:44 +08:00
|
|
|
|
|
|
|
EXPECT_EQ(0u, device->getNumSubDevices());
|
2019-09-23 20:04:18 +08:00
|
|
|
EXPECT_EQ(1u, device->getNumAvailableDevices());
|
2019-08-28 19:12:44 +08:00
|
|
|
}
|
|
|
|
|
2019-10-21 19:41:35 +08:00
|
|
|
TEST(SubDevicesTest, givenCreateMultipleSubDevicesFlagSetWhenCreateRootDeviceThenItsSubdevicesHaveProperRootIdSet) {
|
|
|
|
DebugManagerStateRestore restorer;
|
|
|
|
DebugManager.flags.CreateMultipleSubDevices.set(2);
|
2019-10-07 18:42:28 +08:00
|
|
|
VariableBackup<bool> mockDeviceFlagBackup(&MockDevice::createSingleDevice, false);
|
2020-03-25 01:07:46 +08:00
|
|
|
auto device = std::unique_ptr<MockDevice>(MockDevice::createWithNewExecutionEnvironment<MockDevice>(defaultHwInfo.get()));
|
2019-10-21 19:41:35 +08:00
|
|
|
|
|
|
|
EXPECT_EQ(2u, device->getNumSubDevices());
|
|
|
|
EXPECT_EQ(0u, device->getRootDeviceIndex());
|
2019-11-05 18:25:26 +08:00
|
|
|
|
2019-10-21 19:41:35 +08:00
|
|
|
EXPECT_EQ(0u, device->subdevices.at(0)->getRootDeviceIndex());
|
2019-11-05 18:25:26 +08:00
|
|
|
EXPECT_EQ(0u, device->subdevices.at(0)->getSubDeviceIndex());
|
|
|
|
|
2019-10-21 19:41:35 +08:00
|
|
|
EXPECT_EQ(0u, device->subdevices.at(1)->getRootDeviceIndex());
|
2019-11-05 18:25:26 +08:00
|
|
|
EXPECT_EQ(1u, device->subdevices.at(1)->getSubDeviceIndex());
|
2019-10-21 19:41:35 +08:00
|
|
|
}
|
|
|
|
|
2019-08-28 19:12:44 +08:00
|
|
|
TEST(SubDevicesTest, givenCreateMultipleSubDevicesFlagSetWhenCreateRootDeviceThenItContainsSubDevices) {
|
|
|
|
DebugManagerStateRestore restorer;
|
|
|
|
DebugManager.flags.CreateMultipleSubDevices.set(2);
|
2019-10-07 18:42:28 +08:00
|
|
|
VariableBackup<bool> mockDeviceFlagBackup(&MockDevice::createSingleDevice, false);
|
2020-03-25 01:07:46 +08:00
|
|
|
auto device = std::unique_ptr<MockDevice>(MockDevice::createWithNewExecutionEnvironment<MockDevice>(defaultHwInfo.get()));
|
2019-08-28 19:12:44 +08:00
|
|
|
|
|
|
|
EXPECT_EQ(2u, device->getNumSubDevices());
|
|
|
|
|
2019-09-23 20:04:18 +08:00
|
|
|
EXPECT_EQ(2u, device->getNumAvailableDevices());
|
|
|
|
EXPECT_EQ(1u, device->subdevices.at(0)->getNumAvailableDevices());
|
|
|
|
EXPECT_EQ(1u, device->subdevices.at(1)->getNumAvailableDevices());
|
2019-08-28 19:12:44 +08:00
|
|
|
}
|
|
|
|
|
2020-04-02 22:38:42 +08:00
|
|
|
TEST(SubDevicesTest, givenDeviceWithSubDevicesWhenSubDeviceApiRefCountsAreChangedThenChangeIsPropagatedToRootDevice) {
|
2019-08-28 19:12:44 +08:00
|
|
|
DebugManagerStateRestore restorer;
|
|
|
|
DebugManager.flags.CreateMultipleSubDevices.set(2);
|
2019-10-07 18:42:28 +08:00
|
|
|
VariableBackup<bool> mockDeviceFlagBackup(&MockDevice::createSingleDevice, false);
|
2020-02-11 18:39:25 +08:00
|
|
|
initPlatform();
|
|
|
|
auto nonDefaultPlatform = std::make_unique<MockPlatform>(*platform()->peekExecutionEnvironment());
|
2020-02-15 00:36:30 +08:00
|
|
|
nonDefaultPlatform->initializeWithNewDevices();
|
2020-02-05 15:42:05 +08:00
|
|
|
auto device = nonDefaultPlatform->getClDevice(0);
|
|
|
|
auto defaultDevice = platform()->getClDevice(0);
|
2020-01-14 21:32:11 +08:00
|
|
|
|
|
|
|
auto subDevice = device->getDeviceById(1);
|
|
|
|
auto baseDeviceApiRefCount = device->getRefApiCount();
|
|
|
|
auto baseDeviceInternalRefCount = device->getRefInternalCount();
|
|
|
|
auto baseSubDeviceApiRefCount = subDevice->getRefApiCount();
|
|
|
|
auto baseSubDeviceInternalRefCount = subDevice->getRefInternalCount();
|
2020-02-05 15:42:05 +08:00
|
|
|
auto baseDefaultDeviceApiRefCount = defaultDevice->getRefApiCount();
|
|
|
|
auto baseDefaultDeviceInternalRefCount = defaultDevice->getRefInternalCount();
|
2020-01-14 21:32:11 +08:00
|
|
|
|
|
|
|
subDevice->retainApi();
|
|
|
|
EXPECT_EQ(baseDeviceApiRefCount, device->getRefApiCount());
|
|
|
|
EXPECT_EQ(baseDeviceInternalRefCount + 1, device->getRefInternalCount());
|
|
|
|
EXPECT_EQ(baseSubDeviceApiRefCount + 1, subDevice->getRefApiCount());
|
|
|
|
EXPECT_EQ(baseSubDeviceInternalRefCount + 1, subDevice->getRefInternalCount());
|
2020-02-05 15:42:05 +08:00
|
|
|
EXPECT_EQ(baseDefaultDeviceApiRefCount, defaultDevice->getRefApiCount());
|
|
|
|
EXPECT_EQ(baseDefaultDeviceInternalRefCount, defaultDevice->getRefInternalCount());
|
2020-01-14 21:32:11 +08:00
|
|
|
|
|
|
|
subDevice->releaseApi();
|
|
|
|
EXPECT_EQ(baseDeviceApiRefCount, device->getRefApiCount());
|
|
|
|
EXPECT_EQ(baseDeviceInternalRefCount, device->getRefInternalCount());
|
|
|
|
EXPECT_EQ(baseSubDeviceApiRefCount, subDevice->getRefApiCount());
|
|
|
|
EXPECT_EQ(baseSubDeviceInternalRefCount, subDevice->getRefInternalCount());
|
2020-02-05 15:42:05 +08:00
|
|
|
EXPECT_EQ(baseDefaultDeviceApiRefCount, defaultDevice->getRefApiCount());
|
|
|
|
EXPECT_EQ(baseDefaultDeviceInternalRefCount, defaultDevice->getRefInternalCount());
|
2019-08-28 19:12:44 +08:00
|
|
|
}
|
|
|
|
|
2020-04-02 22:38:42 +08:00
|
|
|
TEST(SubDevicesTest, givenDeviceWithSubDevicesWhenSubDeviceInternalRefCountsAreChangedThenChangeIsPropagatedToRootDevice) {
|
|
|
|
DebugManagerStateRestore restorer;
|
|
|
|
DebugManager.flags.CreateMultipleSubDevices.set(2);
|
|
|
|
VariableBackup<bool> mockDeviceFlagBackup(&MockDevice::createSingleDevice, false);
|
|
|
|
auto device = std::unique_ptr<MockDevice>(MockDevice::createWithNewExecutionEnvironment<MockDevice>(defaultHwInfo.get()));
|
|
|
|
device->incRefInternal();
|
|
|
|
auto subDevice = device->getDeviceById(0);
|
|
|
|
|
|
|
|
auto baseDeviceInternalRefCount = device->getRefInternalCount();
|
|
|
|
auto baseSubDeviceInternalRefCount = subDevice->getRefInternalCount();
|
|
|
|
|
|
|
|
subDevice->incRefInternal();
|
|
|
|
EXPECT_EQ(baseDeviceInternalRefCount + 1, device->getRefInternalCount());
|
|
|
|
EXPECT_EQ(baseSubDeviceInternalRefCount, subDevice->getRefInternalCount());
|
|
|
|
|
|
|
|
device->incRefInternal();
|
|
|
|
EXPECT_EQ(baseDeviceInternalRefCount + 2, device->getRefInternalCount());
|
|
|
|
EXPECT_EQ(baseSubDeviceInternalRefCount, subDevice->getRefInternalCount());
|
|
|
|
|
|
|
|
subDevice->decRefInternal();
|
|
|
|
EXPECT_EQ(baseDeviceInternalRefCount + 1, device->getRefInternalCount());
|
|
|
|
EXPECT_EQ(baseSubDeviceInternalRefCount, subDevice->getRefInternalCount());
|
|
|
|
|
|
|
|
device->decRefInternal();
|
|
|
|
EXPECT_EQ(baseDeviceInternalRefCount, device->getRefInternalCount());
|
|
|
|
EXPECT_EQ(baseSubDeviceInternalRefCount, subDevice->getRefInternalCount());
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST(SubDevicesTest, givenClDeviceWithSubDevicesWhenSubDeviceInternalRefCountsAreChangedThenChangeIsPropagatedToRootDevice) {
|
|
|
|
DebugManagerStateRestore restorer;
|
|
|
|
DebugManager.flags.CreateMultipleSubDevices.set(2);
|
|
|
|
VariableBackup<bool> mockDeviceFlagBackup(&MockDevice::createSingleDevice, false);
|
|
|
|
auto device = std::make_unique<MockClDevice>(MockDevice::createWithNewExecutionEnvironment<MockDevice>(defaultHwInfo.get()));
|
|
|
|
device->incRefInternal();
|
|
|
|
auto &subDevice = device->subDevices[0];
|
|
|
|
|
|
|
|
auto baseDeviceInternalRefCount = device->getRefInternalCount();
|
|
|
|
auto baseSubDeviceInternalRefCount = subDevice->getRefInternalCount();
|
|
|
|
|
|
|
|
subDevice->incRefInternal();
|
|
|
|
EXPECT_EQ(baseDeviceInternalRefCount + 1, device->getRefInternalCount());
|
|
|
|
EXPECT_EQ(baseSubDeviceInternalRefCount, subDevice->getRefInternalCount());
|
|
|
|
|
|
|
|
device->incRefInternal();
|
|
|
|
EXPECT_EQ(baseDeviceInternalRefCount + 2, device->getRefInternalCount());
|
|
|
|
EXPECT_EQ(baseSubDeviceInternalRefCount, subDevice->getRefInternalCount());
|
|
|
|
|
|
|
|
subDevice->decRefInternal();
|
|
|
|
EXPECT_EQ(baseDeviceInternalRefCount + 1, device->getRefInternalCount());
|
|
|
|
EXPECT_EQ(baseSubDeviceInternalRefCount, subDevice->getRefInternalCount());
|
|
|
|
|
|
|
|
device->decRefInternal();
|
|
|
|
EXPECT_EQ(baseDeviceInternalRefCount, device->getRefInternalCount());
|
|
|
|
EXPECT_EQ(baseSubDeviceInternalRefCount, subDevice->getRefInternalCount());
|
|
|
|
}
|
|
|
|
|
2019-08-28 19:12:44 +08:00
|
|
|
TEST(SubDevicesTest, givenDeviceWithSubDevicesWhenSubDeviceCreationFailThenWholeDeviceIsDestroyed) {
|
|
|
|
DebugManagerStateRestore restorer;
|
|
|
|
DebugManager.flags.CreateMultipleSubDevices.set(10);
|
2020-01-30 16:36:05 +08:00
|
|
|
MockExecutionEnvironment executionEnvironment;
|
2019-11-15 16:59:48 +08:00
|
|
|
executionEnvironment.prepareRootDeviceEnvironments(1);
|
2019-08-28 19:12:44 +08:00
|
|
|
executionEnvironment.incRefInternal();
|
|
|
|
executionEnvironment.memoryManager.reset(new FailMemoryManager(10, executionEnvironment));
|
|
|
|
auto device = Device::create<RootDevice>(&executionEnvironment, 0u);
|
|
|
|
EXPECT_EQ(nullptr, device);
|
|
|
|
}
|
|
|
|
|
2019-10-17 22:00:12 +08:00
|
|
|
TEST(SubDevicesTest, givenCreateMultipleRootDevicesFlagsEnabledWhenDevicesAreCreatedThenEachHasUniqueDeviceIndex) {
|
2019-08-28 19:12:44 +08:00
|
|
|
|
|
|
|
DebugManagerStateRestore restorer;
|
2019-10-24 19:34:25 +08:00
|
|
|
DebugManager.flags.CreateMultipleRootDevices.set(2);
|
2020-02-03 20:19:12 +08:00
|
|
|
|
|
|
|
VariableBackup<UltHwConfig> backup{&ultHwConfig};
|
2020-03-23 16:13:25 +08:00
|
|
|
ultHwConfig.useMockedPrepareDeviceEnvironmentsFunc = false;
|
2020-02-11 18:39:25 +08:00
|
|
|
initPlatform();
|
2020-03-20 20:50:44 +08:00
|
|
|
EXPECT_EQ(0u, platform()->getClDevice(0)->getRootDeviceIndex());
|
|
|
|
EXPECT_EQ(1u, platform()->getClDevice(1)->getRootDeviceIndex());
|
2019-08-28 19:12:44 +08:00
|
|
|
}
|
2019-09-17 16:44:49 +08:00
|
|
|
|
2019-12-03 17:15:46 +08:00
|
|
|
TEST(SubDevicesTest, givenRootDeviceWithSubDevicesWhenOsContextIsCreatedThenItsBitfieldBasesOnSubDevicesCount) {
|
|
|
|
DebugManagerStateRestore restorer;
|
|
|
|
DebugManager.flags.CreateMultipleSubDevices.set(2);
|
|
|
|
VariableBackup<bool> mockDeviceFlagBackup(&MockDevice::createSingleDevice, false);
|
2020-03-25 01:07:46 +08:00
|
|
|
auto device = std::unique_ptr<MockDevice>(MockDevice::createWithNewExecutionEnvironment<MockDevice>(defaultHwInfo.get()));
|
2019-12-03 17:15:46 +08:00
|
|
|
EXPECT_EQ(2u, device->getNumSubDevices());
|
|
|
|
|
|
|
|
uint32_t rootDeviceBitfield = 0b11;
|
|
|
|
EXPECT_EQ(rootDeviceBitfield, static_cast<uint32_t>(device->getDefaultEngine().osContext->getDeviceBitfield().to_ulong()));
|
|
|
|
}
|
|
|
|
|
2019-09-17 16:44:49 +08:00
|
|
|
TEST(SubDevicesTest, givenSubDeviceWhenOsContextIsCreatedThenItsBitfieldBasesOnSubDeviceId) {
|
|
|
|
DebugManagerStateRestore restorer;
|
|
|
|
DebugManager.flags.CreateMultipleSubDevices.set(2);
|
2019-10-07 18:42:28 +08:00
|
|
|
VariableBackup<bool> mockDeviceFlagBackup(&MockDevice::createSingleDevice, false);
|
2020-03-25 01:07:46 +08:00
|
|
|
auto device = std::unique_ptr<MockDevice>(MockDevice::createWithNewExecutionEnvironment<MockDevice>(defaultHwInfo.get()));
|
2019-09-17 16:44:49 +08:00
|
|
|
|
|
|
|
EXPECT_EQ(2u, device->getNumSubDevices());
|
|
|
|
|
2020-01-14 21:32:11 +08:00
|
|
|
auto firstSubDevice = static_cast<SubDevice *>(device->subdevices.at(0));
|
|
|
|
auto secondSubDevice = static_cast<SubDevice *>(device->subdevices.at(1));
|
2019-09-17 16:44:49 +08:00
|
|
|
uint32_t firstSubDeviceMask = (1u << 0);
|
|
|
|
uint32_t secondSubDeviceMask = (1u << 1);
|
|
|
|
EXPECT_EQ(firstSubDeviceMask, static_cast<uint32_t>(firstSubDevice->getDefaultEngine().osContext->getDeviceBitfield().to_ulong()));
|
|
|
|
EXPECT_EQ(secondSubDeviceMask, static_cast<uint32_t>(secondSubDevice->getDefaultEngine().osContext->getDeviceBitfield().to_ulong()));
|
|
|
|
}
|
2019-10-10 21:56:10 +08:00
|
|
|
|
|
|
|
TEST(SubDevicesTest, givenDeviceWithoutSubDevicesWhenGettingDeviceByIdZeroThenGetThisDevice) {
|
2020-03-25 01:07:46 +08:00
|
|
|
auto device = std::unique_ptr<MockDevice>(MockDevice::createWithNewExecutionEnvironment<MockDevice>(defaultHwInfo.get()));
|
2019-10-10 21:56:10 +08:00
|
|
|
|
|
|
|
EXPECT_EQ(1u, device->getNumAvailableDevices());
|
|
|
|
EXPECT_EQ(device.get(), device->getDeviceById(0u));
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST(SubDevicesTest, givenDeviceWithSubDevicesWhenGettingDeviceByIdThenGetCorrectSubDevice) {
|
|
|
|
DebugManagerStateRestore restorer;
|
|
|
|
DebugManager.flags.CreateMultipleSubDevices.set(2);
|
2019-10-07 18:42:28 +08:00
|
|
|
VariableBackup<bool> mockDeviceFlagBackup(&MockDevice::createSingleDevice, false);
|
2020-03-25 01:07:46 +08:00
|
|
|
auto device = std::unique_ptr<MockDevice>(MockDevice::createWithNewExecutionEnvironment<MockDevice>(defaultHwInfo.get()));
|
2019-10-10 21:56:10 +08:00
|
|
|
EXPECT_EQ(2u, device->getNumSubDevices());
|
2020-01-14 21:32:11 +08:00
|
|
|
EXPECT_EQ(device->subdevices.at(0), device->getDeviceById(0));
|
|
|
|
EXPECT_EQ(device->subdevices.at(1), device->getDeviceById(1));
|
2019-10-10 21:56:10 +08:00
|
|
|
EXPECT_THROW(device->getDeviceById(2), std::exception);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST(SubDevicesTest, givenSubDevicesWhenGettingDeviceByIdZeroThenGetThisSubDevice) {
|
|
|
|
DebugManagerStateRestore restorer;
|
|
|
|
DebugManager.flags.CreateMultipleSubDevices.set(2);
|
2019-10-07 18:42:28 +08:00
|
|
|
VariableBackup<bool> mockDeviceFlagBackup(&MockDevice::createSingleDevice, false);
|
2020-03-25 01:07:46 +08:00
|
|
|
auto device = std::unique_ptr<MockDevice>(MockDevice::createWithNewExecutionEnvironment<MockDevice>(defaultHwInfo.get()));
|
2019-10-10 21:56:10 +08:00
|
|
|
EXPECT_EQ(2u, device->getNumSubDevices());
|
2020-01-14 21:32:11 +08:00
|
|
|
auto subDevice = device->subdevices.at(0);
|
2019-10-10 21:56:10 +08:00
|
|
|
|
|
|
|
EXPECT_EQ(subDevice, subDevice->getDeviceById(0));
|
|
|
|
}
|
2019-10-07 18:42:28 +08:00
|
|
|
|
2020-01-20 14:02:07 +08:00
|
|
|
TEST(RootDevicesTest, givenRootDeviceWithoutSubdevicesWhenCreateEnginesThenDeviceCreatesCorrectNumberOfEngines) {
|
2020-03-24 18:42:54 +08:00
|
|
|
auto hwInfo = *defaultHwInfo;
|
2020-02-21 22:25:04 +08:00
|
|
|
auto &gpgpuEngines = HwHelper::get(hwInfo.platform.eRenderCoreFamily).getGpgpuEngineInstances(hwInfo);
|
2020-01-20 14:02:07 +08:00
|
|
|
|
2019-11-05 20:38:20 +08:00
|
|
|
auto executionEnvironment = new MockExecutionEnvironment;
|
2019-10-07 18:42:28 +08:00
|
|
|
MockDevice device(executionEnvironment, 0);
|
2019-11-05 20:38:20 +08:00
|
|
|
EXPECT_EQ(0u, device.engines.size());
|
|
|
|
device.createEngines();
|
2020-01-20 14:02:07 +08:00
|
|
|
EXPECT_EQ(gpgpuEngines.size(), device.engines.size());
|
2019-10-07 18:42:28 +08:00
|
|
|
}
|
2020-01-20 14:02:07 +08:00
|
|
|
|
|
|
|
TEST(RootDevicesTest, givenRootDeviceWithSubdevicesWhenCreateEnginesThenDeviceCreatesSpecialEngine) {
|
|
|
|
DebugManagerStateRestore restorer;
|
|
|
|
DebugManager.flags.CreateMultipleSubDevices.set(2);
|
|
|
|
VariableBackup<bool> mockDeviceFlagBackup(&MockDevice::createSingleDevice, false);
|
|
|
|
|
2019-10-07 18:42:28 +08:00
|
|
|
auto executionEnvironment = new MockExecutionEnvironment;
|
2019-11-05 20:38:20 +08:00
|
|
|
MockDevice device(executionEnvironment, 0);
|
2021-04-27 17:51:03 +08:00
|
|
|
device.createSubDevices();
|
|
|
|
EXPECT_EQ(2u, device.getNumAvailableDevices());
|
2019-11-05 20:38:20 +08:00
|
|
|
EXPECT_EQ(0u, device.engines.size());
|
|
|
|
device.createEngines();
|
2020-01-20 14:02:07 +08:00
|
|
|
EXPECT_EQ(1u, device.engines.size());
|
2019-10-07 18:42:28 +08:00
|
|
|
}
|
2020-04-16 20:44:03 +08:00
|
|
|
|
|
|
|
TEST(SubDevicesTest, givenRootDeviceWithSubDevicesWhenGettingGlobalMemorySizeThenSubDevicesReturnReducedAmountOfGlobalMemAllocSize) {
|
|
|
|
const uint32_t numSubDevices = 2u;
|
|
|
|
UltDeviceFactory deviceFactory{1, numSubDevices};
|
|
|
|
|
2020-10-30 17:27:48 +08:00
|
|
|
auto rootDevice = deviceFactory.rootDevices[0];
|
|
|
|
|
|
|
|
auto totalGlobalMemorySize = rootDevice->getGlobalMemorySize(static_cast<uint32_t>(rootDevice->getDeviceBitfield().to_ulong()));
|
2020-04-16 20:44:03 +08:00
|
|
|
auto expectedGlobalMemorySize = totalGlobalMemorySize / numSubDevices;
|
|
|
|
|
|
|
|
for (const auto &subDevice : deviceFactory.subDevices) {
|
2020-10-30 17:27:48 +08:00
|
|
|
auto mockSubDevice = static_cast<MockSubDevice *>(subDevice);
|
|
|
|
auto subDeviceBitfield = static_cast<uint32_t>(mockSubDevice->getDeviceBitfield().to_ulong());
|
|
|
|
EXPECT_EQ(expectedGlobalMemorySize, mockSubDevice->getGlobalMemorySize(subDeviceBitfield));
|
2020-04-16 20:44:03 +08:00
|
|
|
}
|
2020-09-15 16:11:12 +08:00
|
|
|
}
|
|
|
|
|
2021-04-23 18:56:13 +08:00
|
|
|
TEST(SubDevicesTest, whenCreatingEngineInstancedSubDeviceThenSetCorrectSubdeviceIndex) {
|
|
|
|
class MyRootDevice : public RootDevice {
|
|
|
|
public:
|
|
|
|
using RootDevice::createEngineInstancedSubDevice;
|
|
|
|
using RootDevice::RootDevice;
|
|
|
|
};
|
|
|
|
|
|
|
|
auto executionEnvironment = new ExecutionEnvironment();
|
|
|
|
executionEnvironment->prepareRootDeviceEnvironments(1);
|
|
|
|
executionEnvironment->rootDeviceEnvironments[0]->setHwInfo(defaultHwInfo.get());
|
|
|
|
DeviceFactory::createMemoryManagerFunc(*executionEnvironment);
|
|
|
|
|
|
|
|
auto rootDevice = std::unique_ptr<MyRootDevice>(Device::create<MyRootDevice>(executionEnvironment, 0));
|
|
|
|
|
|
|
|
auto subDevice = std::unique_ptr<SubDevice>(rootDevice->createEngineInstancedSubDevice(1, defaultHwInfo->capabilityTable.defaultEngineType));
|
|
|
|
|
|
|
|
ASSERT_NE(nullptr, subDevice.get());
|
|
|
|
|
|
|
|
EXPECT_EQ(2u, subDevice->getDeviceBitfield().to_ulong());
|
|
|
|
}
|
|
|
|
|
2021-04-29 01:46:13 +08:00
|
|
|
struct EngineInstancedDeviceTests : public ::testing::Test {
|
|
|
|
void SetUp() override {
|
|
|
|
DebugManager.flags.EngineInstancedSubDevices.set(true);
|
|
|
|
}
|
2021-04-23 18:56:13 +08:00
|
|
|
|
2021-04-29 01:46:13 +08:00
|
|
|
bool createDevices(uint32_t numGenericSubDevices, uint32_t numCcs) {
|
|
|
|
auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
|
|
|
|
executionEnvironment->prepareRootDeviceEnvironments(1);
|
2021-04-23 18:56:13 +08:00
|
|
|
|
2021-04-29 01:46:13 +08:00
|
|
|
executionEnvironment->rootDeviceEnvironments[0]->setHwInfo(defaultHwInfo.get());
|
|
|
|
auto hwInfo = executionEnvironment->rootDeviceEnvironments[0]->getMutableHardwareInfo();
|
|
|
|
hwInfo->gtSystemInfo.CCSInfo.NumberOfCCSEnabled = numCcs;
|
|
|
|
hwInfo->featureTable.ftrCCSNode = (numCcs > 0);
|
|
|
|
HwHelper::get(hwInfo->platform.eRenderCoreFamily).adjustDefaultEngineType(hwInfo);
|
|
|
|
|
|
|
|
if (!multiCcsDevice(*hwInfo, numCcs)) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
deviceFactory = std::make_unique<UltDeviceFactory>(1, numGenericSubDevices, *executionEnvironment.release());
|
|
|
|
rootDevice = deviceFactory->rootDevices[0];
|
|
|
|
EXPECT_NE(nullptr, rootDevice);
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool hasRootCsrOnly(MockDevice *device) {
|
|
|
|
return ((device->engines.size() == 1) &&
|
|
|
|
device->engines[0].osContext->isRootDevice());
|
|
|
|
}
|
|
|
|
|
|
|
|
bool isEngineInstanced(MockSubDevice *subDevice, aub_stream::EngineType engineType, uint32_t subDeviceIndex, DeviceBitfield deviceBitfield) {
|
|
|
|
bool isEngineInstanced = !subDevice->engines[0].osContext->isRootDevice();
|
|
|
|
isEngineInstanced &= subDevice->engineInstanced;
|
|
|
|
isEngineInstanced &= (subDevice->getNumAvailableDevices() == 1);
|
|
|
|
isEngineInstanced &= (engineType == subDevice->engineType);
|
|
|
|
isEngineInstanced &= (subDeviceIndex == subDevice->getSubDeviceIndex());
|
|
|
|
isEngineInstanced &= (deviceBitfield == subDevice->getDeviceBitfield());
|
|
|
|
|
|
|
|
return isEngineInstanced;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <typename MockDeviceT>
|
|
|
|
bool hasAllEngines(MockDeviceT *device) {
|
|
|
|
auto &hwInfo = device->getHardwareInfo();
|
|
|
|
auto gpgpuEngines = HwHelper::get(hwInfo.platform.eRenderCoreFamily).getGpgpuEngineInstances(hwInfo);
|
|
|
|
|
|
|
|
for (size_t i = 0; i < gpgpuEngines.size(); i++) {
|
|
|
|
if (device->engines[i].getEngineType() != gpgpuEngines[i].first) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
2021-04-23 18:56:13 +08:00
|
|
|
|
2021-04-29 01:46:13 +08:00
|
|
|
bool multiCcsDevice(const HardwareInfo &hwInfo, uint32_t expectedNumCcs) {
|
|
|
|
auto gpgpuEngines = HwHelper::get(hwInfo.platform.eRenderCoreFamily).getGpgpuEngineInstances(hwInfo);
|
|
|
|
|
|
|
|
uint32_t numCcs = 0;
|
|
|
|
|
|
|
|
for (auto &engine : gpgpuEngines) {
|
|
|
|
if (EngineHelpers::isCcs(engine.first) && (engine.second == EngineUsage::Regular)) {
|
|
|
|
numCcs++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return (numCcs == expectedNumCcs);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool hasEngineInstancedEngines(MockSubDevice *device, aub_stream::EngineType engineType) {
|
|
|
|
bool ccsFound = false;
|
|
|
|
|
|
|
|
for (auto &engine : device->engines) {
|
|
|
|
if ((engine.getEngineType() != engineType) && !EngineHelpers::isBcs(engine.getEngineType())) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
auto osContext = engine.osContext;
|
|
|
|
|
|
|
|
if ((engine.getEngineType() == engineType) &&
|
|
|
|
osContext->isDefaultContext() &&
|
|
|
|
osContext->isRegular() &&
|
|
|
|
!osContext->isLowPriority() &&
|
|
|
|
!osContext->isInternalEngine()) {
|
|
|
|
EXPECT_FALSE(ccsFound);
|
|
|
|
ccsFound = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return ccsFound;
|
|
|
|
}
|
|
|
|
|
|
|
|
DebugManagerStateRestore restorer;
|
|
|
|
std::unique_ptr<UltDeviceFactory> deviceFactory;
|
|
|
|
MockDevice *rootDevice = nullptr;
|
|
|
|
};
|
|
|
|
|
|
|
|
TEST_F(EngineInstancedDeviceTests, givenDebugFlagSetAndMoreThanOneCcsWhenCreatingRootDeviceWithoutGenericSubDevicesThenCreateEngineInstanced) {
|
|
|
|
constexpr uint32_t genericDevicesCount = 1;
|
|
|
|
constexpr uint32_t ccsCount = 2;
|
|
|
|
|
|
|
|
if (!createDevices(genericDevicesCount, ccsCount)) {
|
|
|
|
GTEST_SKIP();
|
|
|
|
}
|
2021-04-23 18:56:13 +08:00
|
|
|
|
|
|
|
auto &hwInfo = rootDevice->getHardwareInfo();
|
|
|
|
|
2021-04-29 01:46:13 +08:00
|
|
|
EXPECT_EQ(ccsCount, hwInfo.gtSystemInfo.CCSInfo.NumberOfCCSEnabled);
|
2021-04-23 18:56:13 +08:00
|
|
|
EXPECT_EQ(ccsCount, rootDevice->getNumAvailableDevices());
|
|
|
|
|
2021-04-29 01:46:13 +08:00
|
|
|
EXPECT_FALSE(hasRootCsrOnly(rootDevice));
|
|
|
|
EXPECT_TRUE(hasAllEngines(rootDevice));
|
2021-04-27 17:51:03 +08:00
|
|
|
|
2021-04-23 18:56:13 +08:00
|
|
|
for (uint32_t i = 0; i < ccsCount; i++) {
|
|
|
|
auto engineType = static_cast<aub_stream::EngineType>(aub_stream::EngineType::ENGINE_CCS + i);
|
|
|
|
auto subDevice = static_cast<MockSubDevice *>(rootDevice->getDeviceById(i));
|
|
|
|
ASSERT_NE(nullptr, subDevice);
|
|
|
|
|
2021-04-29 01:46:13 +08:00
|
|
|
EXPECT_TRUE(isEngineInstanced(subDevice, engineType, 0, 1));
|
|
|
|
EXPECT_TRUE(hasEngineInstancedEngines(subDevice, engineType));
|
2021-04-23 18:56:13 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-04-29 01:46:13 +08:00
|
|
|
TEST_F(EngineInstancedDeviceTests, givenDebugFlagSetAndZeroCcsesWhenCreatingRootDeviceWithoutGenericSubDevicesThenCreateEngineInstanced) {
|
|
|
|
constexpr uint32_t genericDevicesCount = 1;
|
|
|
|
constexpr uint32_t ccsCount = 0;
|
2021-04-23 18:56:13 +08:00
|
|
|
|
2021-04-29 01:46:13 +08:00
|
|
|
EXPECT_TRUE(createDevices(genericDevicesCount, ccsCount));
|
2021-04-23 18:56:13 +08:00
|
|
|
|
2021-04-29 01:46:13 +08:00
|
|
|
EXPECT_FALSE(hasRootCsrOnly(rootDevice));
|
|
|
|
EXPECT_TRUE(hasAllEngines(rootDevice));
|
2021-04-23 18:56:13 +08:00
|
|
|
|
|
|
|
EXPECT_EQ(1u, rootDevice->getNumAvailableDevices());
|
|
|
|
EXPECT_FALSE(rootDevice->getDeviceById(0)->isSubDevice());
|
|
|
|
}
|
|
|
|
|
2021-04-29 01:46:13 +08:00
|
|
|
TEST_F(EngineInstancedDeviceTests, givenDebugFlagSetAndSingleCcsWhenCreatingRootDeviceWithoutGenericSubDevicesThenDontCreateEngineInstanced) {
|
|
|
|
constexpr uint32_t genericDevicesCount = 1;
|
|
|
|
constexpr uint32_t ccsCount = 1;
|
2021-04-23 18:56:13 +08:00
|
|
|
|
2021-04-29 01:46:13 +08:00
|
|
|
if (!createDevices(genericDevicesCount, ccsCount)) {
|
|
|
|
GTEST_SKIP();
|
|
|
|
}
|
2021-04-26 23:19:31 +08:00
|
|
|
|
2021-04-29 01:46:13 +08:00
|
|
|
EXPECT_FALSE(hasRootCsrOnly(rootDevice));
|
|
|
|
EXPECT_TRUE(hasAllEngines(rootDevice));
|
|
|
|
|
|
|
|
EXPECT_EQ(1u, rootDevice->getNumAvailableDevices());
|
|
|
|
EXPECT_FALSE(rootDevice->getDeviceById(0)->isSubDevice());
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(EngineInstancedDeviceTests, givenDebugFlagSetWhenCreatingRootDeviceWithGenericSubDevicesAndZeroCcsesThenDontCreateEngineInstanced) {
|
|
|
|
constexpr uint32_t genericDevicesCount = 2;
|
|
|
|
constexpr uint32_t ccsCount = 0;
|
2021-04-26 23:19:31 +08:00
|
|
|
|
2021-04-29 01:46:13 +08:00
|
|
|
EXPECT_TRUE(createDevices(genericDevicesCount, ccsCount));
|
2021-04-23 18:56:13 +08:00
|
|
|
|
2021-04-29 01:46:13 +08:00
|
|
|
EXPECT_TRUE(hasRootCsrOnly(rootDevice));
|
2021-04-23 18:56:13 +08:00
|
|
|
|
2021-04-29 01:46:13 +08:00
|
|
|
for (uint32_t i = 0; i < genericDevicesCount; i++) {
|
2021-04-23 18:56:13 +08:00
|
|
|
auto subDevice = static_cast<MockSubDevice *>(rootDevice->getDeviceById(i));
|
|
|
|
ASSERT_NE(nullptr, subDevice);
|
|
|
|
|
2021-04-27 17:51:03 +08:00
|
|
|
EXPECT_FALSE(subDevice->engines[0].osContext->isRootDevice());
|
2021-04-23 18:56:13 +08:00
|
|
|
EXPECT_FALSE(subDevice->engineInstanced);
|
|
|
|
EXPECT_EQ(1u, subDevice->getNumAvailableDevices());
|
|
|
|
EXPECT_EQ(aub_stream::EngineType::NUM_ENGINES, subDevice->engineType);
|
2021-04-29 01:46:13 +08:00
|
|
|
|
|
|
|
EXPECT_TRUE(hasAllEngines(subDevice));
|
2021-04-23 18:56:13 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-04-29 01:46:13 +08:00
|
|
|
TEST_F(EngineInstancedDeviceTests, givenDebugFlagSetWhenCreatingRootDeviceWithGenericSubDevicesAndSingleCcsThenDontCreateEngineInstanced) {
|
|
|
|
constexpr uint32_t genericDevicesCount = 2;
|
|
|
|
constexpr uint32_t ccsCount = 1;
|
2021-04-26 23:19:31 +08:00
|
|
|
|
2021-04-29 01:46:13 +08:00
|
|
|
if (!createDevices(genericDevicesCount, ccsCount)) {
|
|
|
|
GTEST_SKIP();
|
|
|
|
}
|
2021-04-26 23:19:31 +08:00
|
|
|
|
2021-04-29 01:46:13 +08:00
|
|
|
EXPECT_TRUE(hasRootCsrOnly(rootDevice));
|
2021-04-26 23:19:31 +08:00
|
|
|
|
2021-04-29 01:46:13 +08:00
|
|
|
for (uint32_t i = 0; i < genericDevicesCount; i++) {
|
|
|
|
auto subDevice = static_cast<MockSubDevice *>(rootDevice->getDeviceById(i));
|
|
|
|
ASSERT_NE(nullptr, subDevice);
|
|
|
|
|
|
|
|
EXPECT_FALSE(subDevice->engines[0].osContext->isRootDevice());
|
|
|
|
EXPECT_FALSE(subDevice->engineInstanced);
|
|
|
|
EXPECT_EQ(1u, subDevice->getNumAvailableDevices());
|
|
|
|
EXPECT_EQ(aub_stream::EngineType::NUM_ENGINES, subDevice->engineType);
|
2021-04-26 23:19:31 +08:00
|
|
|
|
2021-04-29 01:46:13 +08:00
|
|
|
EXPECT_TRUE(hasAllEngines(subDevice));
|
|
|
|
}
|
|
|
|
}
|
2021-04-26 23:19:31 +08:00
|
|
|
|
2021-04-29 01:46:13 +08:00
|
|
|
TEST_F(EngineInstancedDeviceTests, givenDebugFlagSetWhenCreatingRootDeviceWithGenericSubDevicesThenCreateEngineInstanced) {
|
|
|
|
constexpr uint32_t genericDevicesCount = 2;
|
|
|
|
constexpr uint32_t ccsCount = 2;
|
|
|
|
|
|
|
|
if (!createDevices(genericDevicesCount, ccsCount)) {
|
|
|
|
GTEST_SKIP();
|
|
|
|
}
|
2021-04-26 23:19:31 +08:00
|
|
|
|
2021-04-29 01:46:13 +08:00
|
|
|
EXPECT_TRUE(hasRootCsrOnly(rootDevice));
|
2021-04-27 17:51:03 +08:00
|
|
|
|
2021-04-29 01:46:13 +08:00
|
|
|
for (uint32_t i = 0; i < genericDevicesCount; i++) {
|
2021-04-26 23:19:31 +08:00
|
|
|
auto subDevice = static_cast<MockSubDevice *>(rootDevice->getDeviceById(i));
|
|
|
|
ASSERT_NE(nullptr, subDevice);
|
|
|
|
|
2021-04-27 17:51:03 +08:00
|
|
|
EXPECT_FALSE(subDevice->engines[0].osContext->isRootDevice());
|
2021-04-26 23:19:31 +08:00
|
|
|
EXPECT_FALSE(subDevice->engineInstanced);
|
|
|
|
EXPECT_EQ(ccsCount, subDevice->getNumAvailableDevices());
|
|
|
|
EXPECT_EQ(aub_stream::EngineType::NUM_ENGINES, subDevice->engineType);
|
|
|
|
|
2021-04-29 01:46:13 +08:00
|
|
|
EXPECT_TRUE(hasAllEngines(subDevice));
|
|
|
|
|
2021-04-26 23:19:31 +08:00
|
|
|
for (uint32_t j = 0; j < ccsCount; j++) {
|
|
|
|
auto engineType = static_cast<aub_stream::EngineType>(aub_stream::EngineType::ENGINE_CCS + j);
|
|
|
|
auto engineSubDevice = static_cast<MockSubDevice *>(subDevice->getDeviceById(j));
|
|
|
|
ASSERT_NE(nullptr, engineSubDevice);
|
|
|
|
|
2021-04-29 01:46:13 +08:00
|
|
|
EXPECT_TRUE(isEngineInstanced(engineSubDevice, engineType, subDevice->getSubDeviceIndex(), subDevice->getDeviceBitfield()));
|
|
|
|
EXPECT_TRUE(hasEngineInstancedEngines(engineSubDevice, engineType));
|
2021-04-26 23:19:31 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-04-29 01:46:13 +08:00
|
|
|
TEST_F(EngineInstancedDeviceTests, givenEngineInstancedSubDeviceWhenEngineCreationFailsThenReturnFalse) {
|
|
|
|
constexpr uint32_t genericDevicesCount = 2;
|
|
|
|
constexpr uint32_t ccsCount = 0;
|
|
|
|
|
|
|
|
EXPECT_TRUE(createDevices(genericDevicesCount, ccsCount));
|
|
|
|
|
|
|
|
auto subDevice = static_cast<MockSubDevice *>(rootDevice->getDeviceById(0));
|
|
|
|
|
|
|
|
auto &hwInfo = rootDevice->getHardwareInfo();
|
|
|
|
auto gpgpuEngines = HwHelper::get(hwInfo.platform.eRenderCoreFamily).getGpgpuEngineInstances(hwInfo);
|
|
|
|
|
|
|
|
subDevice->engineInstanced = true;
|
|
|
|
subDevice->failOnCreateEngine = true;
|
|
|
|
subDevice->engineType = gpgpuEngines[0].first;
|
|
|
|
|
|
|
|
EXPECT_FALSE(subDevice->createEnginesForEngineInstancedDevice());
|
|
|
|
}
|
|
|
|
|
2020-09-15 16:11:12 +08:00
|
|
|
TEST(SubDevicesTest, whenInitializeRootCsrThenDirectSubmissionIsNotInitialized) {
|
|
|
|
auto device = std::make_unique<MockDevice>();
|
|
|
|
device->initializeRootCommandStreamReceiver();
|
|
|
|
|
|
|
|
auto csr = device->getEngine(1u).commandStreamReceiver;
|
|
|
|
EXPECT_FALSE(csr->isDirectSubmissionEnabled());
|
2020-10-30 17:27:48 +08:00
|
|
|
}
|
2020-11-18 19:17:45 +08:00
|
|
|
|
|
|
|
TEST(SubDevicesTest, givenCreateMultipleSubDevicesFlagSetWhenBindlessHeapHelperCreatedThenSubDeviceReturnRootDeviceMember) {
|
|
|
|
DebugManagerStateRestore restorer;
|
|
|
|
DebugManager.flags.CreateMultipleSubDevices.set(2);
|
|
|
|
VariableBackup<bool> mockDeviceFlagBackup(&MockDevice::createSingleDevice, false);
|
|
|
|
auto device = std::unique_ptr<MockDevice>(MockDevice::createWithNewExecutionEnvironment<MockDevice>(defaultHwInfo.get()));
|
|
|
|
|
2021-01-27 21:31:29 +08:00
|
|
|
device->getExecutionEnvironment()->rootDeviceEnvironments[device->getRootDeviceIndex()]->createBindlessHeapsHelper(device->getMemoryManager(), device->getNumAvailableDevices() > 1, device->getRootDeviceIndex());
|
2020-11-18 19:17:45 +08:00
|
|
|
EXPECT_EQ(device->getBindlessHeapsHelper(), device->subdevices.at(0)->getBindlessHeapsHelper());
|
|
|
|
}
|