diff --git a/unified-runtime/source/adapters/opencl/common.cpp b/unified-runtime/source/adapters/opencl/common.cpp index 33da43a18266f..a2bd9ed549245 100644 --- a/unified-runtime/source/adapters/opencl/common.cpp +++ b/unified-runtime/source/adapters/opencl/common.cpp @@ -81,6 +81,7 @@ ur_result_t mapCLErrorToUR(cl_int Result) { case CL_PROFILING_INFO_NOT_AVAILABLE: return UR_RESULT_ERROR_PROFILING_INFO_NOT_AVAILABLE; case CL_LINK_PROGRAM_FAILURE: + case CL_INVALID_LINKER_OPTIONS: return UR_RESULT_ERROR_PROGRAM_LINK_FAILURE; case CL_INVALID_ARG_INDEX: return UR_RESULT_ERROR_INVALID_KERNEL_ARGUMENT_INDEX; diff --git a/unified-runtime/test/conformance/program/urProgramCompile.cpp b/unified-runtime/test/conformance/program/urProgramCompile.cpp index 26e8709e314d0..c70641500f826 100644 --- a/unified-runtime/test/conformance/program/urProgramCompile.cpp +++ b/unified-runtime/test/conformance/program/urProgramCompile.cpp @@ -6,6 +6,20 @@ #include +using urProgramCompileWithParamTest = uur::urProgramTestWithParam; + +UUR_DEVICE_TEST_SUITE_WITH_PARAM(urProgramCompileWithParamTest, + ::testing::Values("-O0", "-O1", "-O2", "-O3"), + uur::deviceTestWithParamPrinter); + +TEST_P(urProgramCompileWithParamTest, Success) { + const char *platformOption = nullptr; + ASSERT_SUCCESS(urPlatformGetBackendOption(platform, getParam().c_str(), + &platformOption)); + + ASSERT_SUCCESS(urProgramCompile(context, program, platformOption)); +} + using urProgramCompileTest = uur::urProgramTest; UUR_INSTANTIATE_DEVICE_TEST_SUITE(urProgramCompileTest); diff --git a/unified-runtime/test/conformance/program/urProgramCreateWithBinary.cpp b/unified-runtime/test/conformance/program/urProgramCreateWithBinary.cpp index 62aad1a3641e5..bd3a6b8870493 100644 --- a/unified-runtime/test/conformance/program/urProgramCreateWithBinary.cpp +++ b/unified-runtime/test/conformance/program/urProgramCreateWithBinary.cpp @@ -44,6 +44,47 @@ TEST_P(urProgramCreateWithBinaryTest, Success) { nullptr, &binary_program)); } +TEST_P(urProgramCreateWithBinaryTest, SuccessWithProperties) { + auto size = binary.size(); + const uint8_t *data = binary.data(); + + std::string string = "test metadata"; + ur_program_metadata_value_t md_value_string; + md_value_string.pString = string.data(); + ur_program_metadata_t meta_string = {string.data(), + UR_PROGRAM_METADATA_TYPE_STRING, + string.size(), md_value_string}; + + ur_program_metadata_value_t md_value_32; + md_value_32.data32 = 32; + ur_program_metadata_t meta_32 = {string.data(), + UR_PROGRAM_METADATA_TYPE_UINT32, + sizeof(uint32_t), md_value_32}; + + ur_program_metadata_value_t md_value_64; + md_value_64.data64 = 64; + ur_program_metadata_t meta_64 = {string.data(), + UR_PROGRAM_METADATA_TYPE_UINT64, + sizeof(uint64_t), md_value_64}; + + ur_program_metadata_value_t md_value_data; + std::vector metadataValue = {0xDE, 0xAD, 0xBE, 0xEF}; + md_value_data.pData = metadataValue.data(); + ur_program_metadata_t meta_data = {string.data(), + UR_PROGRAM_METADATA_TYPE_BYTE_ARRAY, + metadataValue.size(), md_value_data}; + + std::vector metadatas = {meta_string, meta_32, meta_64, + meta_data}; + + ur_program_properties_t properties{ + UR_STRUCTURE_TYPE_PROGRAM_PROPERTIES, nullptr, + static_cast(metadatas.size()), metadatas.data()}; + + ASSERT_SUCCESS(urProgramCreateWithBinary(context, 1, &device, &size, &data, + &properties, &binary_program)); +} + TEST_P(urProgramCreateWithBinaryTest, InvalidNullHandleContext) { auto size = binary.size(); const uint8_t *data = binary.data(); diff --git a/unified-runtime/test/conformance/program/urProgramCreateWithIL.cpp b/unified-runtime/test/conformance/program/urProgramCreateWithIL.cpp index e70ae0a922143..98c51710657cc 100644 --- a/unified-runtime/test/conformance/program/urProgramCreateWithIL.cpp +++ b/unified-runtime/test/conformance/program/urProgramCreateWithIL.cpp @@ -46,8 +46,39 @@ TEST_P(urProgramCreateWithILTest, Success) { TEST_P(urProgramCreateWithILTest, SuccessWithProperties) { UUR_KNOWN_FAILURE_ON(uur::CUDA{}); - ur_program_properties_t properties{UR_STRUCTURE_TYPE_PROGRAM_PROPERTIES, - nullptr, 0, nullptr}; + std::string string = "test metadata"; + ur_program_metadata_value_t md_value_string; + md_value_string.pString = string.data(); + ur_program_metadata_t meta_string = {string.data(), + UR_PROGRAM_METADATA_TYPE_STRING, + string.size(), md_value_string}; + + ur_program_metadata_value_t md_value_32; + md_value_32.data32 = 32; + ur_program_metadata_t meta_32 = {string.data(), + UR_PROGRAM_METADATA_TYPE_UINT32, + sizeof(uint32_t), md_value_32}; + + ur_program_metadata_value_t md_value_64; + md_value_64.data64 = 64; + ur_program_metadata_t meta_64 = {string.data(), + UR_PROGRAM_METADATA_TYPE_UINT64, + sizeof(uint64_t), md_value_64}; + + ur_program_metadata_value_t md_value_data; + std::vector metadataValue = {0xDE, 0xAD, 0xBE, 0xEF}; + md_value_data.pData = metadataValue.data(); + ur_program_metadata_t meta_data = {string.data(), + UR_PROGRAM_METADATA_TYPE_BYTE_ARRAY, + metadataValue.size(), md_value_data}; + + std::vector metadatas = {meta_string, meta_32, meta_64, + meta_data}; + + ur_program_properties_t properties{ + UR_STRUCTURE_TYPE_PROGRAM_PROPERTIES, nullptr, + static_cast(metadatas.size()), metadatas.data()}; + ur_program_handle_t program = nullptr; ASSERT_SUCCESS(urProgramCreateWithIL( context, il_binary->data(), il_binary->size(), &properties, &program)); @@ -56,33 +87,51 @@ TEST_P(urProgramCreateWithILTest, SuccessWithProperties) { } TEST_P(urProgramCreateWithILTest, InvalidNullHandle) { - ur_program_handle_t program = nullptr; ASSERT_EQ_RESULT(UR_RESULT_ERROR_INVALID_NULL_HANDLE, urProgramCreateWithIL(nullptr, il_binary->data(), - il_binary->size(), nullptr, &program)); + il_binary->size(), nullptr, nullptr)); } -TEST_P(urProgramCreateWithILTest, InvalidNullPointerSource) { - ur_program_handle_t program = nullptr; +TEST_P(urProgramCreateWithILTest, InvalidNullPointer) { + ASSERT_EQ_RESULT(UR_RESULT_ERROR_INVALID_NULL_POINTER, urProgramCreateWithIL(context, nullptr, il_binary->size(), - nullptr, &program)); + nullptr, nullptr)); + + ASSERT_EQ_RESULT(UR_RESULT_ERROR_INVALID_NULL_POINTER, + urProgramCreateWithIL(context, il_binary->data(), + il_binary->size(), nullptr, nullptr)); + + ur_program_properties_t properties{UR_STRUCTURE_TYPE_PROGRAM_PROPERTIES, + nullptr, 1, nullptr}; + ASSERT_EQ_RESULT(UR_RESULT_ERROR_INVALID_NULL_POINTER, + urProgramCreateWithIL(context, il_binary->data(), + il_binary->size(), &properties, + nullptr)); } -TEST_P(urProgramCreateWithILTest, InvalidSizeLength) { +TEST_P(urProgramCreateWithILTest, InvalidSize) { ur_program_handle_t program = nullptr; ASSERT_EQ_RESULT( UR_RESULT_ERROR_INVALID_SIZE, urProgramCreateWithIL(context, il_binary->data(), 0, nullptr, &program)); -} -TEST_P(urProgramCreateWithILTest, InvalidNullPointerProgram) { - ASSERT_EQ_RESULT(UR_RESULT_ERROR_INVALID_NULL_POINTER, - urProgramCreateWithIL(context, il_binary->data(), - il_binary->size(), nullptr, nullptr)); + std::string md_string = "test metadata"; + ur_program_metadata_value_t md_value = {}; + md_value.pString = md_string.data(); + ur_program_metadata_t metadata = {md_string.data(), + UR_PROGRAM_METADATA_TYPE_STRING, + md_string.size(), md_value}; + + ur_program_properties_t properties{UR_STRUCTURE_TYPE_PROGRAM_PROPERTIES, + nullptr, 0, &metadata}; + + ASSERT_EQ_RESULT(UR_RESULT_ERROR_INVALID_SIZE, + urProgramCreateWithIL(context, il_binary->data(), 1, + &properties, &program)); } -TEST_P(urProgramCreateWithILTest, BuildInvalidProgram) { +TEST_P(urProgramCreateWithILTest, InvalidBinary) { UUR_KNOWN_FAILURE_ON(uur::CUDA{}); ur_program_handle_t program = nullptr; @@ -92,3 +141,18 @@ TEST_P(urProgramCreateWithILTest, BuildInvalidProgram) { ASSERT_TRUE(result == UR_RESULT_ERROR_INVALID_BINARY || result == UR_RESULT_SUCCESS); } + +TEST_P(urProgramCreateWithILTest, CompilerNotAvailable) { + UUR_KNOWN_FAILURE_ON(uur::CUDA{}); + + ur_bool_t compiler_available = false; + urDeviceGetInfo(device, UR_DEVICE_INFO_COMPILER_AVAILABLE, sizeof(ur_bool_t), + &compiler_available, nullptr); + + if (!compiler_available) { + ur_program_handle_t program = nullptr; + ASSERT_EQ_RESULT(UR_RESULT_ERROR_COMPILER_NOT_AVAILABLE, + urProgramCreateWithIL(context, il_binary->data(), 1, + nullptr, &program)); + } +} diff --git a/unified-runtime/test/conformance/program/urProgramCreateWithNativeHandle.cpp b/unified-runtime/test/conformance/program/urProgramCreateWithNativeHandle.cpp index 9726f7f53e2b7..28c2dfdb595d6 100644 --- a/unified-runtime/test/conformance/program/urProgramCreateWithNativeHandle.cpp +++ b/unified-runtime/test/conformance/program/urProgramCreateWithNativeHandle.cpp @@ -47,6 +47,28 @@ TEST_P(urProgramCreateWithNativeHandleTest, Success) { ASSERT_NE(ref_count, 0); } +TEST_P(urProgramCreateWithNativeHandleTest, + SuccessWithExplicitUnOwnedNativeHandle) { + ur_native_handle_t native_handle = 0; + UUR_ASSERT_SUCCESS_OR_UNSUPPORTED( + urProgramGetNativeHandle(program, &native_handle)); + + ur_program_native_properties_t props = { + /*.stype =*/UR_STRUCTURE_TYPE_PROGRAM_NATIVE_PROPERTIES, + /*.pNext =*/nullptr, + /*.isNativeHandleOwned =*/false, + }; + UUR_ASSERT_SUCCESS_OR_UNSUPPORTED(urProgramCreateWithNativeHandle( + native_handle, context, &props, &native_program)); + ASSERT_NE(nullptr, native_program); + + ur_context_handle_t program_context = nullptr; + ASSERT_SUCCESS(urProgramGetInfo(native_program, UR_PROGRAM_INFO_CONTEXT, + sizeof(ur_context_handle_t), &program_context, + nullptr)); + ASSERT_EQ(context, program_context); +} + TEST_P(urProgramCreateWithNativeHandleTest, SuccessWithProperties) { // We can't pass isNativeHandleOwned = true in the generic tests since // we always get the native handle from a UR object, and transferring diff --git a/unified-runtime/test/conformance/program/urProgramLink.cpp b/unified-runtime/test/conformance/program/urProgramLink.cpp index c7eecfed54c68..d6d5c1c7f2c6a 100644 --- a/unified-runtime/test/conformance/program/urProgramLink.cpp +++ b/unified-runtime/test/conformance/program/urProgramLink.cpp @@ -33,6 +33,51 @@ struct urProgramLinkTest : uur::urProgramTest { }; UUR_INSTANTIATE_DEVICE_TEST_SUITE(urProgramLinkTest); +TEST_P(urProgramLinkTest, Success) { + // This entry point isn't implemented for HIP. + UUR_KNOWN_FAILURE_ON(uur::HIP{}); + + ASSERT_SUCCESS(urProgramLink(context, 1, &program, nullptr, &linked_program)); + ur_program_binary_type_t binary_type = UR_PROGRAM_BINARY_TYPE_NONE; + ASSERT_SUCCESS(urProgramGetBuildInfo( + linked_program, device, UR_PROGRAM_BUILD_INFO_BINARY_TYPE, + sizeof(binary_type), &binary_type, nullptr)); + ASSERT_EQ(binary_type, UR_PROGRAM_BINARY_TYPE_EXECUTABLE); +} + +TEST_P(urProgramLinkTest, InvalidNullHandleContext) { + ASSERT_EQ_RESULT( + UR_RESULT_ERROR_INVALID_NULL_HANDLE, + urProgramLink(nullptr, 1, &program, nullptr, &linked_program)); +} + +TEST_P(urProgramLinkTest, InvalidNullPointerProgram) { + ASSERT_EQ_RESULT(UR_RESULT_ERROR_INVALID_NULL_POINTER, + urProgramLink(context, 1, &program, nullptr, nullptr)); +} + +TEST_P(urProgramLinkTest, InvalidNullPointerInputPrograms) { + ASSERT_EQ_RESULT( + UR_RESULT_ERROR_INVALID_NULL_POINTER, + urProgramLink(context, 1, nullptr, nullptr, &linked_program)); +} + +TEST_P(urProgramLinkTest, InvalidSizeCount) { + ASSERT_EQ_RESULT( + UR_RESULT_ERROR_INVALID_SIZE, + urProgramLink(context, 0, &program, nullptr, &linked_program)); +} + +TEST_P(urProgramLinkTest, SetOutputOnZeroCount) { + uintptr_t invalid_pointer; + linked_program = reinterpret_cast(&invalid_pointer); + ASSERT_EQ_RESULT( + UR_RESULT_ERROR_INVALID_SIZE, + urProgramLink(context, 0, &program, nullptr, &linked_program)); + ASSERT_NE(linked_program, + reinterpret_cast(&invalid_pointer)); +} + struct urProgramLinkErrorTest : uur::urQueueTest { const std::string linker_error_program_name = "linker_error"; @@ -75,57 +120,12 @@ struct urProgramLinkErrorTest : uur::urQueueTest { }; UUR_INSTANTIATE_DEVICE_TEST_SUITE(urProgramLinkErrorTest); -TEST_P(urProgramLinkTest, Success) { - // This entry point isn't implemented for HIP. - UUR_KNOWN_FAILURE_ON(uur::HIP{}); - - ASSERT_SUCCESS(urProgramLink(context, 1, &program, nullptr, &linked_program)); - ur_program_binary_type_t binary_type = UR_PROGRAM_BINARY_TYPE_NONE; - ASSERT_SUCCESS(urProgramGetBuildInfo( - linked_program, device, UR_PROGRAM_BUILD_INFO_BINARY_TYPE, - sizeof(binary_type), &binary_type, nullptr)); - ASSERT_EQ(binary_type, UR_PROGRAM_BINARY_TYPE_EXECUTABLE); -} - -TEST_P(urProgramLinkTest, InvalidNullHandleContext) { - ASSERT_EQ_RESULT( - UR_RESULT_ERROR_INVALID_NULL_HANDLE, - urProgramLink(nullptr, 1, &program, nullptr, &linked_program)); -} - -TEST_P(urProgramLinkTest, InvalidNullPointerProgram) { - ASSERT_EQ_RESULT(UR_RESULT_ERROR_INVALID_NULL_POINTER, - urProgramLink(context, 1, &program, nullptr, nullptr)); -} - -TEST_P(urProgramLinkTest, InvalidNullPointerInputPrograms) { - ASSERT_EQ_RESULT( - UR_RESULT_ERROR_INVALID_NULL_POINTER, - urProgramLink(context, 1, nullptr, nullptr, &linked_program)); -} - -TEST_P(urProgramLinkTest, InvalidSizeCount) { - ASSERT_EQ_RESULT( - UR_RESULT_ERROR_INVALID_SIZE, - urProgramLink(context, 0, &program, nullptr, &linked_program)); -} - TEST_P(urProgramLinkErrorTest, LinkFailure) { ASSERT_EQ_RESULT( UR_RESULT_ERROR_PROGRAM_LINK_FAILURE, urProgramLink(context, 1, &program, nullptr, &linked_program)); } -TEST_P(urProgramLinkTest, SetOutputOnZeroCount) { - uintptr_t invalid_pointer; - linked_program = reinterpret_cast(&invalid_pointer); - ASSERT_EQ_RESULT( - UR_RESULT_ERROR_INVALID_SIZE, - urProgramLink(context, 0, &program, nullptr, &linked_program)); - ASSERT_NE(linked_program, - reinterpret_cast(&invalid_pointer)); -} - TEST_P(urProgramLinkErrorTest, SetOutputOnLinkError) { uintptr_t invalid_pointer; linked_program = reinterpret_cast(&invalid_pointer); diff --git a/unified-runtime/test/conformance/program/urProgramRelease.cpp b/unified-runtime/test/conformance/program/urProgramRelease.cpp index 24f9d9f7645c0..e58b17883ea60 100644 --- a/unified-runtime/test/conformance/program/urProgramRelease.cpp +++ b/unified-runtime/test/conformance/program/urProgramRelease.cpp @@ -11,7 +11,16 @@ UUR_INSTANTIATE_DEVICE_TEST_SUITE(urProgramReleaseTest); TEST_P(urProgramReleaseTest, Success) { ASSERT_SUCCESS(urProgramRetain(program)); + + uint32_t prevRefCount = 0; + ASSERT_SUCCESS(uur::GetObjectReferenceCount(program, prevRefCount)); + ASSERT_SUCCESS(urProgramRelease(program)); + + uint32_t refCount = 0; + ASSERT_SUCCESS(uur::GetObjectReferenceCount(program, refCount)); + + ASSERT_GT(prevRefCount, refCount); } TEST_P(urProgramReleaseTest, InvalidNullHandleProgram) { diff --git a/unified-runtime/test/conformance/program/urProgramRetain.cpp b/unified-runtime/test/conformance/program/urProgramRetain.cpp index efce89bbdb03b..b9a4bcdeb6e24 100644 --- a/unified-runtime/test/conformance/program/urProgramRetain.cpp +++ b/unified-runtime/test/conformance/program/urProgramRetain.cpp @@ -10,8 +10,17 @@ using urProgramRetainTest = uur::urProgramTest; UUR_INSTANTIATE_DEVICE_TEST_SUITE(urProgramRetainTest); TEST_P(urProgramRetainTest, Success) { + uint32_t prevRefCount = 0; + ASSERT_SUCCESS(uur::GetObjectReferenceCount(program, prevRefCount)); + ASSERT_SUCCESS(urProgramRetain(program)); - EXPECT_SUCCESS(urProgramRelease(program)); + + uint32_t refCount = 0; + ASSERT_SUCCESS(uur::GetObjectReferenceCount(program, refCount)); + + ASSERT_LT(prevRefCount, refCount); + + EXPECT_SUCCESS(urProgramRetain(program)); } TEST_P(urProgramRetainTest, InvalidNullHandleProgram) { diff --git a/unified-runtime/test/conformance/testing/include/uur/fixtures.h b/unified-runtime/test/conformance/testing/include/uur/fixtures.h index 29fe4ee153b6d..3383a4410f97b 100644 --- a/unified-runtime/test/conformance/testing/include/uur/fixtures.h +++ b/unified-runtime/test/conformance/testing/include/uur/fixtures.h @@ -1174,7 +1174,8 @@ std::string deviceTestWithParamPrinter( std::stringstream ss; ss << param; - return uur::GetPlatformAndDeviceName(device) + "__" + ss.str(); + return uur::GetPlatformAndDeviceName(device) + "__" + + GTestSanitizeString(ss.str()); } template <>