diff --git a/opencl/source/api/api.cpp b/opencl/source/api/api.cpp index 5e35de7630..323c795af7 100644 --- a/opencl/source/api/api.cpp +++ b/opencl/source/api/api.cpp @@ -5191,11 +5191,13 @@ cl_int CL_API_CALL clSetKernelArgSVMPointer(cl_kernel kernel, if (argValue != nullptr) { auto svmData = svmManager->getSVMAlloc(argValue); if (svmData == nullptr) { - for (const auto &pDevice : multiDeviceKernel->getDevices()) { - if ((pDevice->getHardwareInfo().capabilityTable.sharedSystemMemCapabilities == 0) || (debugManager.flags.EnableSharedSystemUsmSupport.get() == 0)) { - retVal = CL_INVALID_ARG_VALUE; - TRACING_EXIT(ClSetKernelArgSvmPointer, &retVal); - return retVal; + if (debugManager.flags.DetectIncorrectPointersOnSetArgCalls.get() == 1) { + for (const auto &pDevice : multiDeviceKernel->getDevices()) { + if ((pDevice->getHardwareInfo().capabilityTable.sharedSystemMemCapabilities == 0) || (debugManager.flags.EnableSharedSystemUsmSupport.get() == 0)) { + retVal = CL_INVALID_ARG_VALUE; + TRACING_EXIT(ClSetKernelArgSvmPointer, &retVal); + return retVal; + } } } } else { diff --git a/opencl/test/unit_test/api/cl_get_platform_info_tests.inl b/opencl/test/unit_test/api/cl_get_platform_info_tests.inl index 1bf1f1d31e..96178b0c75 100644 --- a/opencl/test/unit_test/api/cl_get_platform_info_tests.inl +++ b/opencl/test/unit_test/api/cl_get_platform_info_tests.inl @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2024 Intel Corporation + * Copyright (C) 2018-2025 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -226,6 +226,8 @@ TEST_F(ClGetPlatformInfoTests, WhenCheckingPlatformExtensionsWithVersionThenThey for (size_t i = 0; i < extensionsCount; i++) { if (strcmp(platformExtensionsWithVersion[i].name, "cl_khr_integer_dot_product") == 0) { EXPECT_EQ(CL_MAKE_VERSION(2u, 0, 0), platformExtensionsWithVersion[i].version); + } else if (strcmp(platformExtensionsWithVersion[i].name, "cl_intel_unified_shared_memory") == 0) { + EXPECT_EQ(CL_MAKE_VERSION(1u, 1u, 0), platformExtensionsWithVersion[i].version); } else if (strcmp(platformExtensionsWithVersion[i].name, "cl_khr_external_memory") == 0) { EXPECT_EQ(CL_MAKE_VERSION(0, 9u, 1u), platformExtensionsWithVersion[i].version); } else { diff --git a/opencl/test/unit_test/api/cl_set_kernel_arg_svm_pointer_tests.inl b/opencl/test/unit_test/api/cl_set_kernel_arg_svm_pointer_tests.inl index ec2c7937d0..4444082178 100644 --- a/opencl/test/unit_test/api/cl_set_kernel_arg_svm_pointer_tests.inl +++ b/opencl/test/unit_test/api/cl_set_kernel_arg_svm_pointer_tests.inl @@ -91,18 +91,70 @@ TEST_F(clSetKernelArgSVMPointerTests, GivenLocalAddressAndNullArgValueWhenSettin EXPECT_EQ(CL_INVALID_ARG_VALUE, retVal); } -TEST_F(clSetKernelArgSVMPointerTests, GivenInvalidArgValueWhenSettingKernelArgThenInvalidArgValueErrorIsReturned) { +TEST_F(clSetKernelArgSVMPointerTests, GivenInvalidArgValueWhenSettingKernelArgAndDebugVarSetThenInvalidArgValueErrorIsReturned) { pDevice->deviceInfo.sharedSystemMemCapabilities = 0u; pDevice->getRootDeviceEnvironment().getMutableHardwareInfo()->capabilityTable.sharedSystemMemCapabilities = 0; void *ptrHost = malloc(256); EXPECT_NE(nullptr, ptrHost); + DebugManagerStateRestore restore; + debugManager.flags.DetectIncorrectPointersOnSetArgCalls.set(1); + + cl_int retVal = clSetKernelArgSVMPointer( + pMockMultiDeviceKernel, // cl_kernel kernel + 0, // cl_uint arg_index + ptrHost // const void *arg_value + ); + EXPECT_EQ(CL_INVALID_ARG_VALUE, retVal); + + pDevice->deviceInfo.sharedSystemMemCapabilities = 0xF; + pDevice->getRootDeviceEnvironment().getMutableHardwareInfo()->capabilityTable.sharedSystemMemCapabilities = 0xF; + debugManager.flags.EnableSharedSystemUsmSupport.set(0); + + retVal = clSetKernelArgSVMPointer( + pMockMultiDeviceKernel, // cl_kernel kernel + 0, // cl_uint arg_index + ptrHost // const void *arg_value + ); + EXPECT_EQ(CL_INVALID_ARG_VALUE, retVal); + + free(ptrHost); +} + +TEST_F(clSetKernelArgSVMPointerTests, GivenInvalidArgValueWhenSettingKernelArgAndDebugVarNotSetThenSuccessIsReturned) { + pDevice->deviceInfo.sharedSystemMemCapabilities = 0u; + pDevice->getRootDeviceEnvironment().getMutableHardwareInfo()->capabilityTable.sharedSystemMemCapabilities = 0; + void *ptrHost = malloc(256); + EXPECT_NE(nullptr, ptrHost); + + DebugManagerStateRestore restore; + debugManager.flags.DetectIncorrectPointersOnSetArgCalls.set(-1); + auto retVal = clSetKernelArgSVMPointer( pMockMultiDeviceKernel, // cl_kernel kernel 0, // cl_uint arg_index ptrHost // const void *arg_value ); - EXPECT_EQ(CL_INVALID_ARG_VALUE, retVal); + EXPECT_EQ(CL_SUCCESS, retVal); + + free(ptrHost); +} + +TEST_F(clSetKernelArgSVMPointerTests, GivenInvalidArgValueWhenSettingKernelArgAndDebugVarSetAndSharedSystemCapabilitesNonZeroThenSuccessIsReturned) { + pDevice->deviceInfo.sharedSystemMemCapabilities = 0xF; + pDevice->getRootDeviceEnvironment().getMutableHardwareInfo()->capabilityTable.sharedSystemMemCapabilities = 0xF; + void *ptrHost = malloc(256); + EXPECT_NE(nullptr, ptrHost); + + DebugManagerStateRestore restore; + debugManager.flags.DetectIncorrectPointersOnSetArgCalls.set(1); + + auto retVal = clSetKernelArgSVMPointer( + pMockMultiDeviceKernel, // cl_kernel kernel + 0, // cl_uint arg_index + ptrHost // const void *arg_value + ); + EXPECT_EQ(CL_SUCCESS, retVal); free(ptrHost); } @@ -173,10 +225,13 @@ TEST_F(clSetKernelArgSVMPointerTests, GivenSvmAndPointerWithOffsetWhenSettingKer } } -TEST_F(clSetKernelArgSVMPointerTests, GivenSvmAndPointerWithInvalidOffsetWhenSettingKernelArgThenInvalidArgValueErrorIsReturned) { +TEST_F(clSetKernelArgSVMPointerTests, GivenSvmAndPointerWithInvalidOffsetWhenSettingKernelArgAndDebugVarSetThenInvalidArgValueErrorIsReturned) { pDevice->deviceInfo.sharedSystemMemCapabilities = 0u; pDevice->getRootDeviceEnvironment().getMutableHardwareInfo()->capabilityTable.sharedSystemMemCapabilities = 0; const ClDeviceInfo &devInfo = pDevice->getDeviceInfo(); + DebugManagerStateRestore restore; + debugManager.flags.DetectIncorrectPointersOnSetArgCalls.set(1); + if (devInfo.svmCapabilities != 0) { void *ptrSvm = clSVMAlloc(pContext, CL_MEM_READ_WRITE, 256, 4); auto svmData = pContext->getSVMAllocsManager()->getSVMAlloc(ptrSvm); @@ -197,6 +252,33 @@ TEST_F(clSetKernelArgSVMPointerTests, GivenSvmAndPointerWithInvalidOffsetWhenSet } } +TEST_F(clSetKernelArgSVMPointerTests, GivenSvmAndPointerWithInvalidOffsetWhenSettingKernelArgAndDebugVarNotSetThenSuccessIsReturned) { + pDevice->deviceInfo.sharedSystemMemCapabilities = 0u; + pDevice->getRootDeviceEnvironment().getMutableHardwareInfo()->capabilityTable.sharedSystemMemCapabilities = 0; + const ClDeviceInfo &devInfo = pDevice->getDeviceInfo(); + DebugManagerStateRestore restore; + debugManager.flags.DetectIncorrectPointersOnSetArgCalls.set(-1); + + if (devInfo.svmCapabilities != 0) { + void *ptrSvm = clSVMAlloc(pContext, CL_MEM_READ_WRITE, 256, 4); + auto svmData = pContext->getSVMAllocsManager()->getSVMAlloc(ptrSvm); + ASSERT_NE(nullptr, svmData); + auto svmAlloc = svmData->gpuAllocations.getGraphicsAllocation(pContext->getDevice(0)->getRootDeviceIndex()); + EXPECT_NE(nullptr, svmAlloc); + + size_t offset = svmAlloc->getUnderlyingBufferSize() + 1; + + auto retVal = clSetKernelArgSVMPointer( + pMockMultiDeviceKernel, // cl_kernel kernel + 0, // cl_uint arg_index + (char *)ptrSvm + offset // const void *arg_value + ); + EXPECT_EQ(CL_SUCCESS, retVal); + + clSVMFree(pContext, ptrSvm); + } +} + TEST_F(clSetKernelArgSVMPointerTests, givenSvmAndValidArgValueWhenSettingSameKernelArgThenSetArgSvmAllocCalledOnlyWhenNeeded) { const ClDeviceInfo &devInfo = pDevice->getDeviceInfo(); if (devInfo.svmCapabilities != 0) { diff --git a/opencl/test/unit_test/device/device_caps_tests.cpp b/opencl/test/unit_test/device/device_caps_tests.cpp index edd0582c7d..83d4f737a7 100644 --- a/opencl/test/unit_test/device/device_caps_tests.cpp +++ b/opencl/test/unit_test/device/device_caps_tests.cpp @@ -857,6 +857,8 @@ TEST_F(DeviceGetCapsTest, givenDefaultDeviceWhenQueriedForExtensionsWithVersionT for (auto extensionWithVersion : pClDevice->getDeviceInfo().extensionsWithVersion) { if (strcmp(extensionWithVersion.name, "cl_khr_integer_dot_product") == 0) { EXPECT_EQ(CL_MAKE_VERSION(2u, 0, 0), extensionWithVersion.version); + } else if (strcmp(extensionWithVersion.name, "cl_intel_unified_shared_memory") == 0) { + EXPECT_EQ(CL_MAKE_VERSION(1u, 1u, 0), extensionWithVersion.version); } else if (strcmp(extensionWithVersion.name, "cl_khr_external_memory") == 0) { EXPECT_EQ(CL_MAKE_VERSION(0, 9u, 1u), extensionWithVersion.version); } else { @@ -876,6 +878,8 @@ TEST_F(DeviceGetCapsTest, givenClDeviceWhenGetExtensionsVersionCalledThenCorrect for (auto extensionWithVersion : pClDevice->getDeviceInfo().extensionsWithVersion) { if (strcmp(extensionWithVersion.name, "cl_khr_integer_dot_product") == 0) { EXPECT_EQ(CL_MAKE_VERSION(2u, 0, 0), pClDevice->getExtensionVersion(std::string(extensionWithVersion.name))); + } else if (strcmp(extensionWithVersion.name, "cl_intel_unified_shared_memory") == 0) { + EXPECT_EQ(CL_MAKE_VERSION(1u, 1u, 0), pClDevice->getExtensionVersion(std::string(extensionWithVersion.name))); } else if (strcmp(extensionWithVersion.name, "cl_khr_external_memory") == 0) { EXPECT_EQ(CL_MAKE_VERSION(0, 9u, 1u), pClDevice->getExtensionVersion(std::string(extensionWithVersion.name))); } else { diff --git a/shared/source/compiler_interface/oclc_extensions.cpp b/shared/source/compiler_interface/oclc_extensions.cpp index d3cacb6fe1..ae34a9a80c 100644 --- a/shared/source/compiler_interface/oclc_extensions.cpp +++ b/shared/source/compiler_interface/oclc_extensions.cpp @@ -155,6 +155,8 @@ std::string getOclVersionCompilerInternalOption(unsigned int oclVersion) { cl_version getOclCExtensionVersion(std::string name, cl_version defaultVer) { if (name.compare("cl_khr_integer_dot_product") == 0) { return CL_MAKE_VERSION(2u, 0, 0); + } else if (name.compare("cl_intel_unified_shared_memory") == 0) { + return CL_MAKE_VERSION(1u, 1u, 0); } else if (name.compare("cl_khr_external_memory") == 0) { return CL_MAKE_VERSION(0, 9u, 1u); } else { diff --git a/shared/source/debug_settings/debug_variables_base.inl b/shared/source/debug_settings/debug_variables_base.inl index 91e800e2dc..6c3551c9d7 100644 --- a/shared/source/debug_settings/debug_variables_base.inl +++ b/shared/source/debug_settings/debug_variables_base.inl @@ -317,6 +317,7 @@ DECLARE_DEBUG_VARIABLE(int32_t, EnablePidFdOrSocketsForIpc, -1, "-1: default, 0: DECLARE_DEBUG_VARIABLE(int32_t, OverrideCopyOffloadMode, -1, "-1: default, 0: disabled, >=1: if enabled, override to any value from CopyOffloadModes enum") DECLARE_DEBUG_VARIABLE(int32_t, UseSingleListForTemporaryAllocations, -1, "-1: default, 0: disabled, 0: enabled. If enabled, use single list, instead of per CSR for tracking temporary allocations") DECLARE_DEBUG_VARIABLE(int32_t, OverrideMaxMemAllocSizeMb, -1, "-1: default, >=0 override reported max mem alloc size in MB") +DECLARE_DEBUG_VARIABLE(int32_t, DetectIncorrectPointersOnSetArgCalls, -1, "-1: default do not detect, 0: do not detect, 1: detect incorrect pointers and return error") /*LOGGING FLAGS*/ DECLARE_DEBUG_VARIABLE(int32_t, PrintDriverDiagnostics, -1, "prints driver diagnostics messages to standard output, value corresponds to hint level") diff --git a/shared/test/common/test_files/igdrcl.config b/shared/test/common/test_files/igdrcl.config index 9ad5601cc9..5bcb332f68 100644 --- a/shared/test/common/test_files/igdrcl.config +++ b/shared/test/common/test_files/igdrcl.config @@ -666,5 +666,6 @@ ExposeSingleDevice=-1 OverrideCopyOffloadMode = -1 UseSingleListForTemporaryAllocations = -1 OverrideMaxMemAllocSizeMb = -1 +DetectIncorrectPointersOnSetArgCalls =-1 IgcLibraryName = unk # Please don't edit below this line diff --git a/shared/test/unit_test/compiler_interface/compiler_interface_tests.cpp b/shared/test/unit_test/compiler_interface/compiler_interface_tests.cpp index aa5609aea8..b6a0506ccc 100644 --- a/shared/test/unit_test/compiler_interface/compiler_interface_tests.cpp +++ b/shared/test/unit_test/compiler_interface/compiler_interface_tests.cpp @@ -1585,6 +1585,13 @@ TEST(getOclCExtensionVersion, whenQueryingVersionOfIntegerDotProductExtensionThe EXPECT_EQ(expectedVer, ver); } +TEST(getOclCExtensionVersion, whenQueryingVersionOfUnifiedSharedMemoryExtensionThenReturns110) { + cl_version defaultVer = CL_MAKE_VERSION(7, 2, 5); + cl_version ver = NEO::getOclCExtensionVersion("cl_intel_unified_shared_memory", defaultVer); + cl_version expectedVer = CL_MAKE_VERSION(1, 1, 0); + EXPECT_EQ(expectedVer, ver); +} + TEST(getOclCExtensionVersion, whenCheckingVersionOfExternalMemoryExtensionThenReturns091) { cl_version defaultVer = CL_MAKE_VERSION(7, 2, 5); cl_version ver = NEO::getOclCExtensionVersion("cl_khr_external_memory", defaultVer);