mirror of
https://github.com/intel/compute-runtime.git
synced 2025-09-15 13:01:45 +08:00
Add new flag to USM memory manager
Related-To: NEO-5498 Signed-off-by: Zbigniew Zdanowicz <zbigniew.zdanowicz@intel.com>
This commit is contained in:

committed by
Compute-Runtime-Automation

parent
bca7b54728
commit
779253c49c
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2019-2020 Intel Corporation
|
||||
* Copyright (C) 2019-2021 Intel Corporation
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2019-2020 Intel Corporation
|
||||
* Copyright (C) 2019-2021 Intel Corporation
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
|
@ -178,11 +178,11 @@ DriverHandleImp::~DriverHandleImp() {
|
||||
}
|
||||
|
||||
ze_result_t DriverHandleImp::initialize(std::vector<std::unique_ptr<NEO::Device>> neoDevices) {
|
||||
|
||||
if (enablePciIdDeviceOrder) {
|
||||
sortNeoDevices(neoDevices);
|
||||
}
|
||||
|
||||
bool multiOsContextDriver = false;
|
||||
for (auto &neoDevice : neoDevices) {
|
||||
if (!neoDevice->getHardwareInfo().capabilityTable.levelZeroSupported) {
|
||||
continue;
|
||||
@ -193,11 +193,6 @@ ze_result_t DriverHandleImp::initialize(std::vector<std::unique_ptr<NEO::Device>
|
||||
if (this->memoryManager == nullptr) {
|
||||
return ZE_RESULT_ERROR_OUT_OF_HOST_MEMORY;
|
||||
}
|
||||
|
||||
this->svmAllocsManager = new NEO::SVMAllocsManager(memoryManager);
|
||||
if (this->svmAllocsManager == nullptr) {
|
||||
return ZE_RESULT_ERROR_OUT_OF_HOST_MEMORY;
|
||||
}
|
||||
}
|
||||
|
||||
if (enableProgramDebugging) {
|
||||
@ -211,12 +206,19 @@ ze_result_t DriverHandleImp::initialize(std::vector<std::unique_ptr<NEO::Device>
|
||||
auto pNeoDevice = neoDevice.release();
|
||||
auto device = Device::create(this, pNeoDevice, pNeoDevice->getExecutionEnvironment()->rootDeviceEnvironments[pNeoDevice->getRootDeviceIndex()]->deviceAffinityMask, false);
|
||||
this->devices.push_back(device);
|
||||
|
||||
multiOsContextDriver |= device->isMultiDeviceCapable();
|
||||
}
|
||||
|
||||
if (this->devices.size() == 0) {
|
||||
return ZE_RESULT_ERROR_UNINITIALIZED;
|
||||
}
|
||||
|
||||
this->svmAllocsManager = new NEO::SVMAllocsManager(memoryManager, multiOsContextDriver);
|
||||
if (this->svmAllocsManager == nullptr) {
|
||||
return ZE_RESULT_ERROR_OUT_OF_HOST_MEMORY;
|
||||
}
|
||||
|
||||
this->numDevices = static_cast<uint32_t>(this->devices.size());
|
||||
|
||||
extensionFunctionsLookupMap = getExtensionFunctionsLookupMap();
|
||||
@ -237,7 +239,6 @@ DriverHandle *DriverHandle::create(std::vector<std::unique_ptr<NEO::Device>> dev
|
||||
driverHandle->enableProgramDebugging = envVariables.programDebugging;
|
||||
driverHandle->enableSysman = envVariables.sysman;
|
||||
driverHandle->enablePciIdDeviceOrder = envVariables.pciIdDeviceOrder;
|
||||
|
||||
ze_result_t res = driverHandle->initialize(std::move(devices));
|
||||
if (res != ZE_RESULT_SUCCESS) {
|
||||
delete driverHandle;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2020 Intel Corporation
|
||||
* Copyright (C) 2020-2021 Intel Corporation
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2020 Intel Corporation
|
||||
* Copyright (C) 2020-2021 Intel Corporation
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
|
@ -219,10 +219,11 @@ bool Context::createImpl(const cl_context_properties *properties,
|
||||
anySvmSupport |= device->getHardwareInfo().capabilityTable.ftrSvm;
|
||||
}
|
||||
|
||||
if (anySvmSupport) {
|
||||
this->svmAllocsManager = new SVMAllocsManager(this->memoryManager);
|
||||
}
|
||||
setupContextType();
|
||||
if (anySvmSupport) {
|
||||
this->svmAllocsManager = new SVMAllocsManager(this->memoryManager,
|
||||
this->areMultiStorageAllocationsPreferred());
|
||||
}
|
||||
}
|
||||
|
||||
for (auto &device : devices) {
|
||||
|
@ -1226,7 +1226,7 @@ HWTEST_F(AubCommandStreamReceiverTests, givenUsmAllocationWhenDumpAllocationIsCa
|
||||
auto mockHardwareContext = static_cast<MockHardwareContext *>(aubCsr.hardwareContextController->hardwareContexts[0].get());
|
||||
|
||||
auto memoryManager = std::make_unique<MockMemoryManager>(false, true, *pDevice->executionEnvironment);
|
||||
auto svmManager = std::make_unique<MockSVMAllocsManager>(memoryManager.get());
|
||||
auto svmManager = std::make_unique<MockSVMAllocsManager>(memoryManager.get(), false);
|
||||
|
||||
std::set<uint32_t> rootDeviceIndices{rootDeviceIndex};
|
||||
std::map<uint32_t, DeviceBitfield> deviceBitfields{{rootDeviceIndex, pDevice->getDeviceBitfield()}};
|
||||
|
@ -859,7 +859,7 @@ HWTEST_F(BcsTests, givenMapAllocationInBuiltinOpParamsWhenConstructingThenUseItA
|
||||
HWTEST_F(BcsTests, givenNonZeroCopySvmAllocationWhenConstructingBlitPropertiesForReadWriteBufferCallThenSetValidAllocations) {
|
||||
auto &csr = pDevice->getUltCommandStreamReceiver<FamilyType>();
|
||||
MockMemoryManager mockMemoryManager(true, true);
|
||||
SVMAllocsManager svmAllocsManager(&mockMemoryManager);
|
||||
SVMAllocsManager svmAllocsManager(&mockMemoryManager, false);
|
||||
|
||||
auto svmAllocationProperties = MemObjHelper::getSvmAllocationProperties(CL_MEM_READ_WRITE);
|
||||
auto svmAlloc = svmAllocsManager.createSVMAlloc(1, svmAllocationProperties, context->getRootDeviceIndices(), context->getDeviceBitfields());
|
||||
@ -904,7 +904,7 @@ HWTEST_F(BcsTests, givenNonZeroCopySvmAllocationWhenConstructingBlitPropertiesFo
|
||||
HWTEST_F(BcsTests, givenSvmAllocationWhenBlitCalledThenUsePassedPointers) {
|
||||
auto &csr = pDevice->getUltCommandStreamReceiver<FamilyType>();
|
||||
MockMemoryManager mockMemoryManager(true, true);
|
||||
SVMAllocsManager svmAllocsManager(&mockMemoryManager);
|
||||
SVMAllocsManager svmAllocsManager(&mockMemoryManager, false);
|
||||
|
||||
auto svmAllocationProperties = MemObjHelper::getSvmAllocationProperties(CL_MEM_READ_WRITE);
|
||||
auto svmAlloc = svmAllocsManager.createSVMAlloc(1, svmAllocationProperties, context->getRootDeviceIndices(), context->getDeviceBitfields());
|
||||
|
@ -50,7 +50,7 @@ TEST_F(PageFaultManagerTest, givenUnifiedMemoryAllocWhenSynchronizeMemoryThenEnq
|
||||
REQUIRE_SVM_OR_SKIP(executionEnvironment.rootDeviceEnvironments[0]->getHardwareInfo());
|
||||
|
||||
auto memoryManager = std::make_unique<MockMemoryManager>(executionEnvironment);
|
||||
auto svmAllocsManager = std::make_unique<SVMAllocsManager>(memoryManager.get());
|
||||
auto svmAllocsManager = std::make_unique<SVMAllocsManager>(memoryManager.get(), false);
|
||||
auto device = std::unique_ptr<MockClDevice>(new MockClDevice{MockDevice::createWithNewExecutionEnvironment<MockDevice>(nullptr)});
|
||||
auto rootDeviceIndex = device->getRootDeviceIndex();
|
||||
std::set<uint32_t> rootDeviceIndices{rootDeviceIndex};
|
||||
@ -88,7 +88,7 @@ TEST_F(PageFaultManagerTest, givenUnifiedMemoryAllocWhenGpuTransferIsInvokedThen
|
||||
int insertSvmMapOperationCalled = 0;
|
||||
};
|
||||
auto memoryManager = std::make_unique<MockMemoryManager>(executionEnvironment);
|
||||
auto svmAllocsManager = std::make_unique<MockSVMAllocsManager>(memoryManager.get());
|
||||
auto svmAllocsManager = std::make_unique<MockSVMAllocsManager>(memoryManager.get(), false);
|
||||
auto device = std::unique_ptr<MockClDevice>(new MockClDevice{MockDevice::createWithNewExecutionEnvironment<MockDevice>(nullptr)});
|
||||
auto rootDeviceIndex = device->getRootDeviceIndex();
|
||||
std::set<uint32_t> rootDeviceIndices{rootDeviceIndex};
|
||||
|
@ -2455,7 +2455,7 @@ TEST(MemoryManagerTest, whenMemoryManagerReturnsNullptrThenAllocateGlobalsSurfac
|
||||
EXPECT_EQ(nullptr, allocation);
|
||||
EXPECT_EQ(deviceBitfield, memoryManager->recentlyPassedDeviceBitfield);
|
||||
|
||||
auto svmAllocsManager = std::make_unique<SVMAllocsManager>(device.getMemoryManager());
|
||||
auto svmAllocsManager = std::make_unique<SVMAllocsManager>(device.getMemoryManager(), false);
|
||||
memoryManager->recentlyPassedDeviceBitfield = {};
|
||||
allocation = allocateGlobalsSurface(svmAllocsManager.get(), device.getDevice(), 1024, false, &linkerInput, nullptr);
|
||||
EXPECT_EQ(nullptr, allocation);
|
||||
|
@ -40,7 +40,7 @@ struct SVMMemoryAllocatorFixture {
|
||||
}
|
||||
executionEnvironment.initGmm();
|
||||
memoryManager = std::make_unique<MockMemoryManager>(false, enableLocalMemory, executionEnvironment);
|
||||
svmManager = std::make_unique<MockSVMAllocsManager>(memoryManager.get());
|
||||
svmManager = std::make_unique<MockSVMAllocsManager>(memoryManager.get(), false);
|
||||
if (enableLocalMemory) {
|
||||
memoryManager->pageFaultManager.reset(new MockPageFaultManager);
|
||||
}
|
||||
@ -526,7 +526,7 @@ struct UnifiedMemoryManagerPropertiesTest : public ::testing::Test {
|
||||
GTEST_SKIP();
|
||||
}
|
||||
memoryManager = std::make_unique<MemoryManagerPropertiesCheck>(false, true, executionEnvironment);
|
||||
svmManager = std::make_unique<MockSVMAllocsManager>(memoryManager.get());
|
||||
svmManager = std::make_unique<MockSVMAllocsManager>(memoryManager.get(), false);
|
||||
memoryManager->pageFaultManager.reset(new MockPageFaultManager);
|
||||
}
|
||||
|
||||
@ -541,13 +541,13 @@ TEST(UnifiedMemoryTest, givenDeviceBitfieldWithMultipleBitsSetWhenSharedUnifiedM
|
||||
DebugManager.flags.CreateMultipleSubDevices.set(4);
|
||||
MockExecutionEnvironment executionEnvironment;
|
||||
auto memoryManager = std::make_unique<MemoryManagerPropertiesCheck>(false, true, executionEnvironment);
|
||||
auto svmManager = std::make_unique<MockSVMAllocsManager>(memoryManager.get());
|
||||
auto svmManager = std::make_unique<MockSVMAllocsManager>(memoryManager.get(), false);
|
||||
memoryManager->pageFaultManager.reset(new MockPageFaultManager);
|
||||
std::set<uint32_t> rootDeviceIndices{mockRootDeviceIndex};
|
||||
std::map<uint32_t, DeviceBitfield> deviceBitfields{{mockRootDeviceIndex, DeviceBitfield(0xf)}};
|
||||
|
||||
SVMAllocsManager::UnifiedMemoryProperties unifiedMemoryProperties(InternalMemoryType::SHARED_UNIFIED_MEMORY, rootDeviceIndices, deviceBitfields);
|
||||
|
||||
svmManager->multiOsContextSupport = true;
|
||||
auto ptr = svmManager->createSharedUnifiedMemoryAllocation(4096u, unifiedMemoryProperties, &cmdQ);
|
||||
|
||||
EXPECT_FALSE(memoryManager->multiOsContextCapablePassed);
|
||||
@ -573,17 +573,17 @@ TEST_F(UnifiedMemoryManagerPropertiesTest, givenDeviceBitfieldWithSingleBitSetWh
|
||||
svmManager->freeSVMAlloc(ptr);
|
||||
}
|
||||
|
||||
TEST(UnifiedMemoryTest, givenDeviceBitfieldWithMultipleBitsSetWhenDeviceUnifiedMemoryAllocationIsCreatedThenProperPropertiesArePassedToMemoryManager) {
|
||||
TEST(UnifiedMemoryTest, givenDeviceBitfieldWithMultipleBitsSetWhenMultiOsContextFlagTrueThenProperPropertiesArePassedToMemoryManager) {
|
||||
DebugManagerStateRestore restorer;
|
||||
DebugManager.flags.CreateMultipleSubDevices.set(4);
|
||||
MockExecutionEnvironment executionEnvironment;
|
||||
auto memoryManager = std::make_unique<MemoryManagerPropertiesCheck>(false, true, executionEnvironment);
|
||||
auto svmManager = std::make_unique<MockSVMAllocsManager>(memoryManager.get());
|
||||
auto svmManager = std::make_unique<MockSVMAllocsManager>(memoryManager.get(), false);
|
||||
|
||||
std::set<uint32_t> rootDeviceIndices{mockRootDeviceIndex};
|
||||
std::map<uint32_t, DeviceBitfield> deviceBitfields{{mockRootDeviceIndex, DeviceBitfield(0xf)}};
|
||||
SVMAllocsManager::UnifiedMemoryProperties unifiedMemoryProperties(InternalMemoryType::SHARED_UNIFIED_MEMORY, rootDeviceIndices, deviceBitfields);
|
||||
|
||||
svmManager->multiOsContextSupport = true;
|
||||
auto ptr = svmManager->createUnifiedMemoryAllocation(4096u, unifiedMemoryProperties);
|
||||
|
||||
EXPECT_FALSE(memoryManager->multiOsContextCapablePassed);
|
||||
@ -593,8 +593,47 @@ TEST(UnifiedMemoryTest, givenDeviceBitfieldWithMultipleBitsSetWhenDeviceUnifiedM
|
||||
svmManager->freeSVMAlloc(ptr);
|
||||
}
|
||||
|
||||
TEST_F(UnifiedMemoryManagerPropertiesTest, givenDeviceBitfieldWithSingleBitSetWhenDeviceUnifiedMemoryAllocationIsCreatedThenProperPropertiesArePassedToMemoryManager) {
|
||||
TEST(UnifiedMemoryTest, givenDeviceBitfieldWithMultipleBitsSetWhenMultiOsContextFlagFalseThenProperPropertiesArePassedToMemoryManager) {
|
||||
DebugManagerStateRestore restorer;
|
||||
DebugManager.flags.CreateMultipleSubDevices.set(4);
|
||||
MockExecutionEnvironment executionEnvironment;
|
||||
auto memoryManager = std::make_unique<MemoryManagerPropertiesCheck>(false, true, executionEnvironment);
|
||||
auto svmManager = std::make_unique<MockSVMAllocsManager>(memoryManager.get(), false);
|
||||
|
||||
std::set<uint32_t> rootDeviceIndices{mockRootDeviceIndex};
|
||||
std::map<uint32_t, DeviceBitfield> deviceBitfields{{mockRootDeviceIndex, DeviceBitfield(0xf)}};
|
||||
SVMAllocsManager::UnifiedMemoryProperties unifiedMemoryProperties(InternalMemoryType::SHARED_UNIFIED_MEMORY, rootDeviceIndices, deviceBitfields);
|
||||
svmManager->multiOsContextSupport = false;
|
||||
auto ptr = svmManager->createUnifiedMemoryAllocation(4096u, unifiedMemoryProperties);
|
||||
|
||||
EXPECT_FALSE(memoryManager->multiOsContextCapablePassed);
|
||||
EXPECT_FALSE(memoryManager->multiStorageResourcePassed);
|
||||
EXPECT_EQ(unifiedMemoryProperties.subdeviceBitfields.at(mockRootDeviceIndex), memoryManager->subDevicesBitfieldPassed);
|
||||
|
||||
svmManager->freeSVMAlloc(ptr);
|
||||
}
|
||||
|
||||
TEST(UnifiedMemoryTest, givenDeviceBitfieldWithSingleBitsSetWhenMultiOsContextFlagTrueThenProperPropertiesArePassedToMemoryManager) {
|
||||
DebugManagerStateRestore restorer;
|
||||
DebugManager.flags.CreateMultipleSubDevices.set(1);
|
||||
MockExecutionEnvironment executionEnvironment;
|
||||
auto memoryManager = std::make_unique<MemoryManagerPropertiesCheck>(false, true, executionEnvironment);
|
||||
auto svmManager = std::make_unique<MockSVMAllocsManager>(memoryManager.get(), false);
|
||||
|
||||
std::set<uint32_t> rootDeviceIndices{mockRootDeviceIndex};
|
||||
std::map<uint32_t, DeviceBitfield> deviceBitfields{{mockRootDeviceIndex, DeviceBitfield(0x1)}};
|
||||
SVMAllocsManager::UnifiedMemoryProperties unifiedMemoryProperties(InternalMemoryType::SHARED_UNIFIED_MEMORY, rootDeviceIndices, deviceBitfields);
|
||||
svmManager->multiOsContextSupport = true;
|
||||
auto ptr = svmManager->createUnifiedMemoryAllocation(4096u, unifiedMemoryProperties);
|
||||
|
||||
EXPECT_FALSE(memoryManager->multiOsContextCapablePassed);
|
||||
EXPECT_FALSE(memoryManager->multiStorageResourcePassed);
|
||||
EXPECT_EQ(unifiedMemoryProperties.subdeviceBitfields.at(mockRootDeviceIndex), memoryManager->subDevicesBitfieldPassed);
|
||||
|
||||
svmManager->freeSVMAlloc(ptr);
|
||||
}
|
||||
|
||||
TEST_F(UnifiedMemoryManagerPropertiesTest, givenDeviceBitfieldWithSingleBitSetWhenDeviceUnifiedMemoryAllocationIsCreatedThenProperPropertiesArePassedToMemoryManager) {
|
||||
std::set<uint32_t> rootDeviceIndices{mockRootDeviceIndex};
|
||||
std::map<uint32_t, DeviceBitfield> deviceBitfields{{mockRootDeviceIndex, DeviceBitfield(0x8)}};
|
||||
SVMAllocsManager::UnifiedMemoryProperties unifiedMemoryProperties(InternalMemoryType::SHARED_UNIFIED_MEMORY, rootDeviceIndices, deviceBitfields);
|
||||
@ -608,11 +647,12 @@ TEST_F(UnifiedMemoryManagerPropertiesTest, givenDeviceBitfieldWithSingleBitSetWh
|
||||
svmManager->freeSVMAlloc(ptr);
|
||||
}
|
||||
|
||||
TEST_F(UnifiedMemoryManagerPropertiesTest, givenDeviceBitfieldWithMultiDeviceBitSetWhenDeviceUnifiedMemoryAllocationIsCreatedThenProperPropertiesArePassedToMemoryManager) {
|
||||
TEST_F(UnifiedMemoryManagerPropertiesTest, givenDeviceBitfieldWithMultiDeviceBitSetWhenMultiOsContextFlagTrueThenProperPropertiesArePassedToMemoryManager) {
|
||||
std::set<uint32_t> rootDeviceIndices{mockRootDeviceIndex};
|
||||
std::map<uint32_t, DeviceBitfield> deviceBitfields{{mockRootDeviceIndex, DeviceBitfield(0xF)}};
|
||||
SVMAllocsManager::UnifiedMemoryProperties unifiedMemoryProperties(InternalMemoryType::SHARED_UNIFIED_MEMORY, rootDeviceIndices, deviceBitfields);
|
||||
|
||||
svmManager->multiOsContextSupport = true;
|
||||
auto ptr = svmManager->createUnifiedAllocationWithDeviceStorage(10 * MemoryConstants::pageSize64k, {}, unifiedMemoryProperties);
|
||||
|
||||
EXPECT_FALSE(memoryManager->multiOsContextCapablePassed);
|
||||
@ -622,6 +662,84 @@ TEST_F(UnifiedMemoryManagerPropertiesTest, givenDeviceBitfieldWithMultiDeviceBit
|
||||
svmManager->freeSVMAlloc(ptr);
|
||||
}
|
||||
|
||||
TEST_F(UnifiedMemoryManagerPropertiesTest, givenDeviceBitfieldWithMultiDeviceBitSetWhenMultiOsContextFlagFalseThenProperPropertiesArePassedToMemoryManager) {
|
||||
std::set<uint32_t> rootDeviceIndices{mockRootDeviceIndex};
|
||||
std::map<uint32_t, DeviceBitfield> deviceBitfields{{mockRootDeviceIndex, DeviceBitfield(0xF)}};
|
||||
SVMAllocsManager::UnifiedMemoryProperties unifiedMemoryProperties(InternalMemoryType::SHARED_UNIFIED_MEMORY, rootDeviceIndices, deviceBitfields);
|
||||
|
||||
svmManager->multiOsContextSupport = false;
|
||||
auto ptr = svmManager->createUnifiedAllocationWithDeviceStorage(10 * MemoryConstants::pageSize64k, {}, unifiedMemoryProperties);
|
||||
|
||||
EXPECT_FALSE(memoryManager->multiOsContextCapablePassed);
|
||||
EXPECT_FALSE(memoryManager->multiStorageResourcePassed);
|
||||
EXPECT_EQ(unifiedMemoryProperties.subdeviceBitfields.at(mockRootDeviceIndex), memoryManager->subDevicesBitfieldPassed);
|
||||
|
||||
svmManager->freeSVMAlloc(ptr);
|
||||
}
|
||||
|
||||
TEST_F(UnifiedMemoryManagerPropertiesTest, givenDeviceBitfieldWithSingleDeviceBitSetWhenMultiOsContextFlagTrueThenProperPropertiesArePassedToMemoryManager) {
|
||||
std::set<uint32_t> rootDeviceIndices{mockRootDeviceIndex};
|
||||
std::map<uint32_t, DeviceBitfield> deviceBitfields{{mockRootDeviceIndex, DeviceBitfield(0x1)}};
|
||||
SVMAllocsManager::UnifiedMemoryProperties unifiedMemoryProperties(InternalMemoryType::SHARED_UNIFIED_MEMORY, rootDeviceIndices, deviceBitfields);
|
||||
|
||||
svmManager->multiOsContextSupport = true;
|
||||
auto ptr = svmManager->createUnifiedAllocationWithDeviceStorage(10 * MemoryConstants::pageSize64k, {}, unifiedMemoryProperties);
|
||||
|
||||
EXPECT_FALSE(memoryManager->multiOsContextCapablePassed);
|
||||
EXPECT_FALSE(memoryManager->multiStorageResourcePassed);
|
||||
EXPECT_EQ(unifiedMemoryProperties.subdeviceBitfields.at(mockRootDeviceIndex), memoryManager->subDevicesBitfieldPassed);
|
||||
|
||||
svmManager->freeSVMAlloc(ptr);
|
||||
}
|
||||
|
||||
TEST_F(UnifiedMemoryManagerPropertiesTest,
|
||||
givenSvmManagerMultiOsContextSupportFlagTrueWhenRootDeviceIsSingleThenMultiStorageFlagFalse) {
|
||||
std::set<uint32_t> rootDeviceIndices{mockRootDeviceIndex};
|
||||
std::map<uint32_t, DeviceBitfield> deviceBitfields{{mockRootDeviceIndex, DeviceBitfield(0x1)}};
|
||||
SVMAllocsManager::UnifiedMemoryProperties unifiedMemoryProperties(InternalMemoryType::HOST_UNIFIED_MEMORY, rootDeviceIndices, deviceBitfields);
|
||||
|
||||
svmManager->multiOsContextSupport = true;
|
||||
auto ptr = svmManager->createHostUnifiedMemoryAllocation(MemoryConstants::pageSize64k, unifiedMemoryProperties);
|
||||
|
||||
EXPECT_FALSE(memoryManager->multiOsContextCapablePassed);
|
||||
EXPECT_FALSE(memoryManager->multiStorageResourcePassed);
|
||||
EXPECT_EQ(unifiedMemoryProperties.subdeviceBitfields.at(mockRootDeviceIndex), memoryManager->subDevicesBitfieldPassed);
|
||||
|
||||
svmManager->freeSVMAlloc(ptr);
|
||||
}
|
||||
|
||||
TEST_F(UnifiedMemoryManagerPropertiesTest,
|
||||
givenSvmManagerMultiOsContextSupportFlagFalseWhenRootDeviceIsMultiThenMultiStorageFlagFalse) {
|
||||
std::set<uint32_t> rootDeviceIndices{mockRootDeviceIndex};
|
||||
std::map<uint32_t, DeviceBitfield> deviceBitfields{{mockRootDeviceIndex, DeviceBitfield(0xF)}};
|
||||
SVMAllocsManager::UnifiedMemoryProperties unifiedMemoryProperties(InternalMemoryType::HOST_UNIFIED_MEMORY, rootDeviceIndices, deviceBitfields);
|
||||
|
||||
svmManager->multiOsContextSupport = false;
|
||||
auto ptr = svmManager->createHostUnifiedMemoryAllocation(MemoryConstants::pageSize64k, unifiedMemoryProperties);
|
||||
|
||||
EXPECT_FALSE(memoryManager->multiOsContextCapablePassed);
|
||||
EXPECT_FALSE(memoryManager->multiStorageResourcePassed);
|
||||
EXPECT_EQ(unifiedMemoryProperties.subdeviceBitfields.at(mockRootDeviceIndex), memoryManager->subDevicesBitfieldPassed);
|
||||
|
||||
svmManager->freeSVMAlloc(ptr);
|
||||
}
|
||||
|
||||
TEST_F(UnifiedMemoryManagerPropertiesTest,
|
||||
givenSvmManagerMultiOsContextSupportFlagTrueWhenRootDeviceIsMultiThenMultiStorageFlagTrue) {
|
||||
std::set<uint32_t> rootDeviceIndices{mockRootDeviceIndex};
|
||||
std::map<uint32_t, DeviceBitfield> deviceBitfields{{mockRootDeviceIndex, DeviceBitfield(0xF)}};
|
||||
SVMAllocsManager::UnifiedMemoryProperties unifiedMemoryProperties(InternalMemoryType::HOST_UNIFIED_MEMORY, rootDeviceIndices, deviceBitfields);
|
||||
|
||||
svmManager->multiOsContextSupport = true;
|
||||
auto ptr = svmManager->createHostUnifiedMemoryAllocation(MemoryConstants::pageSize64k, unifiedMemoryProperties);
|
||||
|
||||
EXPECT_FALSE(memoryManager->multiOsContextCapablePassed);
|
||||
EXPECT_TRUE(memoryManager->multiStorageResourcePassed);
|
||||
EXPECT_EQ(unifiedMemoryProperties.subdeviceBitfields.at(mockRootDeviceIndex), memoryManager->subDevicesBitfieldPassed);
|
||||
|
||||
svmManager->freeSVMAlloc(ptr);
|
||||
}
|
||||
|
||||
struct ShareableUnifiedMemoryManagerPropertiesTest : public ::testing::Test {
|
||||
void SetUp() override {
|
||||
executionEnvironment = platform()->peekExecutionEnvironment();
|
||||
@ -630,7 +748,7 @@ struct ShareableUnifiedMemoryManagerPropertiesTest : public ::testing::Test {
|
||||
GTEST_SKIP();
|
||||
}
|
||||
memoryManager = std::make_unique<MemoryManagerPropertiesCheck>(false, true, *executionEnvironment);
|
||||
svmManager = std::make_unique<MockSVMAllocsManager>(memoryManager.get());
|
||||
svmManager = std::make_unique<MockSVMAllocsManager>(memoryManager.get(), false);
|
||||
memoryManager->pageFaultManager.reset(new MockPageFaultManager);
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2017-2020 Intel Corporation
|
||||
* Copyright (C) 2017-2021 Intel Corporation
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
@ -18,6 +18,7 @@
|
||||
#include "opencl/test/unit_test/fixtures/cl_device_fixture.h"
|
||||
#include "opencl/test/unit_test/mocks/mock_cl_device.h"
|
||||
#include "opencl/test/unit_test/mocks/mock_kernel.h"
|
||||
#include "opencl/test/unit_test/mocks/mock_svm_manager.h"
|
||||
|
||||
#include "d3d_sharing_functions.h"
|
||||
|
||||
@ -103,7 +104,8 @@ void MockContext::initializeWithDevices(const ClDeviceVector &devices, bool noSp
|
||||
|
||||
this->devices = devices;
|
||||
memoryManager = devices[0]->getMemoryManager();
|
||||
svmAllocsManager = new SVMAllocsManager(memoryManager);
|
||||
svmAllocsManager = new MockSVMAllocsManager(memoryManager,
|
||||
false);
|
||||
|
||||
for (auto &rootDeviceIndex : rootDeviceIndices) {
|
||||
DeviceBitfield deviceBitfield{};
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2018-2020 Intel Corporation
|
||||
* Copyright (C) 2018-2021 Intel Corporation
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
@ -9,8 +9,8 @@
|
||||
#include "shared/source/memory_manager/unified_memory_manager.h"
|
||||
namespace NEO {
|
||||
struct MockSVMAllocsManager : SVMAllocsManager {
|
||||
|
||||
using SVMAllocsManager::memoryManager;
|
||||
using SVMAllocsManager::multiOsContextSupport;
|
||||
using SVMAllocsManager::SVMAllocs;
|
||||
using SVMAllocsManager::SVMAllocsManager;
|
||||
using SVMAllocsManager::svmMapOperations;
|
||||
|
@ -102,7 +102,8 @@ void SVMAllocsManager::makeInternalAllocationsResident(CommandStreamReceiver &co
|
||||
}
|
||||
}
|
||||
|
||||
SVMAllocsManager::SVMAllocsManager(MemoryManager *memoryManager) : memoryManager(memoryManager) {
|
||||
SVMAllocsManager::SVMAllocsManager(MemoryManager *memoryManager, bool multiOsContextSupport)
|
||||
: memoryManager(memoryManager), multiOsContextSupport(multiOsContextSupport) {
|
||||
}
|
||||
|
||||
void *SVMAllocsManager::createSVMAlloc(size_t size, const SvmAllocationProperties svmProperties,
|
||||
@ -135,7 +136,7 @@ void *SVMAllocsManager::createHostUnifiedMemoryAllocation(size_t size,
|
||||
alignedSize,
|
||||
allocationType,
|
||||
false,
|
||||
deviceBitfield.count() > 1,
|
||||
(deviceBitfield.count() > 1) && multiOsContextSupport,
|
||||
deviceBitfield};
|
||||
unifiedMemoryProperties.flags.shareable = memoryProperties.allocationFlags.flags.shareable;
|
||||
unifiedMemoryProperties.flags.isUSMHostAllocation = true;
|
||||
@ -178,7 +179,7 @@ void *SVMAllocsManager::createUnifiedMemoryAllocation(size_t size,
|
||||
alignedSize,
|
||||
allocationType,
|
||||
false,
|
||||
deviceBitfield.count() > 1,
|
||||
(deviceBitfield.count() > 1) && multiOsContextSupport,
|
||||
deviceBitfield};
|
||||
unifiedMemoryProperties.flags.shareable = memoryProperties.allocationFlags.flags.shareable;
|
||||
unifiedMemoryProperties.flags.isUSMDeviceAllocation = true;
|
||||
@ -390,7 +391,7 @@ void *SVMAllocsManager::createUnifiedAllocationWithDeviceStorage(size_t size, co
|
||||
alignedSize,
|
||||
GraphicsAllocation::AllocationType::SVM_GPU,
|
||||
false,
|
||||
subDevices.count() > 1,
|
||||
(subDevices.count() > 1) && multiOsContextSupport,
|
||||
subDevices};
|
||||
|
||||
gpuProperties.alignment = 2 * MemoryConstants::megaByte;
|
||||
|
@ -105,7 +105,7 @@ class SVMAllocsManager {
|
||||
const std::map<uint32_t, DeviceBitfield> &subdeviceBitfields;
|
||||
};
|
||||
|
||||
SVMAllocsManager(MemoryManager *memoryManager);
|
||||
SVMAllocsManager(MemoryManager *memoryManager, bool multiOsContextSupport);
|
||||
MOCKABLE_VIRTUAL ~SVMAllocsManager() = default;
|
||||
void *createSVMAlloc(size_t size,
|
||||
const SvmAllocationProperties svmProperties,
|
||||
@ -153,5 +153,6 @@ class SVMAllocsManager {
|
||||
MapOperationsTracker svmMapOperations;
|
||||
MemoryManager *memoryManager;
|
||||
SpinLock mtx;
|
||||
bool multiOsContextSupport;
|
||||
};
|
||||
} // namespace NEO
|
||||
|
@ -1590,7 +1590,7 @@ TEST(LinkerTests, GivenAllocationInLocalMemoryWhichRequiresBlitterWhenPatchingDa
|
||||
for (auto isLocalMemorySupported : ::testing::Bool()) {
|
||||
DebugManager.flags.EnableLocalMemory.set(isLocalMemorySupported);
|
||||
auto pDevice = std::unique_ptr<MockDevice>(MockDevice::createWithNewExecutionEnvironment<MockDevice>(&hwInfo));
|
||||
MockSVMAllocsManager svmAllocsManager(pDevice->getMemoryManager());
|
||||
MockSVMAllocsManager svmAllocsManager(pDevice->getMemoryManager(), false);
|
||||
|
||||
WhiteBox<NEO::LinkerInput> linkerInput;
|
||||
NEO::Linker linker(linkerInput);
|
||||
|
@ -407,7 +407,7 @@ TEST_F(PageFaultManagerTest, givenUnifiedMemoryAllocWhenSetAubWritableIsCalledTh
|
||||
|
||||
void *cmdQ = reinterpret_cast<void *>(0xFFFF);
|
||||
auto memoryManager = std::make_unique<MockMemoryManager>(executionEnvironment);
|
||||
auto unifiedMemoryManager = std::make_unique<SVMAllocsManager>(memoryManager.get());
|
||||
auto unifiedMemoryManager = std::make_unique<SVMAllocsManager>(memoryManager.get(), false);
|
||||
auto properties = SVMAllocsManager::UnifiedMemoryProperties(InternalMemoryType::SHARED_UNIFIED_MEMORY, rootDeviceIndices, deviceBitfields);
|
||||
void *alloc1 = unifiedMemoryManager->createSharedUnifiedMemoryAllocation(10, properties, cmdQ);
|
||||
|
||||
|
@ -26,7 +26,7 @@ TEST(AllocateGlobalSurfaceTest, GivenSvmAllocsManagerWhenGlobalsAreNotExportedTh
|
||||
auto &device = *(new MockDevice);
|
||||
REQUIRE_SVM_OR_SKIP(&device);
|
||||
MockClDevice clDevice{&device};
|
||||
MockSVMAllocsManager svmAllocsManager(device.getMemoryManager());
|
||||
MockSVMAllocsManager svmAllocsManager(device.getMemoryManager(), false);
|
||||
WhiteBox<LinkerInput> emptyLinkerInput;
|
||||
std::vector<uint8_t> initData;
|
||||
initData.resize(64, 7U);
|
||||
@ -70,7 +70,7 @@ TEST(AllocateGlobalSurfaceTest, GivenSvmAllocsManagerWhenGlobalsAreExportedThenM
|
||||
REQUIRE_SVM_OR_SKIP(&device);
|
||||
MockClDevice clDevice{&device};
|
||||
MockMemoryManager memoryManager;
|
||||
MockSVMAllocsManager svmAllocsManager(&memoryManager);
|
||||
MockSVMAllocsManager svmAllocsManager(&memoryManager, false);
|
||||
WhiteBox<LinkerInput> linkerInputExportGlobalVariables;
|
||||
WhiteBox<LinkerInput> linkerInputExportGlobalConstants;
|
||||
linkerInputExportGlobalVariables.traits.exportsGlobalVariables = true;
|
||||
@ -156,7 +156,7 @@ TEST(AllocateGlobalSurfaceTest, WhenGlobalsAreNotExportedAndAllocationFailsThenG
|
||||
auto memoryManager = std::make_unique<MockMemoryManager>(*clDevice.getExecutionEnvironment());
|
||||
memoryManager->failInAllocateWithSizeAndAlignment = true;
|
||||
clDevice.injectMemoryManager(memoryManager.release());
|
||||
MockSVMAllocsManager mockSvmAllocsManager(clDevice.getMemoryManager());
|
||||
MockSVMAllocsManager mockSvmAllocsManager(clDevice.getMemoryManager(), false);
|
||||
WhiteBox<LinkerInput> emptyLinkerInput;
|
||||
std::vector<uint8_t> initData;
|
||||
initData.resize(64, 7U);
|
||||
@ -191,7 +191,7 @@ TEST(AllocateGlobalSurfaceTest, WhenGlobalsAreExportedAndAllocationFailsThenGrac
|
||||
auto pDevice = new MockDevice{};
|
||||
MockClDevice clDevice{pDevice};
|
||||
MockMemoryManager memoryManager{*clDevice.getExecutionEnvironment()};
|
||||
MockSVMAllocsManager svmAllocsManager(&memoryManager);
|
||||
MockSVMAllocsManager svmAllocsManager(&memoryManager, false);
|
||||
memoryManager.failInAllocateWithSizeAndAlignment = true;
|
||||
WhiteBox<LinkerInput> linkerInputExportGlobalVariables;
|
||||
WhiteBox<LinkerInput> linkerInputExportGlobalConstants;
|
||||
@ -236,7 +236,7 @@ TEST(AllocateGlobalSurfaceTest, GivenAllocationInLocalMemoryWhichRequiresBlitter
|
||||
DebugManager.flags.EnableLocalMemory.set(isLocalMemorySupported);
|
||||
MockDevice device;
|
||||
device.getExecutionEnvironment()->rootDeviceEnvironments[0]->getMutableHardwareInfo()->capabilityTable.blitterOperationsSupported = true;
|
||||
MockSVMAllocsManager svmAllocsManager(device.getMemoryManager());
|
||||
MockSVMAllocsManager svmAllocsManager(device.getMemoryManager(), false);
|
||||
|
||||
auto pAllocation = allocateGlobalsSurface(&svmAllocsManager, device, initData.size(), true /* constant */,
|
||||
nullptr /* linker input */, initData.data());
|
||||
|
Reference in New Issue
Block a user