From fb43726cdcdfa8eaeded8e32262f0fd7c354e492 Mon Sep 17 00:00:00 2001 From: Maciej Dziuban Date: Mon, 8 Jun 2020 12:13:47 +0000 Subject: [PATCH] Enabling forcing fine grained SVM creation Change-Id: I0eb0af5e72f5502b788c6c8be39728bc6948c0bb Signed-off-by: Maciej Dziuban --- opencl/source/api/api.cpp | 14 ++++++++++---- .../test/unit_test/api/cl_svm_alloc_tests.inl | 18 ++++++++++++++++++ 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/opencl/source/api/api.cpp b/opencl/source/api/api.cpp index 73775f262d..81ba66c220 100644 --- a/opencl/source/api/api.cpp +++ b/opencl/source/api/api.cpp @@ -4143,10 +4143,16 @@ void *CL_API_CALL clSVMAlloc(cl_context context, TRACING_EXIT(clSVMAlloc, &pAlloc); return pAlloc; } - if (!hwInfo.capabilityTable.ftrSupportsCoherency && - (flags & (CL_MEM_SVM_FINE_GRAIN_BUFFER | CL_MEM_SVM_ATOMICS))) { - TRACING_EXIT(clSVMAlloc, &pAlloc); - return pAlloc; + + if (flags & CL_MEM_SVM_FINE_GRAIN_BUFFER) { + bool supportsFineGrained = hwInfo.capabilityTable.ftrSupportsCoherency; + if (DebugManager.flags.ForceFineGrainedSVMSupport.get() != -1) { + supportsFineGrained = !!DebugManager.flags.ForceFineGrainedSVMSupport.get(); + } + if (!supportsFineGrained) { + TRACING_EXIT(clSVMAlloc, &pAlloc); + return pAlloc; + } } pAlloc = pContext->getSVMAllocsManager()->createSVMAlloc(pDevice->getRootDeviceIndex(), size, MemObjHelper::getSvmAllocationProperties(flags), pDevice->getDeviceBitfield()); diff --git a/opencl/test/unit_test/api/cl_svm_alloc_tests.inl b/opencl/test/unit_test/api/cl_svm_alloc_tests.inl index f9e3319540..b6b6f4503c 100644 --- a/opencl/test/unit_test/api/cl_svm_alloc_tests.inl +++ b/opencl/test/unit_test/api/cl_svm_alloc_tests.inl @@ -214,6 +214,24 @@ TEST_F(clSVMAllocTests, GivenAlignmentTooLargeWhenAllocatingSvmThenSvmIsNotAlloc auto SVMPtr = clSVMAlloc(pContext, CL_MEM_READ_WRITE, 4096 /* Size */, 4096 /* alignment */); EXPECT_EQ(nullptr, SVMPtr); }; + +TEST_F(clSVMAllocTests, GivenForcedFineGrainedSvmWhenCreatingSvmAllocThenAllocationIsCreated) { + REQUIRE_SVM_OR_SKIP(pDevice); + DebugManagerStateRestore restore{}; + HardwareInfo *hwInfo = pDevice->getExecutionEnvironment()->rootDeviceEnvironments[testedRootDeviceIndex]->getMutableHardwareInfo(); + hwInfo->capabilityTable.ftrSvm = true; + hwInfo->capabilityTable.ftrSupportsCoherency = false; + + auto allocation = clSVMAlloc(pContext, CL_MEM_READ_WRITE | CL_MEM_SVM_FINE_GRAIN_BUFFER, 4096 /* Size */, 0 /* alignment */); + EXPECT_EQ(nullptr, allocation); + clSVMFree(pContext, allocation); + + DebugManager.flags.ForceFineGrainedSVMSupport.set(1); + allocation = clSVMAlloc(pContext, CL_MEM_READ_WRITE | CL_MEM_SVM_FINE_GRAIN_BUFFER, 4096 /* Size */, 0 /* alignment */); + EXPECT_NE(nullptr, allocation); + clSVMFree(pContext, allocation); +} + TEST(clSvmAllocTest, givenSubDeviceWhenCreatingSvmAllocThenProperDeviceBitfieldIsPassed) { REQUIRE_SVM_OR_SKIP(defaultHwInfo.get()); UltClDeviceFactory deviceFactory{1, 2};