mirror of
https://github.com/intel/compute-runtime.git
synced 2025-12-20 08:53:55 +08:00
feature: Set shared system USM madvise preferred location as prefetch region
Resolves: NEO-16482 Signed-off-by: Falkowski, John <john.falkowski@intel.com>
This commit is contained in:
committed by
Compute-Runtime-Automation
parent
20e4655499
commit
cfa007e551
@@ -650,6 +650,7 @@ EnableDeferBacking = 0
|
||||
ForceLowLatencyHint = -1
|
||||
EmitMemAdvisePriorToCopyForNonUsm = -1
|
||||
TreatNonUsmForTransfersAsSharedSystem = -1
|
||||
OverrideMadviseSharedSystemPrefetchRegion = -1
|
||||
SetMaxBVHLevels = -1
|
||||
GetSipBinaryFromExternalLib = -1
|
||||
LogUsmReuse = 0
|
||||
|
||||
@@ -6472,46 +6472,36 @@ HWTEST_TEMPLATED_F(DrmMemoryManagerTest, givenDrmMemoryManagerWhenSetMemPrefetch
|
||||
}
|
||||
|
||||
HWTEST_TEMPLATED_F(DrmMemoryManagerTest, givenPrefetchSharedSystemAllocIsCalledThenReturnTrue) {
|
||||
SubDeviceIdsVec subDeviceIds{0};
|
||||
class MyMockIoctlHelper : public MockIoctlHelper {
|
||||
public:
|
||||
using MockIoctlHelper::MockIoctlHelper;
|
||||
|
||||
bool setVmPrefetch(uint64_t start, uint64_t length, uint32_t region, uint32_t vmId) override {
|
||||
return true;
|
||||
}
|
||||
};
|
||||
auto mockIoctlHelper = new MyMockIoctlHelper(*mock);
|
||||
|
||||
auto &drm = static_cast<DrmMockCustom &>(memoryManager->getDrm(mockRootDeviceIndex));
|
||||
drm.ioctlHelper.reset(mockIoctlHelper);
|
||||
|
||||
auto ptr = malloc(1024);
|
||||
|
||||
EXPECT_TRUE(memoryManager->prefetchSharedSystemAlloc(ptr, 1024, subDeviceIds, rootDeviceIndex));
|
||||
void *ptr = malloc(1024);
|
||||
|
||||
auto subDeviceIds = NEO::SubDeviceIdsVec{0};
|
||||
EXPECT_TRUE(memoryManager->prefetchSharedSystemAlloc(ptr, 1024, subDeviceIds, mockRootDeviceIndex));
|
||||
free(ptr);
|
||||
}
|
||||
|
||||
HWTEST_TEMPLATED_F(DrmMemoryManagerTest, givenPrefetchSharedSystemAllocIsCalledThenReturnFalse) {
|
||||
SubDeviceIdsVec subDeviceIds{0};
|
||||
|
||||
class MyMockIoctlHelper : public MockIoctlHelper {
|
||||
public:
|
||||
using MockIoctlHelper::MockIoctlHelper;
|
||||
|
||||
bool setVmPrefetch(uint64_t start, uint64_t length, uint32_t region, uint32_t vmId) override {
|
||||
public:
|
||||
bool setVmSharedSystemMemPrefetch(uint64_t start, uint64_t length, uint32_t region, uint32_t vmId) override {
|
||||
setVmSharedSystemMemPrefetchCalled++;
|
||||
return false;
|
||||
}
|
||||
uint32_t setVmSharedSystemMemPrefetchCalled = 0;
|
||||
};
|
||||
auto mockIoctlHelper = new MyMockIoctlHelper(*mock);
|
||||
|
||||
auto &drm = static_cast<DrmMockCustom &>(memoryManager->getDrm(mockRootDeviceIndex));
|
||||
drm.ioctlHelper.reset(mockIoctlHelper);
|
||||
|
||||
auto ptr = malloc(1024);
|
||||
|
||||
EXPECT_TRUE(memoryManager->prefetchSharedSystemAlloc(ptr, 1024, subDeviceIds, rootDeviceIndex));
|
||||
void *ptr = malloc(1024);
|
||||
|
||||
auto subDeviceIds = NEO::SubDeviceIdsVec{0};
|
||||
EXPECT_FALSE(memoryManager->prefetchSharedSystemAlloc(ptr, 1024, subDeviceIds, mockRootDeviceIndex));
|
||||
EXPECT_EQ(1u, mockIoctlHelper->setVmSharedSystemMemPrefetchCalled);
|
||||
free(ptr);
|
||||
}
|
||||
|
||||
|
||||
@@ -3044,6 +3044,132 @@ TEST_F(IoctlHelperXeTest, givenIoctlHelperXeWhenCallingSetVmPrefetchThenVmBindIs
|
||||
EXPECT_EQ(drm->vmBindInputs[0].bind.prefetch_mem_region_instance, targetMemoryRegion.memoryInstance);
|
||||
}
|
||||
|
||||
struct DrmMockXePrefetchFail : public DrmMockXe {
|
||||
static auto create(RootDeviceEnvironment &rootDeviceEnvironment) {
|
||||
auto drm = std::unique_ptr<DrmMockXePrefetchFail>(new DrmMockXePrefetchFail{rootDeviceEnvironment});
|
||||
drm->initInstance();
|
||||
return drm;
|
||||
}
|
||||
|
||||
int ioctl(DrmIoctl request, void *arg) override {
|
||||
if (request == DrmIoctl::gemVmBind) {
|
||||
return -1;
|
||||
}
|
||||
return DrmMockXe::ioctl(request, arg);
|
||||
};
|
||||
|
||||
int gemVmAdviseReturn = 0;
|
||||
StackVec<drm_xe_madvise, 4> vmAdviseInputs;
|
||||
|
||||
protected:
|
||||
// Don't call directly, use the create() function
|
||||
DrmMockXePrefetchFail(RootDeviceEnvironment &rootDeviceEnvironment) : DrmMockXe(rootDeviceEnvironment) {}
|
||||
};
|
||||
|
||||
TEST_F(IoctlHelperXeTest, givenIoctlHelperXeWhenCallingSetVmSharedSystemMemPrefetchThenFailureIsReturned) {
|
||||
|
||||
auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
|
||||
auto drm = DrmMockXePrefetchFail::create(*executionEnvironment->rootDeviceEnvironments[0]);
|
||||
auto xeIoctlHelper = static_cast<MockIoctlHelperXe *>(drm->getIoctlHelper());
|
||||
|
||||
uint64_t start = 0x12u;
|
||||
uint64_t length = 0x34u;
|
||||
uint32_t subDeviceId = 0u;
|
||||
uint32_t vmId = 1u;
|
||||
|
||||
int memoryClassDevice = static_cast<int>(DrmParam::memoryClassDevice);
|
||||
uint32_t region = (memoryClassDevice << 16u) | subDeviceId;
|
||||
|
||||
EXPECT_FALSE(xeIoctlHelper->setVmSharedSystemMemPrefetch(start, length, region, vmId));
|
||||
}
|
||||
|
||||
TEST_F(IoctlHelperXeTest, givenIoctlHelperXeWhenCallingSetVmSharedSystemMemPrefetchThenMemRegionInstanceIsMemAdvisePreferredLocation) {
|
||||
DebugManagerStateRestore restorer;
|
||||
debugManager.flags.EnableLocalMemory.set(1);
|
||||
|
||||
auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
|
||||
auto drm = DrmMockXe::create(*executionEnvironment->rootDeviceEnvironments[0]);
|
||||
auto xeIoctlHelper = static_cast<MockIoctlHelperXe *>(drm->getIoctlHelper());
|
||||
xeIoctlHelper->initialize();
|
||||
|
||||
uint64_t start = 0x12u;
|
||||
uint64_t length = 0x34u;
|
||||
uint32_t subDeviceId = 0u;
|
||||
uint32_t vmId = 1u;
|
||||
|
||||
int memoryClassDevice = static_cast<int>(DrmParam::memoryClassDevice);
|
||||
uint32_t region = (memoryClassDevice << 16u) | subDeviceId;
|
||||
|
||||
EXPECT_TRUE(xeIoctlHelper->setVmSharedSystemMemPrefetch(start, length, region, vmId));
|
||||
EXPECT_EQ(1u, drm->vmBindInputs.size());
|
||||
|
||||
EXPECT_EQ(drm->vmBindInputs[0].vm_id, vmId);
|
||||
EXPECT_EQ(drm->vmBindInputs[0].bind.addr, alignDown(start, MemoryConstants::pageSize));
|
||||
EXPECT_EQ(drm->vmBindInputs[0].bind.range, alignSizeWholePage(reinterpret_cast<void *>(start), length));
|
||||
EXPECT_EQ(drm->vmBindInputs[0].bind.prefetch_mem_region_instance, ((uint64_t)DRM_XE_CONSULT_MEM_ADVISE_PREF_LOC) & 0xffffffff);
|
||||
}
|
||||
|
||||
TEST_F(IoctlHelperXeTest, givenIoctlHelperXeWhenCallingSetVmSharedSystemMemPrefetchWithDebugVarThenMemRegionInstanceIsDeviceLocal) {
|
||||
DebugManagerStateRestore restorer;
|
||||
debugManager.flags.EnableLocalMemory.set(1);
|
||||
debugManager.flags.OverrideMadviseSharedSystemPrefetchRegion.set(1);
|
||||
|
||||
auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
|
||||
auto drm = DrmMockXe::create(*executionEnvironment->rootDeviceEnvironments[0]);
|
||||
auto xeIoctlHelper = static_cast<MockIoctlHelperXe *>(drm->getIoctlHelper());
|
||||
xeIoctlHelper->initialize();
|
||||
|
||||
uint64_t start = 0x12u;
|
||||
uint64_t length = 0x34u;
|
||||
uint32_t subDeviceId = 0u;
|
||||
uint32_t vmId = 1u;
|
||||
|
||||
auto memoryInfo = xeIoctlHelper->createMemoryInfo();
|
||||
ASSERT_NE(nullptr, memoryInfo);
|
||||
MemoryClassInstance targetMemoryRegion = memoryInfo->getLocalMemoryRegions()[subDeviceId].region;
|
||||
drm->memoryInfo.reset(memoryInfo.release());
|
||||
int memoryClassDevice = static_cast<int>(DrmParam::memoryClassDevice);
|
||||
uint32_t region = (memoryClassDevice << 16u) | subDeviceId;
|
||||
|
||||
EXPECT_TRUE(xeIoctlHelper->setVmSharedSystemMemPrefetch(start, length, region, vmId));
|
||||
EXPECT_EQ(1u, drm->vmBindInputs.size());
|
||||
|
||||
EXPECT_EQ(drm->vmBindInputs[0].vm_id, vmId);
|
||||
EXPECT_EQ(drm->vmBindInputs[0].bind.addr, alignDown(start, MemoryConstants::pageSize));
|
||||
EXPECT_EQ(drm->vmBindInputs[0].bind.range, alignSizeWholePage(reinterpret_cast<void *>(start), length));
|
||||
EXPECT_EQ(drm->vmBindInputs[0].bind.prefetch_mem_region_instance, targetMemoryRegion.memoryInstance);
|
||||
}
|
||||
|
||||
TEST_F(IoctlHelperXeTest, givenIoctlHelperXeWhenCallingSetVmSharedSystemMemPrefetchWithDebugVarThenMemRegionInstanceIsSystem) {
|
||||
DebugManagerStateRestore restorer;
|
||||
debugManager.flags.EnableLocalMemory.set(1);
|
||||
debugManager.flags.OverrideMadviseSharedSystemPrefetchRegion.set(0);
|
||||
|
||||
auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
|
||||
auto drm = DrmMockXe::create(*executionEnvironment->rootDeviceEnvironments[0]);
|
||||
auto xeIoctlHelper = static_cast<MockIoctlHelperXe *>(drm->getIoctlHelper());
|
||||
xeIoctlHelper->initialize();
|
||||
|
||||
uint64_t start = 0x12u;
|
||||
uint64_t length = 0x34u;
|
||||
uint32_t subDeviceId = 0u;
|
||||
uint32_t vmId = 1u;
|
||||
|
||||
auto memoryInfo = xeIoctlHelper->createMemoryInfo();
|
||||
ASSERT_NE(nullptr, memoryInfo);
|
||||
drm->memoryInfo.reset(memoryInfo.release());
|
||||
int memoryClassDevice = static_cast<int>(DrmParam::memoryClassDevice);
|
||||
uint32_t region = (memoryClassDevice << 16u) | subDeviceId;
|
||||
|
||||
EXPECT_TRUE(xeIoctlHelper->setVmSharedSystemMemPrefetch(start, length, region, vmId));
|
||||
EXPECT_EQ(1u, drm->vmBindInputs.size());
|
||||
|
||||
EXPECT_EQ(drm->vmBindInputs[0].vm_id, vmId);
|
||||
EXPECT_EQ(drm->vmBindInputs[0].bind.addr, alignDown(start, MemoryConstants::pageSize));
|
||||
EXPECT_EQ(drm->vmBindInputs[0].bind.range, alignSizeWholePage(reinterpret_cast<void *>(start), length));
|
||||
EXPECT_EQ(drm->vmBindInputs[0].bind.prefetch_mem_region_instance, 0u);
|
||||
}
|
||||
|
||||
TEST_F(IoctlHelperXeTest, givenIoctlHelperXeWhenCallingSetVmPrefetchOnSecondTileThenVmBindIsCalled) {
|
||||
DebugManagerStateRestore restorer;
|
||||
debugManager.flags.EnableLocalMemory.set(1);
|
||||
|
||||
Reference in New Issue
Block a user