From 64ad451d09b33968b887267d75940e8f5e0a67a8 Mon Sep 17 00:00:00 2001 From: "Neil R. Spruit" Date: Tue, 2 Jul 2024 11:01:22 -0700 Subject: [PATCH 1/5] [L0] Fix program get info Signed-off-by: Neil R. Spruit --- source/adapters/level_zero/program.cpp | 34 ++++++++++++++------------ 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/source/adapters/level_zero/program.cpp b/source/adapters/level_zero/program.cpp index 26c75aef31..e66c4a9a35 100644 --- a/source/adapters/level_zero/program.cpp +++ b/source/adapters/level_zero/program.cpp @@ -658,21 +658,23 @@ UR_APIEXPORT ur_result_t UR_APICALL urProgramGetInfo( // device. Since Level Zero supports only one device, there is only one // pointer. If the pointer is NULL, we don't do anything. Otherwise, we // copy the program's binary image to the buffer at that pointer. - uint8_t **PBinary = ur_cast(ProgramInfo); - if (!PBinary[0]) - break; + if (ProgramInfo) { + uint8_t **PBinary = ur_cast(ProgramInfo); + if (!PBinary[0]) + break; - std::shared_lock Guard(Program->Mutex); - if (Program->State == ur_program_handle_t_::IL || - Program->State == ur_program_handle_t_::Native || - Program->State == ur_program_handle_t_::Object) { - std::memcpy(PBinary[0], Program->Code.get(), Program->CodeLength); - } else if (Program->State == ur_program_handle_t_::Exe) { - size_t SzBinary = 0; - ZE2UR_CALL(zeModuleGetNativeBinary, - (Program->ZeModule, &SzBinary, PBinary[0])); - } else { - return UR_RESULT_ERROR_INVALID_PROGRAM; + std::shared_lock Guard(Program->Mutex); + if (Program->State == ur_program_handle_t_::IL || + Program->State == ur_program_handle_t_::Native || + Program->State == ur_program_handle_t_::Object) { + std::memcpy(PBinary[0], Program->Code.get(), Program->CodeLength); + } else if (Program->State == ur_program_handle_t_::Exe) { + size_t SzBinary = 0; + ZE2UR_CALL(zeModuleGetNativeBinary, + (Program->ZeModule, &SzBinary, PBinary[0])); + } else { + return UR_RESULT_ERROR_INVALID_PROGRAM; + } } break; } @@ -720,8 +722,10 @@ UR_APIEXPORT ur_result_t UR_APICALL urProgramGetInfo( } catch (...) { return UR_RESULT_ERROR_UNKNOWN; } + case UR_PROGRAM_INFO_SOURCE: + return UR_RESULT_ERROR_UNSUPPORTED_ENUMERATION; default: - die("urProgramGetInfo: not implemented"); + return UR_RESULT_ERROR_INVALID_ENUMERATION; } return UR_RESULT_SUCCESS; From fa3a6a96c880233717046211df4816ecc4472a76 Mon Sep 17 00:00:00 2001 From: "Neil R. Spruit" Date: Tue, 2 Jul 2024 12:41:00 -0700 Subject: [PATCH 2/5] [L0] Fix Get info Binaries And source and handle/pointer checks Signed-off-by: Neil R. Spruit --- source/adapters/level_zero/program.cpp | 45 +++++++++++++------ .../program/program_adapter_level_zero.match | 2 +- 2 files changed, 32 insertions(+), 15 deletions(-) diff --git a/source/adapters/level_zero/program.cpp b/source/adapters/level_zero/program.cpp index e66c4a9a35..9659209517 100644 --- a/source/adapters/level_zero/program.cpp +++ b/source/adapters/level_zero/program.cpp @@ -58,6 +58,8 @@ UR_APIEXPORT ur_result_t UR_APICALL urProgramCreateWithIL( *Program ///< [out] pointer to handle of program object created. ) { std::ignore = Properties; + UR_ASSERT(Context, UR_RESULT_ERROR_INVALID_NULL_HANDLE); + UR_ASSERT(IL && Program, UR_RESULT_ERROR_INVALID_NULL_POINTER); try { ur_program_handle_t_ *UrProgram = new ur_program_handle_t_(ur_program_handle_t_::IL, Context, IL, Length); @@ -658,23 +660,34 @@ UR_APIEXPORT ur_result_t UR_APICALL urProgramGetInfo( // device. Since Level Zero supports only one device, there is only one // pointer. If the pointer is NULL, we don't do anything. Otherwise, we // copy the program's binary image to the buffer at that pointer. + uint8_t **PBinary = nullptr; if (ProgramInfo) { - uint8_t **PBinary = ur_cast(ProgramInfo); - if (!PBinary[0]) + PBinary = ur_cast(ProgramInfo); + if (!PBinary[0]) { break; - - std::shared_lock Guard(Program->Mutex); - if (Program->State == ur_program_handle_t_::IL || - Program->State == ur_program_handle_t_::Native || - Program->State == ur_program_handle_t_::Object) { + } + } + std::shared_lock Guard(Program->Mutex); + if (Program->State == ur_program_handle_t_::IL || + Program->State == ur_program_handle_t_::Native || + Program->State == ur_program_handle_t_::Object) { + if (PropSizeRet) + *PropSizeRet = Program->CodeLength; + if (PBinary) { std::memcpy(PBinary[0], Program->Code.get(), Program->CodeLength); - } else if (Program->State == ur_program_handle_t_::Exe) { - size_t SzBinary = 0; - ZE2UR_CALL(zeModuleGetNativeBinary, - (Program->ZeModule, &SzBinary, PBinary[0])); - } else { - return UR_RESULT_ERROR_INVALID_PROGRAM; } + } else if (Program->State == ur_program_handle_t_::Exe) { + size_t SzBinary = 0; + uint8_t *NativeBinaryPtr = nullptr; + if (PBinary) { + NativeBinaryPtr = PBinary[0]; + } + ZE2UR_CALL(zeModuleGetNativeBinary, + (Program->ZeModule, &SzBinary, NativeBinaryPtr)); + if (PropSizeRet) + *PropSizeRet = SzBinary; + } else { + return UR_RESULT_ERROR_INVALID_PROGRAM; } break; } @@ -723,7 +736,7 @@ UR_APIEXPORT ur_result_t UR_APICALL urProgramGetInfo( return UR_RESULT_ERROR_UNKNOWN; } case UR_PROGRAM_INFO_SOURCE: - return UR_RESULT_ERROR_UNSUPPORTED_ENUMERATION; + return ReturnValue(Program->Code.get()); default: return UR_RESULT_ERROR_INVALID_ENUMERATION; } @@ -765,6 +778,8 @@ UR_APIEXPORT ur_result_t UR_APICALL urProgramGetBuildInfo( // return for programs that were built outside and registered // with urProgramRegister? return ReturnValue(""); + } else if (PropName == UR_PROGRAM_BUILD_INFO_STATUS) { + return UR_RESULT_ERROR_UNSUPPORTED_ENUMERATION; } else if (PropName == UR_PROGRAM_BUILD_INFO_LOG) { // Check first to see if the plugin code recorded an error message. if (!Program->ErrorMessage.empty()) { @@ -856,6 +871,8 @@ UR_APIEXPORT ur_result_t UR_APICALL urProgramCreateWithNativeHandle( ///< program object created. ) { std::ignore = Properties; + UR_ASSERT(Context && NativeProgram, UR_RESULT_ERROR_INVALID_NULL_HANDLE); + UR_ASSERT(Program, UR_RESULT_ERROR_INVALID_NULL_POINTER); auto ZeModule = ur_cast(NativeProgram); // We assume here that programs created from a native handle always diff --git a/test/conformance/program/program_adapter_level_zero.match b/test/conformance/program/program_adapter_level_zero.match index 9e902dca94..2dd1ff51b6 100644 --- a/test/conformance/program/program_adapter_level_zero.match +++ b/test/conformance/program/program_adapter_level_zero.match @@ -3,4 +3,4 @@ urProgramCreateWithNativeHandleTest.InvalidNullHandleContext/Intel_R__oneAPI_Uni urProgramCreateWithNativeHandleTest.InvalidNullPointerProgram/Intel_R__oneAPI_Unified_Runtime_over_Level_Zero___{{.*}}_ urProgramGetBuildInfoTest.Success/Intel_R__oneAPI_Unified_Runtime_over_Level_Zero___{{.*}}_UR_PROGRAM_BUILD_INFO_STATUS urProgramGetFunctionPointerTest.InvalidKernelName/Intel_R__oneAPI_Unified_Runtime_over_Level_Zero___{{.*}}_ -Aborted +urProgramGetNativeHandleTest.Success/Intel_R__oneAPI_Unified_Runtime_over_Level_Zero___{{.*}}_ \ No newline at end of file From cd4b1116ea1aded01f1a2bfc06dd6764ac70fc7a Mon Sep 17 00:00:00 2001 From: "Neil R. Spruit" Date: Tue, 9 Jul 2024 17:40:27 -0700 Subject: [PATCH 3/5] Fix multi device module/kernel access Signed-off-by: Neil R. Spruit --- source/adapters/level_zero/program.cpp | 111 ++++++++++++++++++++----- 1 file changed, 89 insertions(+), 22 deletions(-) diff --git a/source/adapters/level_zero/program.cpp b/source/adapters/level_zero/program.cpp index 9659209517..4a8e804b10 100644 --- a/source/adapters/level_zero/program.cpp +++ b/source/adapters/level_zero/program.cpp @@ -599,11 +599,19 @@ UR_APIEXPORT ur_result_t UR_APICALL urProgramGetGlobalVariablePointer( void **GlobalVariablePointerRet ///< [out] Returns the pointer to the global ///< variable if it is found in the program. ) { - std::ignore = Device; std::scoped_lock lock(Program->Mutex); + ze_module_handle_t ZeModuleEntry{}; + ZeModuleEntry = Program->ZeModule; + if (!Program->ZeModuleMap.empty()) { + auto It = Program->ZeModuleMap.find(Device->ZeDevice); + if (It != Program->ZeModuleMap.end()) { + ZeModuleEntry = It->second; + } + } + ze_result_t ZeResult = - zeModuleGetGlobalPointer(Program->ZeModule, GlobalVariableName, + zeModuleGetGlobalPointer(ZeModuleEntry, GlobalVariableName, GlobalVariableSizeRet, GlobalVariablePointerRet); if (ZeResult == ZE_RESULT_ERROR_UNSUPPORTED_FEATURE) { @@ -634,11 +642,28 @@ UR_APIEXPORT ur_result_t UR_APICALL urProgramGetInfo( case UR_PROGRAM_INFO_CONTEXT: return ReturnValue(Program->Context); case UR_PROGRAM_INFO_NUM_DEVICES: - // TODO: return true number of devices this program exists for. - return ReturnValue(uint32_t{1}); + if (!Program->ZeModuleMap.empty()) + return ReturnValue( + uint32_t{ur_cast(Program->ZeModuleMap.size())}); + else + return ReturnValue(uint32_t{1}); case UR_PROGRAM_INFO_DEVICES: - // TODO: return all devices this program exists for. - return ReturnValue(Program->Context->Devices[0]); + if (!Program->ZeModuleMap.empty()) { + std::vector devices; + for (auto &ZeModulePair : Program->ZeModuleMap) { + auto It = Program->ZeModuleMap.find(ZeModulePair.first); + if (It != Program->ZeModuleMap.end()) { + for (auto &Device : Program->Context->Devices) { + if (Device->ZeDevice == ZeModulePair.first) { + devices.push_back(Device); + } + } + } + } + return ReturnValue(devices); + } else { + return ReturnValue(Program->Context->Devices[0]); + } case UR_PROGRAM_INFO_BINARY_SIZES: { std::shared_lock Guard(Program->Mutex); size_t SzBinary; @@ -647,8 +672,20 @@ UR_APIEXPORT ur_result_t UR_APICALL urProgramGetInfo( Program->State == ur_program_handle_t_::Object) { SzBinary = Program->CodeLength; } else if (Program->State == ur_program_handle_t_::Exe) { - ZE2UR_CALL(zeModuleGetNativeBinary, - (Program->ZeModule, &SzBinary, nullptr)); + if (!Program->ZeModuleMap.empty()) { + std::vector binarySizes; + for (auto &ZeModulePair : Program->ZeModuleMap) { + size_t binarySize = 0; + ZE2UR_CALL(zeModuleGetNativeBinary, + (ZeModulePair.second, &binarySize, nullptr)); + binarySizes.push_back(binarySize); + } + return ReturnValue(binarySizes); + } else { + ZE2UR_CALL(zeModuleGetNativeBinary, + (Program->ZeModule, &SzBinary, nullptr)); + return ReturnValue(SzBinary); + } } else { return UR_RESULT_ERROR_INVALID_PROGRAM; } @@ -657,9 +694,7 @@ UR_APIEXPORT ur_result_t UR_APICALL urProgramGetInfo( } case UR_PROGRAM_INFO_BINARIES: { // The caller sets "ParamValue" to an array of pointers, one for each - // device. Since Level Zero supports only one device, there is only one - // pointer. If the pointer is NULL, we don't do anything. Otherwise, we - // copy the program's binary image to the buffer at that pointer. + // device. uint8_t **PBinary = nullptr; if (ProgramInfo) { PBinary = ur_cast(ProgramInfo); @@ -668,6 +703,9 @@ UR_APIEXPORT ur_result_t UR_APICALL urProgramGetInfo( } } std::shared_lock Guard(Program->Mutex); + // If the caller is using a Program which is IL, Native or an object, then + // the program has not been built for multiple devices so a single IL is + // returned. if (Program->State == ur_program_handle_t_::IL || Program->State == ur_program_handle_t_::Native || Program->State == ur_program_handle_t_::Object) { @@ -677,13 +715,27 @@ UR_APIEXPORT ur_result_t UR_APICALL urProgramGetInfo( std::memcpy(PBinary[0], Program->Code.get(), Program->CodeLength); } } else if (Program->State == ur_program_handle_t_::Exe) { + // If the caller is using a Program which is a built binary, then + // the program returned will either be a single module if this is a native + // binary or the native binary for each device will be returned. size_t SzBinary = 0; uint8_t *NativeBinaryPtr = nullptr; if (PBinary) { NativeBinaryPtr = PBinary[0]; } - ZE2UR_CALL(zeModuleGetNativeBinary, - (Program->ZeModule, &SzBinary, NativeBinaryPtr)); + if (!Program->ZeModuleMap.empty()) { + uint32_t deviceIndex = 0; + for (auto &ZeDeviceModule : Program->ZeModuleMap) { + size_t binarySize = 0; + ZE2UR_CALL( + zeModuleGetNativeBinary, + (ZeDeviceModule.second, &binarySize, PBinary[deviceIndex++])); + SzBinary += binarySize; + } + } else { + ZE2UR_CALL(zeModuleGetNativeBinary, + (Program->ZeModule, &SzBinary, NativeBinaryPtr)); + } if (PropSizeRet) *PropSizeRet = SzBinary; } else { @@ -693,15 +745,20 @@ UR_APIEXPORT ur_result_t UR_APICALL urProgramGetInfo( } case UR_PROGRAM_INFO_NUM_KERNELS: { std::shared_lock Guard(Program->Mutex); - uint32_t NumKernels; + uint32_t NumKernels = 0; if (Program->State == ur_program_handle_t_::IL || Program->State == ur_program_handle_t_::Native || Program->State == ur_program_handle_t_::Object) { return UR_RESULT_ERROR_INVALID_PROGRAM_EXECUTABLE; } else if (Program->State == ur_program_handle_t_::Exe) { - NumKernels = 0; - ZE2UR_CALL(zeModuleGetKernelNames, - (Program->ZeModule, &NumKernels, nullptr)); + if (!Program->ZeModuleMap.empty()) { + ZE2UR_CALL( + zeModuleGetKernelNames, + (Program->ZeModuleMap.begin()->second, &NumKernels, nullptr)); + } else { + ZE2UR_CALL(zeModuleGetKernelNames, + (Program->ZeModule, &NumKernels, nullptr)); + } } else { return UR_RESULT_ERROR_INVALID_PROGRAM; } @@ -717,11 +774,21 @@ UR_APIEXPORT ur_result_t UR_APICALL urProgramGetInfo( return UR_RESULT_ERROR_INVALID_PROGRAM_EXECUTABLE; } else if (Program->State == ur_program_handle_t_::Exe) { uint32_t Count = 0; - ZE2UR_CALL(zeModuleGetKernelNames, - (Program->ZeModule, &Count, nullptr)); - std::unique_ptr PNames(new const char *[Count]); - ZE2UR_CALL(zeModuleGetKernelNames, - (Program->ZeModule, &Count, PNames.get())); + std::unique_ptr PNames; + if (!Program->ZeModuleMap.empty()) { + ZE2UR_CALL(zeModuleGetKernelNames, + (Program->ZeModuleMap.begin()->second, &Count, nullptr)); + PNames = std::make_unique(Count); + ZE2UR_CALL( + zeModuleGetKernelNames, + (Program->ZeModuleMap.begin()->second, &Count, PNames.get())); + } else { + ZE2UR_CALL(zeModuleGetKernelNames, + (Program->ZeModule, &Count, nullptr)); + PNames = std::make_unique(Count); + ZE2UR_CALL(zeModuleGetKernelNames, + (Program->ZeModule, &Count, PNames.get())); + } for (uint32_t I = 0; I < Count; ++I) { PINames += (I > 0 ? ";" : ""); PINames += PNames[I]; From 743682764cbcfcfdf4651c866ebf7819d206ce15 Mon Sep 17 00:00:00 2001 From: "Neil R. Spruit" Date: Tue, 9 Jul 2024 17:59:36 -0700 Subject: [PATCH 4/5] Fix Native Device Init Signed-off-by: Neil R. Spruit --- source/adapters/level_zero/program.cpp | 4 +--- source/adapters/level_zero/program.hpp | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/source/adapters/level_zero/program.cpp b/source/adapters/level_zero/program.cpp index 4a8e804b10..788d2f1d13 100644 --- a/source/adapters/level_zero/program.cpp +++ b/source/adapters/level_zero/program.cpp @@ -84,8 +84,6 @@ UR_APIEXPORT ur_result_t UR_APICALL urProgramCreateWithBinary( ur_program_handle_t *Program ///< [out] pointer to handle of Program object created. ) { - std::ignore = Device; - std::ignore = Properties; // In OpenCL, clCreateProgramWithBinary() can be used to load any of the // following: "program executable", "compiled program", or "library of // compiled programs". In addition, the loaded program can be either @@ -99,7 +97,7 @@ UR_APIEXPORT ur_result_t UR_APICALL urProgramCreateWithBinary( try { ur_program_handle_t_ *UrProgram = new ur_program_handle_t_( - ur_program_handle_t_::Native, Context, Binary, Size); + ur_program_handle_t_::Native, Context, Device, Properties, Binary, Size); *Program = reinterpret_cast(UrProgram); } catch (const std::bad_alloc &) { return UR_RESULT_ERROR_OUT_OF_HOST_MEMORY; diff --git a/source/adapters/level_zero/program.hpp b/source/adapters/level_zero/program.hpp index 8d148c8fa2..573ae105c0 100644 --- a/source/adapters/level_zero/program.hpp +++ b/source/adapters/level_zero/program.hpp @@ -65,7 +65,7 @@ struct ur_program_handle_t_ : _ur_object { ze_module_constants_t ZeSpecConstants; }; - // Construct a program in IL or Native state. + // Construct a program in IL. ur_program_handle_t_(state St, ur_context_handle_t Context, const void *Input, size_t Length) : Context{Context}, @@ -74,6 +74,15 @@ struct ur_program_handle_t_ : _ur_object { std::memcpy(Code.get(), Input, Length); } + // Construct a program in NATIVE. + ur_program_handle_t_(state St, ur_context_handle_t Context, ur_device_handle_t Device, const ur_program_properties_t *Properties, const void *Input, + size_t Length) + : Context{Context}, NativeDevice(Device), NativeProperties(Properties), + OwnZeModule{true}, State{St}, Code{new uint8_t[Length]}, + CodeLength{Length}, ZeModule{nullptr}, ZeBuildLog{nullptr} { + std::memcpy(Code.get(), Input, Length); + } + // Construct a program in Exe or Invalid state. ur_program_handle_t_(state St, ur_context_handle_t Context, ze_module_handle_t ZeModule, @@ -108,6 +117,13 @@ struct ur_program_handle_t_ : _ur_object { const ur_context_handle_t Context; // Context of the program. + + // Device Handle used for the Native Build + ur_device_handle_t NativeDevice; + + // Properties used for the Native Build + const ur_program_properties_t *NativeProperties; + // Indicates if we own the ZeModule or it came from interop that // asked to not transfer the ownership to SYCL RT. const bool OwnZeModule; From d7ea11ff71c2b4965ae8791a87b4e5ca3745cbcb Mon Sep 17 00:00:00 2001 From: "Neil R. Spruit" Date: Wed, 10 Jul 2024 13:28:21 -0700 Subject: [PATCH 5/5] Fix return value for multi device Signed-off-by: Neil R. Spruit --- source/adapters/level_zero/program.cpp | 9 +++++---- source/adapters/level_zero/program.hpp | 7 ++++--- .../program/program_adapter_level_zero-v2.match | 7 +++++-- .../conformance/program/program_adapter_level_zero.match | 4 +++- 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/source/adapters/level_zero/program.cpp b/source/adapters/level_zero/program.cpp index 788d2f1d13..04f6c7f3d0 100644 --- a/source/adapters/level_zero/program.cpp +++ b/source/adapters/level_zero/program.cpp @@ -96,8 +96,9 @@ UR_APIEXPORT ur_result_t UR_APICALL urProgramCreateWithBinary( // information to distinguish the cases. try { - ur_program_handle_t_ *UrProgram = new ur_program_handle_t_( - ur_program_handle_t_::Native, Context, Device, Properties, Binary, Size); + ur_program_handle_t_ *UrProgram = + new ur_program_handle_t_(ur_program_handle_t_::Native, Context, Device, + Properties, Binary, Size); *Program = reinterpret_cast(UrProgram); } catch (const std::bad_alloc &) { return UR_RESULT_ERROR_OUT_OF_HOST_MEMORY; @@ -658,7 +659,7 @@ UR_APIEXPORT ur_result_t UR_APICALL urProgramGetInfo( } } } - return ReturnValue(devices); + return ReturnValue(devices.data(), devices.size()); } else { return ReturnValue(Program->Context->Devices[0]); } @@ -678,7 +679,7 @@ UR_APIEXPORT ur_result_t UR_APICALL urProgramGetInfo( (ZeModulePair.second, &binarySize, nullptr)); binarySizes.push_back(binarySize); } - return ReturnValue(binarySizes); + return ReturnValue(binarySizes.data(), binarySizes.size()); } else { ZE2UR_CALL(zeModuleGetNativeBinary, (Program->ZeModule, &SzBinary, nullptr)); diff --git a/source/adapters/level_zero/program.hpp b/source/adapters/level_zero/program.hpp index 573ae105c0..e5f743cdde 100644 --- a/source/adapters/level_zero/program.hpp +++ b/source/adapters/level_zero/program.hpp @@ -75,8 +75,10 @@ struct ur_program_handle_t_ : _ur_object { } // Construct a program in NATIVE. - ur_program_handle_t_(state St, ur_context_handle_t Context, ur_device_handle_t Device, const ur_program_properties_t *Properties, const void *Input, - size_t Length) + ur_program_handle_t_(state St, ur_context_handle_t Context, + ur_device_handle_t Device, + const ur_program_properties_t *Properties, + const void *Input, size_t Length) : Context{Context}, NativeDevice(Device), NativeProperties(Properties), OwnZeModule{true}, State{St}, Code{new uint8_t[Length]}, CodeLength{Length}, ZeModule{nullptr}, ZeBuildLog{nullptr} { @@ -117,7 +119,6 @@ struct ur_program_handle_t_ : _ur_object { const ur_context_handle_t Context; // Context of the program. - // Device Handle used for the Native Build ur_device_handle_t NativeDevice; diff --git a/test/conformance/program/program_adapter_level_zero-v2.match b/test/conformance/program/program_adapter_level_zero-v2.match index 05b71211b8..c25be22424 100644 --- a/test/conformance/program/program_adapter_level_zero-v2.match +++ b/test/conformance/program/program_adapter_level_zero-v2.match @@ -1,6 +1,9 @@ urProgramCreateWithNativeHandleTest.Success/Intel_R__oneAPI_Unified_Runtime_over_Level_Zero___{{.*}}_ urProgramCreateWithNativeHandleTest.InvalidNullHandleContext/Intel_R__oneAPI_Unified_Runtime_over_Level_Zero___{{.*}}_ urProgramCreateWithNativeHandleTest.InvalidNullPointerProgram/Intel_R__oneAPI_Unified_Runtime_over_Level_Zero___{{.*}}_ -urProgramGetBuildInfoTest.Success/Intel_R__oneAPI_Unified_Runtime_over_Level_Zero___{{.*}}___UR_PROGRAM_BUILD_INFO_STATUS +urProgramGetBuildInfoTest.Success/Intel_R__oneAPI_Unified_Runtime_over_Level_Zero___{{.*}}_UR_PROGRAM_BUILD_INFO_STATUS urProgramGetFunctionPointerTest.InvalidKernelName/Intel_R__oneAPI_Unified_Runtime_over_Level_Zero___{{.*}}_ -Aborted +urProgramGetNativeHandleTest.Success/Intel_R__oneAPI_Unified_Runtime_over_Level_Zero___{{.*}}_ +{{OPT}}urProgramLinkErrorTest.LinkFailure/Intel_R__oneAPI_Unified_Runtime_over_Level_Zero___{{.*}}_ +{{OPT}}urProgramLinkErrorTest.SetOutputOnLinkError/Intel_R__oneAPI_Unified_Runtime_over_Level_Zero___{{.*}}_ +Segmentation fault \ No newline at end of file diff --git a/test/conformance/program/program_adapter_level_zero.match b/test/conformance/program/program_adapter_level_zero.match index 2dd1ff51b6..f8d65b426e 100644 --- a/test/conformance/program/program_adapter_level_zero.match +++ b/test/conformance/program/program_adapter_level_zero.match @@ -3,4 +3,6 @@ urProgramCreateWithNativeHandleTest.InvalidNullHandleContext/Intel_R__oneAPI_Uni urProgramCreateWithNativeHandleTest.InvalidNullPointerProgram/Intel_R__oneAPI_Unified_Runtime_over_Level_Zero___{{.*}}_ urProgramGetBuildInfoTest.Success/Intel_R__oneAPI_Unified_Runtime_over_Level_Zero___{{.*}}_UR_PROGRAM_BUILD_INFO_STATUS urProgramGetFunctionPointerTest.InvalidKernelName/Intel_R__oneAPI_Unified_Runtime_over_Level_Zero___{{.*}}_ -urProgramGetNativeHandleTest.Success/Intel_R__oneAPI_Unified_Runtime_over_Level_Zero___{{.*}}_ \ No newline at end of file +urProgramGetNativeHandleTest.Success/Intel_R__oneAPI_Unified_Runtime_over_Level_Zero___{{.*}}_ +{{OPT}}urProgramLinkErrorTest.LinkFailure/Intel_R__oneAPI_Unified_Runtime_over_Level_Zero___{{.*}}_ +{{OPT}}urProgramLinkErrorTest.SetOutputOnLinkError/Intel_R__oneAPI_Unified_Runtime_over_Level_Zero___{{.*}}_ \ No newline at end of file