2019-08-28 19:12:44 +08:00
|
|
|
/*
|
|
|
|
* Copyright (C) 2019 Intel Corporation
|
|
|
|
*
|
|
|
|
* SPDX-License-Identifier: MIT
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "core/unit_tests/helpers/debug_manager_state_restore.h"
|
|
|
|
#include "runtime/device/sub_device.h"
|
|
|
|
#include "unit_tests/helpers/variable_backup.h"
|
|
|
|
#include "unit_tests/mocks/mock_device.h"
|
|
|
|
#include "unit_tests/mocks/mock_memory_manager.h"
|
|
|
|
namespace NEO {
|
|
|
|
extern bool overrideDeviceWithDefaultHardwareInfo;
|
|
|
|
}
|
|
|
|
using namespace NEO;
|
|
|
|
|
|
|
|
TEST(SubDevicesTest, givenDefaultConfigWhenCreateRootDeviceThenItDoesntContainSubDevices) {
|
|
|
|
auto device = std::unique_ptr<MockDevice>(MockDevice::createWithNewExecutionEnvironment<MockDevice>(*platformDevices));
|
|
|
|
|
|
|
|
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);
|
2019-10-21 19:41:35 +08:00
|
|
|
auto device = std::unique_ptr<MockDevice>(MockDevice::createWithNewExecutionEnvironment<MockDevice>(*platformDevices));
|
|
|
|
|
|
|
|
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);
|
2019-08-28 19:12:44 +08:00
|
|
|
auto device = std::unique_ptr<MockDevice>(MockDevice::createWithNewExecutionEnvironment<MockDevice>(*platformDevices));
|
|
|
|
|
|
|
|
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
|
|
|
}
|
|
|
|
|
|
|
|
TEST(SubDevicesTest, givenDeviceWithSubDevicesWhenSubDeviceRefcountsAreChangedThenChangeIsPropagatedToRootDevice) {
|
|
|
|
DebugManagerStateRestore restorer;
|
|
|
|
DebugManager.flags.CreateMultipleSubDevices.set(2);
|
2019-10-07 18:42:28 +08:00
|
|
|
VariableBackup<bool> mockDeviceFlagBackup(&MockDevice::createSingleDevice, false);
|
2019-08-28 19:12:44 +08:00
|
|
|
auto device = std::unique_ptr<MockDevice>(MockDevice::createWithNewExecutionEnvironment<MockDevice>(*platformDevices));
|
|
|
|
|
|
|
|
auto subDevice0 = device->subdevices.at(0).get();
|
|
|
|
auto subDevice1 = device->subdevices.at(1).get();
|
|
|
|
auto baseApiRefCount = device->getRefApiCount();
|
|
|
|
auto baseInternalRefCount = device->getRefInternalCount();
|
|
|
|
|
|
|
|
subDevice0->retain();
|
|
|
|
EXPECT_EQ(baseInternalRefCount + 1, device->getRefInternalCount());
|
|
|
|
EXPECT_EQ(baseApiRefCount, device->getRefApiCount());
|
|
|
|
|
|
|
|
subDevice1->retainInternal();
|
|
|
|
EXPECT_EQ(baseInternalRefCount + 2, device->getRefInternalCount());
|
|
|
|
EXPECT_EQ(baseApiRefCount, device->getRefApiCount());
|
|
|
|
|
|
|
|
subDevice0->release();
|
|
|
|
EXPECT_EQ(baseInternalRefCount + 1, device->getRefInternalCount());
|
|
|
|
EXPECT_EQ(baseApiRefCount, device->getRefApiCount());
|
|
|
|
|
|
|
|
subDevice1->releaseInternal();
|
|
|
|
EXPECT_EQ(baseInternalRefCount, device->getRefInternalCount());
|
|
|
|
EXPECT_EQ(baseApiRefCount, device->getRefApiCount());
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST(SubDevicesTest, givenDeviceWithSubDevicesWhenSubDeviceCreationFailThenWholeDeviceIsDestroyed) {
|
|
|
|
DebugManagerStateRestore restorer;
|
|
|
|
DebugManager.flags.CreateMultipleSubDevices.set(10);
|
|
|
|
ExecutionEnvironment 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);
|
2019-08-28 19:12:44 +08:00
|
|
|
VariableBackup<bool> backup(&overrideDeviceWithDefaultHardwareInfo, false);
|
|
|
|
platform()->initialize();
|
2019-10-24 19:34:25 +08:00
|
|
|
EXPECT_EQ(0u, platform()->getDevice(0)->getRootDeviceIndex());
|
|
|
|
EXPECT_EQ(1u, platform()->getDevice(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);
|
|
|
|
auto device = std::unique_ptr<MockDevice>(MockDevice::createWithNewExecutionEnvironment<MockDevice>(*platformDevices));
|
|
|
|
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);
|
2019-09-17 16:44:49 +08:00
|
|
|
auto device = std::unique_ptr<MockDevice>(MockDevice::createWithNewExecutionEnvironment<MockDevice>(*platformDevices));
|
|
|
|
|
|
|
|
EXPECT_EQ(2u, device->getNumSubDevices());
|
|
|
|
|
|
|
|
auto firstSubDevice = static_cast<SubDevice *>(device->subdevices.at(0).get());
|
|
|
|
auto secondSubDevice = static_cast<SubDevice *>(device->subdevices.at(1).get());
|
|
|
|
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) {
|
|
|
|
auto device = std::unique_ptr<MockDevice>(MockDevice::createWithNewExecutionEnvironment<MockDevice>(*platformDevices));
|
|
|
|
|
|
|
|
EXPECT_EQ(1u, device->getNumAvailableDevices());
|
|
|
|
EXPECT_EQ(device.get(), device->getDeviceById(0u));
|
|
|
|
EXPECT_THROW(device->getDeviceById(1), std::exception);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST(SubDevicesTest, givenDeviceWithSubDevicesWhenGettingDeviceByIdThenGetCorrectSubDevice) {
|
|
|
|
DebugManagerStateRestore restorer;
|
|
|
|
DebugManager.flags.CreateMultipleSubDevices.set(2);
|
2019-10-07 18:42:28 +08:00
|
|
|
VariableBackup<bool> mockDeviceFlagBackup(&MockDevice::createSingleDevice, false);
|
2019-10-10 21:56:10 +08:00
|
|
|
auto device = std::unique_ptr<MockDevice>(MockDevice::createWithNewExecutionEnvironment<MockDevice>(*platformDevices));
|
|
|
|
EXPECT_EQ(2u, device->getNumSubDevices());
|
|
|
|
EXPECT_EQ(device->subdevices.at(0).get(), device->getDeviceById(0));
|
|
|
|
EXPECT_EQ(device->subdevices.at(1).get(), device->getDeviceById(1));
|
|
|
|
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);
|
2019-10-10 21:56:10 +08:00
|
|
|
auto device = std::unique_ptr<MockDevice>(MockDevice::createWithNewExecutionEnvironment<MockDevice>(*platformDevices));
|
|
|
|
EXPECT_EQ(2u, device->getNumSubDevices());
|
|
|
|
auto subDevice = device->subdevices.at(0).get();
|
|
|
|
|
|
|
|
EXPECT_EQ(subDevice, subDevice->getDeviceById(0));
|
|
|
|
EXPECT_THROW(subDevice->getDeviceById(1), std::exception);
|
|
|
|
}
|
2019-10-07 18:42:28 +08:00
|
|
|
|
2019-11-05 20:38:20 +08:00
|
|
|
TEST(RootDevicesTest, givenRootDeviceWhenInitializeRootCommandStreamReceiverReturnsTrueThenDeviceDoesntCreateExtraEngines) {
|
|
|
|
auto executionEnvironment = new MockExecutionEnvironment;
|
2019-10-07 18:42:28 +08:00
|
|
|
MockDevice device(executionEnvironment, 0);
|
2019-11-05 20:38:20 +08:00
|
|
|
device.callBaseInitializeRootCommandStreamReceiver = false;
|
|
|
|
device.initializeRootCommandStreamReceiverReturnValue = true;
|
|
|
|
EXPECT_EQ(0u, device.engines.size());
|
|
|
|
device.createEngines();
|
2019-10-07 18:42:28 +08:00
|
|
|
EXPECT_EQ(0u, device.engines.size());
|
|
|
|
}
|
2019-11-05 20:38:20 +08:00
|
|
|
TEST(RootDevicesTest, givenRootDeviceWhenInitializeRootCommandStreamReceiverReturnsFalseThenDeviceCreatesExtraEngines) {
|
2019-10-07 18:42:28 +08:00
|
|
|
auto executionEnvironment = new MockExecutionEnvironment;
|
2019-11-05 20:38:20 +08:00
|
|
|
MockDevice device(executionEnvironment, 0);
|
|
|
|
device.callBaseInitializeRootCommandStreamReceiver = false;
|
|
|
|
device.initializeRootCommandStreamReceiverReturnValue = false;
|
|
|
|
EXPECT_EQ(0u, device.engines.size());
|
|
|
|
device.createEngines();
|
|
|
|
EXPECT_LT(0u, device.engines.size());
|
2019-10-07 18:42:28 +08:00
|
|
|
}
|