Skip to content

Improvements to align CTS and Spec for Program #2697

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions source/adapters/opencl/common.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
14 changes: 14 additions & 0 deletions test/conformance/program/urProgramCompile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,20 @@

#include <uur/fixtures.h>

using urProgramCompileWithParamTest = uur::urProgramTestWithParam<std::string>;

UUR_DEVICE_TEST_SUITE_WITH_PARAM(urProgramCompileWithParamTest,
::testing::Values("-O0", "-O1", "-O2", "-O3"),
uur::deviceTestWithParamPrinter<std::string>);

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);

Expand Down
41 changes: 41 additions & 0 deletions test/conformance/program/urProgramCreateWithBinary.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<uint8_t> 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<ur_program_metadata_t> metadatas = {meta_string, meta_32, meta_64,
meta_data};

ur_program_properties_t properties{
UR_STRUCTURE_TYPE_PROGRAM_PROPERTIES, nullptr,
static_cast<uint32_t>(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();
Expand Down
92 changes: 78 additions & 14 deletions test/conformance/program/urProgramCreateWithIL.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<uint8_t> 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<ur_program_metadata_t> metadatas = {meta_string, meta_32, meta_64,
meta_data};

ur_program_properties_t properties{
UR_STRUCTURE_TYPE_PROGRAM_PROPERTIES, nullptr,
static_cast<uint32_t>(metadatas.size()), metadatas.data()};

ur_program_handle_t program = nullptr;
ASSERT_SUCCESS(urProgramCreateWithIL(
context, il_binary->data(), il_binary->size(), &properties, &program));
Expand All @@ -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;
Expand All @@ -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));
}
}
22 changes: 22 additions & 0 deletions test/conformance/program/urProgramCreateWithNativeHandle.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
90 changes: 45 additions & 45 deletions test/conformance/program/urProgramLink.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<ur_program_handle_t>(&invalid_pointer);
ASSERT_EQ_RESULT(
UR_RESULT_ERROR_INVALID_SIZE,
urProgramLink(context, 0, &program, nullptr, &linked_program));
ASSERT_NE(linked_program,
reinterpret_cast<ur_program_handle_t>(&invalid_pointer));
}

struct urProgramLinkErrorTest : uur::urQueueTest {
const std::string linker_error_program_name = "linker_error";

Expand Down Expand Up @@ -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<ur_program_handle_t>(&invalid_pointer);
ASSERT_EQ_RESULT(
UR_RESULT_ERROR_INVALID_SIZE,
urProgramLink(context, 0, &program, nullptr, &linked_program));
ASSERT_NE(linked_program,
reinterpret_cast<ur_program_handle_t>(&invalid_pointer));
}

TEST_P(urProgramLinkErrorTest, SetOutputOnLinkError) {
uintptr_t invalid_pointer;
linked_program = reinterpret_cast<ur_program_handle_t>(&invalid_pointer);
Expand Down
9 changes: 9 additions & 0 deletions test/conformance/program/urProgramRelease.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
11 changes: 10 additions & 1 deletion test/conformance/program/urProgramRetain.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
3 changes: 2 additions & 1 deletion test/conformance/testing/include/uur/fixtures.h
Original file line number Diff line number Diff line change
Expand Up @@ -1192,7 +1192,8 @@ std::string deviceTestWithParamPrinter(

std::stringstream ss;
ss << param;
return uur::GetPlatformAndDeviceName(device) + "__" + ss.str();
return uur::GetPlatformAndDeviceName(device) + "__" +
GTestSanitizeString(ss.str());
}

template <>
Expand Down