mirror of
https://github.com/intel/compute-runtime.git
synced 2025-09-15 13:01:45 +08:00
Dont create multiple page table managers within single root device
Resolves: NEO-4090 Change-Id: I148b9a5a2755edbcd15ead5f4a0d5d799ee815e1 Signed-off-by: Mateusz Jablonski <mateusz.jablonski@intel.com>
This commit is contained in:

committed by
Jablonski, Mateusz

parent
b5dd3abf85
commit
14c013f53b
@ -8,9 +8,10 @@
|
||||
#include "runtime/command_stream/command_stream_receiver.h"
|
||||
|
||||
#include "core/command_stream/preemption.h"
|
||||
#include "core/execution_environment/root_device_environment.h"
|
||||
#include "core/helpers/cache_policy.h"
|
||||
#include "core/helpers/hw_helper.h"
|
||||
#include "core/helpers/string.h"
|
||||
#include "runtime/aub_mem_dump/aub_services.h"
|
||||
#include "runtime/built_ins/built_ins.h"
|
||||
#include "runtime/command_stream/experimental_command_buffer.h"
|
||||
#include "runtime/command_stream/scratch_space_controller.h"
|
||||
@ -445,9 +446,22 @@ TagAllocator<TimestampPacketStorage> *CommandStreamReceiver::getTimestampPacketA
|
||||
cl_int CommandStreamReceiver::expectMemory(const void *gfxAddress, const void *srcAddress,
|
||||
size_t length, uint32_t compareOperation) {
|
||||
auto isMemoryEqual = (memcmp(gfxAddress, srcAddress, length) == 0);
|
||||
auto isEqualMemoryExpected = (compareOperation == CmdServicesMemTraceMemoryCompare::CompareOperationValues::CompareEqual);
|
||||
auto isEqualMemoryExpected = (compareOperation == AubMemDump::CmdServicesMemTraceMemoryCompare::CompareOperationValues::CompareEqual);
|
||||
|
||||
return (isMemoryEqual == isEqualMemoryExpected) ? CL_SUCCESS : CL_INVALID_VALUE;
|
||||
}
|
||||
|
||||
bool CommandStreamReceiver::needsPageTableManager(aub_stream::EngineType engineType) const {
|
||||
auto hwInfo = executionEnvironment.getHardwareInfo();
|
||||
auto defaultEngineType = getChosenEngineType(*hwInfo);
|
||||
if (engineType != defaultEngineType) {
|
||||
return false;
|
||||
}
|
||||
auto rootDeviceEnvironment = executionEnvironment.rootDeviceEnvironments[rootDeviceIndex].get();
|
||||
if (rootDeviceEnvironment->pageTableManager.get() != nullptr) {
|
||||
return false;
|
||||
}
|
||||
return HwHelper::get(hwInfo->platform.eRenderCoreFamily).isPageTableManagerSupported(*hwInfo);
|
||||
}
|
||||
|
||||
} // namespace NEO
|
||||
|
@ -87,6 +87,7 @@ class CommandStreamReceiver {
|
||||
ResidencyContainer &getEvictionAllocations();
|
||||
|
||||
virtual GmmPageTableMngr *createPageTableManager() { return nullptr; }
|
||||
bool needsPageTableManager(aub_stream::EngineType engineType) const;
|
||||
|
||||
void waitForTaskCountAndCleanAllocationList(uint32_t requiredTaskCount, uint32_t allocationUsage);
|
||||
MOCKABLE_VIRTUAL void waitForTaskCountAndCleanTemporaryAllocationList(uint32_t requiredTaskCount);
|
||||
|
@ -147,7 +147,7 @@ bool Device::createEngine(uint32_t deviceCsrIndex, aub_stream::EngineType engine
|
||||
if (!commandStreamReceiver) {
|
||||
return false;
|
||||
}
|
||||
if (HwHelper::get(hwInfo.platform.eRenderCoreFamily).isPageTableManagerSupported(hwInfo)) {
|
||||
if (commandStreamReceiver->needsPageTableManager(engineType)) {
|
||||
commandStreamReceiver->createPageTableManager();
|
||||
}
|
||||
|
||||
|
@ -8,11 +8,12 @@
|
||||
#include "core/command_stream/linear_stream.h"
|
||||
#include "core/command_stream/preemption.h"
|
||||
#include "core/helpers/cache_policy.h"
|
||||
#include "core/helpers/hw_helper.h"
|
||||
#include "core/memory_manager/graphics_allocation.h"
|
||||
#include "core/unit_tests/helpers/debug_manager_state_restore.h"
|
||||
#include "runtime/aub_mem_dump/aub_services.h"
|
||||
#include "runtime/command_stream/command_stream_receiver.h"
|
||||
#include "runtime/command_stream/scratch_space_controller.h"
|
||||
#include "runtime/gmm_helper/page_table_mngr.h"
|
||||
#include "runtime/helpers/timestamp_packet.h"
|
||||
#include "runtime/mem_obj/buffer.h"
|
||||
#include "runtime/memory_manager/internal_allocation_storage.h"
|
||||
@ -388,8 +389,8 @@ TEST(CommandStreamReceiverSimpleTest, givenVariousDataSetsWhenVerifyingMemoryThe
|
||||
uint8_t setB1[setSize] = {40, 15, 3, 11, 17, 4};
|
||||
uint8_t setB2[setSize] = {40, 15, 3, 11, 17, 4};
|
||||
|
||||
constexpr auto compareEqual = CmdServicesMemTraceMemoryCompare::CompareOperationValues::CompareEqual;
|
||||
constexpr auto compareNotEqual = CmdServicesMemTraceMemoryCompare::CompareOperationValues::CompareNotEqual;
|
||||
constexpr auto compareEqual = AubMemDump::CmdServicesMemTraceMemoryCompare::CompareOperationValues::CompareEqual;
|
||||
constexpr auto compareNotEqual = AubMemDump::CmdServicesMemTraceMemoryCompare::CompareOperationValues::CompareNotEqual;
|
||||
|
||||
EXPECT_EQ(CL_SUCCESS, csr.expectMemory(setA1, setA2, setSize, compareEqual));
|
||||
EXPECT_EQ(CL_SUCCESS, csr.expectMemory(setB1, setB2, setSize, compareEqual));
|
||||
@ -747,3 +748,41 @@ TEST_F(CommandStreamReceiverMultiRootDeviceTest, commandStreamGraphicsAllocation
|
||||
ASSERT_NE(nullptr, surface.getAllocation());
|
||||
EXPECT_EQ(expectedRootDeviceIndex, surface.getAllocation()->getRootDeviceIndex());
|
||||
}
|
||||
|
||||
using CommandStreamReceiverPageTableManagerTest = ::testing::Test;
|
||||
TEST_F(CommandStreamReceiverPageTableManagerTest, givenNonDefaultEngineTypeWhenNeedsPageTableManagerIsCalledThenFalseIsReturned) {
|
||||
MockExecutionEnvironment executionEnvironment;
|
||||
executionEnvironment.initializeMemoryManager();
|
||||
MockCommandStreamReceiver commandStreamReceiver(executionEnvironment, 0u);
|
||||
auto hwInfo = executionEnvironment.getHardwareInfo();
|
||||
auto defaultEngineType = getChosenEngineType(*hwInfo);
|
||||
auto engineType = aub_stream::EngineType::ENGINE_BCS;
|
||||
EXPECT_NE(defaultEngineType, engineType);
|
||||
EXPECT_EQ(nullptr, executionEnvironment.rootDeviceEnvironments[0]->pageTableManager.get());
|
||||
EXPECT_FALSE(commandStreamReceiver.needsPageTableManager(engineType));
|
||||
}
|
||||
TEST_F(CommandStreamReceiverPageTableManagerTest, givenDefaultEngineTypeAndExistingPageTableManagerWhenNeedsPageTableManagerIsCalledThenFalseIsReturned) {
|
||||
MockExecutionEnvironment executionEnvironment;
|
||||
executionEnvironment.initializeMemoryManager();
|
||||
MockCommandStreamReceiver commandStreamReceiver(executionEnvironment, 0u);
|
||||
auto hwInfo = executionEnvironment.getHardwareInfo();
|
||||
auto defaultEngineType = getChosenEngineType(*hwInfo);
|
||||
|
||||
GmmPageTableMngr *dummyPageTableManager = reinterpret_cast<GmmPageTableMngr *>(0x1234);
|
||||
|
||||
executionEnvironment.rootDeviceEnvironments[0]->pageTableManager.reset(dummyPageTableManager);
|
||||
EXPECT_FALSE(commandStreamReceiver.needsPageTableManager(defaultEngineType));
|
||||
executionEnvironment.rootDeviceEnvironments[0]->pageTableManager.release();
|
||||
}
|
||||
|
||||
TEST_F(CommandStreamReceiverPageTableManagerTest, givenDefaultEngineTypeAndNonExisitingPageTableManagerWhenNeedsPageTableManagerIsCalledThenSupportOfPageTableManagerIsReturned) {
|
||||
MockExecutionEnvironment executionEnvironment;
|
||||
executionEnvironment.initializeMemoryManager();
|
||||
MockCommandStreamReceiver commandStreamReceiver(executionEnvironment, 0u);
|
||||
auto hwInfo = executionEnvironment.getHardwareInfo();
|
||||
auto defaultEngineType = getChosenEngineType(*hwInfo);
|
||||
bool supportsPageTableManager = HwHelper::get(hwInfo->platform.eRenderCoreFamily).isPageTableManagerSupported(*hwInfo);
|
||||
EXPECT_EQ(nullptr, executionEnvironment.rootDeviceEnvironments[0]->pageTableManager.get());
|
||||
|
||||
EXPECT_EQ(supportsPageTableManager, commandStreamReceiver.needsPageTableManager(defaultEngineType));
|
||||
}
|
@ -262,16 +262,17 @@ TEST(DeviceCreation, givenDeviceWhenCheckingEnginesCountThenNumberGreaterThanZer
|
||||
|
||||
using DeviceHwTest = ::testing::Test;
|
||||
|
||||
HWTEST_F(DeviceHwTest, givenHwHelperInputWhenInitializingCsrThenCreatePageTableManagerIfAllowed) {
|
||||
HWTEST_F(DeviceHwTest, givenHwHelperInputWhenInitializingCsrThenCreatePageTableManagerIfNeeded) {
|
||||
HardwareInfo localHwInfo = *platformDevices[0];
|
||||
localHwInfo.capabilityTable.ftrRenderCompressedBuffers = false;
|
||||
localHwInfo.capabilityTable.ftrRenderCompressedImages = false;
|
||||
|
||||
ExecutionEnvironment executionEnvironment;
|
||||
executionEnvironment.prepareRootDeviceEnvironments(1);
|
||||
executionEnvironment.prepareRootDeviceEnvironments(3);
|
||||
executionEnvironment.incRefInternal();
|
||||
executionEnvironment.initializeMemoryManager();
|
||||
executionEnvironment.setHwInfo(&localHwInfo);
|
||||
auto defaultEngineType = getChosenEngineType(localHwInfo);
|
||||
std::unique_ptr<MockDevice> device;
|
||||
device.reset(MockDevice::createWithExecutionEnvironment<MockDevice>(&localHwInfo, &executionEnvironment, 0));
|
||||
auto &csr0 = device->getUltCommandStreamReceiver<FamilyType>();
|
||||
@ -280,13 +281,13 @@ HWTEST_F(DeviceHwTest, givenHwHelperInputWhenInitializingCsrThenCreatePageTableM
|
||||
auto hwInfo = executionEnvironment.getMutableHardwareInfo();
|
||||
hwInfo->capabilityTable.ftrRenderCompressedBuffers = true;
|
||||
hwInfo->capabilityTable.ftrRenderCompressedImages = false;
|
||||
device.reset(MockDevice::createWithExecutionEnvironment<MockDevice>(&localHwInfo, &executionEnvironment, 0));
|
||||
device.reset(MockDevice::createWithExecutionEnvironment<MockDevice>(&localHwInfo, &executionEnvironment, 1));
|
||||
auto &csr1 = device->getUltCommandStreamReceiver<FamilyType>();
|
||||
EXPECT_EQ(UnitTestHelper<FamilyType>::isPageTableManagerSupported(*hwInfo), csr1.createPageTableManagerCalled);
|
||||
EXPECT_EQ(csr1.needsPageTableManager(defaultEngineType), csr1.createPageTableManagerCalled);
|
||||
|
||||
hwInfo->capabilityTable.ftrRenderCompressedBuffers = false;
|
||||
hwInfo->capabilityTable.ftrRenderCompressedImages = true;
|
||||
device.reset(MockDevice::createWithExecutionEnvironment<MockDevice>(&localHwInfo, &executionEnvironment, 0));
|
||||
device.reset(MockDevice::createWithExecutionEnvironment<MockDevice>(&localHwInfo, &executionEnvironment, 2));
|
||||
auto &csr2 = device->getUltCommandStreamReceiver<FamilyType>();
|
||||
EXPECT_EQ(UnitTestHelper<FamilyType>::isPageTableManagerSupported(*hwInfo), csr2.createPageTableManagerCalled);
|
||||
EXPECT_EQ(csr2.needsPageTableManager(defaultEngineType), csr2.createPageTableManagerCalled);
|
||||
}
|
||||
|
Reference in New Issue
Block a user