Skip to content

Commit 166b0a1

Browse files
committed
Improvements to align CTS and Spec for Context:
- Add test for urContextCreate returning UR_RESULT_ERROR_INVALID_ENUMERATION - Added testing in urContextGetInfo for the atomic memory enums, checking against the type mask or UR_RESULT_ERROR_UNSUPPORTED_ENUM (as some adapters don't support this currently) - Updated some adapter code to include these enums and return the correct error code
1 parent e824ddc commit 166b0a1

File tree

10 files changed

+105
-42
lines changed

10 files changed

+105
-42
lines changed

source/adapters/cuda/context.cpp

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -98,13 +98,12 @@ UR_APIEXPORT ur_result_t UR_APICALL urContextGetInfo(
9898
UR_MEMORY_SCOPE_CAPABILITY_FLAG_DEVICE;
9999
return ReturnValue(Capabilities);
100100
}
101+
case UR_CONTEXT_INFO_ATOMIC_FENCE_ORDER_CAPABILITIES:
102+
case UR_CONTEXT_INFO_ATOMIC_FENCE_SCOPE_CAPABILITIES:
101103
case UR_CONTEXT_INFO_USM_MEMCPY2D_SUPPORT:
102-
// 2D USM memcpy is supported.
103-
return ReturnValue(true);
104-
case UR_CONTEXT_INFO_USM_FILL2D_SUPPORT:
105-
// 2D USM operations currently not supported.
106-
return ReturnValue(false);
107-
104+
case UR_CONTEXT_INFO_USM_FILL2D_SUPPORT: {
105+
return UR_RESULT_ERROR_UNSUPPORTED_ENUMERATION;
106+
}
108107
default:
109108
break;
110109
}

source/adapters/hip/context.cpp

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -72,18 +72,13 @@ urContextGetInfo(ur_context_handle_t hContext, ur_context_info_t propName,
7272
case UR_CONTEXT_INFO_ATOMIC_MEMORY_ORDER_CAPABILITIES:
7373
case UR_CONTEXT_INFO_ATOMIC_MEMORY_SCOPE_CAPABILITIES:
7474
case UR_CONTEXT_INFO_ATOMIC_FENCE_ORDER_CAPABILITIES:
75-
case UR_CONTEXT_INFO_ATOMIC_FENCE_SCOPE_CAPABILITIES: {
75+
case UR_CONTEXT_INFO_ATOMIC_FENCE_SCOPE_CAPABILITIES:
76+
case UR_CONTEXT_INFO_USM_MEMCPY2D_SUPPORT:
77+
case UR_CONTEXT_INFO_USM_FILL2D_SUPPORT: {
7678
// These queries should be dealt with in context_impl.cpp by calling the
7779
// queries of each device separately and building the intersection set.
78-
return UR_RESULT_ERROR_INVALID_ENUMERATION;
80+
return UR_RESULT_ERROR_UNSUPPORTED_ENUMERATION;
7981
}
80-
case UR_CONTEXT_INFO_USM_MEMCPY2D_SUPPORT:
81-
// 2D USM memcpy is supported.
82-
return ReturnValue(true);
83-
case UR_CONTEXT_INFO_USM_FILL2D_SUPPORT:
84-
// 2D USM operations currently not supported.
85-
return ReturnValue(false);
86-
8782
default:
8883
break;
8984
}

source/adapters/level_zero/context.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,10 +126,13 @@ ur_result_t urContextGetInfo(
126126
UR_MEMORY_ORDER_CAPABILITY_FLAG_SEQ_CST;
127127
return ReturnValue(Capabilities);
128128
}
129-
129+
case UR_CONTEXT_INFO_ATOMIC_MEMORY_SCOPE_CAPABILITIES:
130+
case UR_CONTEXT_INFO_ATOMIC_FENCE_ORDER_CAPABILITIES:
131+
case UR_CONTEXT_INFO_ATOMIC_FENCE_SCOPE_CAPABILITIES: {
132+
return UR_RESULT_ERROR_UNSUPPORTED_ENUMERATION;
133+
}
130134
default:
131-
// TODO: implement other parameters
132-
die("urGetContextInfo: unsuppported ParamName.");
135+
return UR_RESULT_ERROR_INVALID_ENUMERATION;
133136
}
134137

135138
return UR_RESULT_SUCCESS;

source/adapters/level_zero/v2/context.cpp

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -104,13 +104,30 @@ ur_result_t urContextGetInfo(ur_context_handle_t hContext,
104104
case UR_CONTEXT_INFO_REFERENCE_COUNT:
105105
return ReturnValue(uint32_t{hContext->RefCount.load()});
106106
case UR_CONTEXT_INFO_USM_MEMCPY2D_SUPPORT:
107-
// TODO: this is currently not implemented
108-
return ReturnValue(uint8_t{false});
109107
case UR_CONTEXT_INFO_USM_FILL2D_SUPPORT:
110-
// 2D USM fill is not supported.
111-
return ReturnValue(uint8_t{false});
108+
case UR_CONTEXT_INFO_ATOMIC_MEMORY_ORDER_CAPABILITIES:
109+
case UR_CONTEXT_INFO_ATOMIC_MEMORY_SCOPE_CAPABILITIES:
110+
case UR_CONTEXT_INFO_ATOMIC_FENCE_ORDER_CAPABILITIES:
111+
case UR_CONTEXT_INFO_ATOMIC_FENCE_SCOPE_CAPABILITIES:
112+
return UR_RESULT_ERROR_UNSUPPORTED_ENUMERATION;
112113
default:
113-
return UR_RESULT_ERROR_UNSUPPORTED_FEATURE;
114+
return UR_RESULT_ERROR_INVALID_ENUMERATION;
114115
}
115116
}
117+
118+
ur_result_t urContextSetExtendedDeleter(
119+
ur_context_handle_t Context, ///< [in] handle of the context.
120+
ur_context_extended_deleter_t
121+
Deleter, ///< [in] Function pointer to extended deleter.
122+
void *UserData ///< [in][out][optional] pointer to data to be passed to
123+
///< callback.
124+
) {
125+
std::ignore = Context;
126+
std::ignore = Deleter;
127+
std::ignore = UserData;
128+
logger::error(logger::LegacyMessage("[UR][L0] {} function not implemented!"),
129+
"{} function not implemented!", __FUNCTION__);
130+
return UR_RESULT_ERROR_UNSUPPORTED_FEATURE;
131+
}
132+
116133
} // namespace ur::level_zero

source/adapters/native_cpu/context.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,14 +57,11 @@ urContextGetInfo(ur_context_handle_t hContext, ur_context_info_t propName,
5757
case UR_CONTEXT_INFO_USM_MEMCPY2D_SUPPORT:
5858
return returnValue(true);
5959
case UR_CONTEXT_INFO_USM_FILL2D_SUPPORT:
60-
// case UR_CONTEXT_INFO_USM_MEMSET2D_SUPPORT:
61-
// 2D USM operations currently not supported.
62-
return returnValue(false);
6360
case UR_CONTEXT_INFO_ATOMIC_MEMORY_ORDER_CAPABILITIES:
6461
case UR_CONTEXT_INFO_ATOMIC_MEMORY_SCOPE_CAPABILITIES:
6562
case UR_CONTEXT_INFO_ATOMIC_FENCE_ORDER_CAPABILITIES:
6663
case UR_CONTEXT_INFO_ATOMIC_FENCE_SCOPE_CAPABILITIES: {
67-
return UR_RESULT_ERROR_ADAPTER_SPECIFIC;
64+
return UR_RESULT_ERROR_UNSUPPORTED_ENUMERATION;
6865
}
6966
default:
7067
return UR_RESULT_ERROR_INVALID_ENUMERATION;

source/adapters/opencl/context.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,16 +79,14 @@ urContextGetInfo(ur_context_handle_t hContext, ur_context_info_t propName,
7979
switch (static_cast<uint32_t>(propName)) {
8080
/* 2D USM memops are not supported. */
8181
case UR_CONTEXT_INFO_USM_MEMCPY2D_SUPPORT:
82-
case UR_CONTEXT_INFO_USM_FILL2D_SUPPORT: {
83-
return ReturnValue(false);
84-
}
82+
case UR_CONTEXT_INFO_USM_FILL2D_SUPPORT:
8583
case UR_CONTEXT_INFO_ATOMIC_MEMORY_ORDER_CAPABILITIES:
8684
case UR_CONTEXT_INFO_ATOMIC_MEMORY_SCOPE_CAPABILITIES:
8785
case UR_CONTEXT_INFO_ATOMIC_FENCE_ORDER_CAPABILITIES:
8886
case UR_CONTEXT_INFO_ATOMIC_FENCE_SCOPE_CAPABILITIES: {
8987
/* These queries should be dealt with in context_impl.cpp by calling the
9088
* queries of each device separately and building the intersection set. */
91-
return UR_RESULT_ERROR_INVALID_ARGUMENT;
89+
return UR_RESULT_ERROR_UNSUPPORTED_ENUMERATION;
9290
}
9391
case UR_CONTEXT_INFO_NUM_DEVICES:
9492
case UR_CONTEXT_INFO_DEVICES:

test/conformance/context/urContextCreate.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,17 @@ TEST_P(urContextCreateTest, InvalidNullPointerContext) {
3636
urContextCreate(1, &device, nullptr, nullptr));
3737
}
3838

39+
TEST_P(urContextCreateTest, InvalidEnumeration) {
40+
auto device = GetParam();
41+
42+
ur_context_properties_t properties{UR_STRUCTURE_TYPE_CONTEXT_PROPERTIES,
43+
nullptr, UR_CONTEXT_FLAGS_MASK};
44+
uur::raii::Context context = nullptr;
45+
46+
ASSERT_EQ_RESULT(UR_RESULT_ERROR_INVALID_ENUMERATION,
47+
urContextCreate(1, &device, &properties, context.ptr()));
48+
}
49+
3950
using urContextCreateMultiDeviceTest = uur::urAllDevicesTest;
4051
TEST_F(urContextCreateMultiDeviceTest, Success) {
4152
if (devices.size() < 2) {

test/conformance/context/urContextGetInfo.cpp

Lines changed: 46 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,24 @@ struct urContextGetInfoTestWithInfoParam
1717
{UR_CONTEXT_INFO_REFERENCE_COUNT, sizeof(uint32_t)},
1818
{UR_CONTEXT_INFO_USM_MEMCPY2D_SUPPORT, sizeof(bool)},
1919
{UR_CONTEXT_INFO_USM_FILL2D_SUPPORT, sizeof(bool)},
20+
{UR_CONTEXT_INFO_ATOMIC_MEMORY_ORDER_CAPABILITIES,
21+
sizeof(ur_memory_order_capability_flags_t)},
22+
{UR_CONTEXT_INFO_ATOMIC_MEMORY_SCOPE_CAPABILITIES,
23+
sizeof(ur_memory_order_capability_flags_t)},
24+
{UR_CONTEXT_INFO_ATOMIC_FENCE_ORDER_CAPABILITIES,
25+
sizeof(ur_memory_order_capability_flags_t)},
26+
{UR_CONTEXT_INFO_ATOMIC_FENCE_SCOPE_CAPABILITIES,
27+
sizeof(ur_memory_order_capability_flags_t)}};
28+
29+
ctx_info_mem_flags_map = {
30+
{UR_CONTEXT_INFO_ATOMIC_MEMORY_ORDER_CAPABILITIES,
31+
UR_MEMORY_ORDER_CAPABILITY_FLAGS_MASK},
32+
{UR_CONTEXT_INFO_ATOMIC_MEMORY_SCOPE_CAPABILITIES,
33+
UR_MEMORY_SCOPE_CAPABILITY_FLAGS_MASK},
34+
{UR_CONTEXT_INFO_ATOMIC_FENCE_ORDER_CAPABILITIES,
35+
UR_MEMORY_ORDER_CAPABILITY_FLAGS_MASK},
36+
{UR_CONTEXT_INFO_ATOMIC_FENCE_SCOPE_CAPABILITIES,
37+
UR_MEMORY_SCOPE_CAPABILITY_FLAGS_MASK},
2038
};
2139
}
2240

@@ -26,24 +44,34 @@ struct urContextGetInfoTestWithInfoParam
2644
}
2745

2846
std::unordered_map<ur_context_info_t, size_t> ctx_info_size_map;
47+
std::unordered_map<ur_context_info_t, ur_memory_order_capability_flags_t>
48+
ctx_info_mem_flags_map;
2949
};
3050

3151
UUR_TEST_SUITE_P(urContextGetInfoTestWithInfoParam,
3252
::testing::Values(
3353

34-
UR_CONTEXT_INFO_NUM_DEVICES, //
35-
UR_CONTEXT_INFO_DEVICES, //
36-
UR_CONTEXT_INFO_USM_MEMCPY2D_SUPPORT, //
37-
UR_CONTEXT_INFO_USM_FILL2D_SUPPORT, //
38-
UR_CONTEXT_INFO_REFERENCE_COUNT //
39-
54+
UR_CONTEXT_INFO_NUM_DEVICES, //
55+
UR_CONTEXT_INFO_DEVICES, //
56+
UR_CONTEXT_INFO_USM_MEMCPY2D_SUPPORT, //
57+
UR_CONTEXT_INFO_USM_FILL2D_SUPPORT, //
58+
UR_CONTEXT_INFO_REFERENCE_COUNT, //
59+
UR_CONTEXT_INFO_ATOMIC_MEMORY_ORDER_CAPABILITIES, //
60+
UR_CONTEXT_INFO_ATOMIC_MEMORY_SCOPE_CAPABILITIES, //
61+
UR_CONTEXT_INFO_ATOMIC_FENCE_ORDER_CAPABILITIES, //
62+
UR_CONTEXT_INFO_ATOMIC_FENCE_SCOPE_CAPABILITIES //
4063
),
4164
uur::deviceTestWithParamPrinter<ur_context_info_t>);
4265

4366
TEST_P(urContextGetInfoTestWithInfoParam, Success) {
4467
ur_context_info_t info = getParam();
4568
size_t info_size = 0;
46-
ASSERT_SUCCESS(urContextGetInfo(context, info, 0, nullptr, &info_size));
69+
ur_result_t result =
70+
urContextGetInfo(context, info, 0, nullptr, &info_size);
71+
if (result != UR_RESULT_SUCCESS) {
72+
ASSERT_EQ(result, UR_RESULT_ERROR_UNSUPPORTED_ENUMERATION);
73+
return; // exit before further checks fail because this type is unsupported
74+
}
4775
ASSERT_NE(info_size, 0);
4876

4977
if (const auto expected_size = ctx_info_size_map.find(info);
@@ -83,6 +111,17 @@ TEST_P(urContextGetInfoTestWithInfoParam, Success) {
83111
ASSERT_GT(*returned_reference_count, 0U);
84112
break;
85113
}
114+
case UR_CONTEXT_INFO_ATOMIC_MEMORY_ORDER_CAPABILITIES:
115+
case UR_CONTEXT_INFO_ATOMIC_MEMORY_SCOPE_CAPABILITIES:
116+
case UR_CONTEXT_INFO_ATOMIC_FENCE_ORDER_CAPABILITIES:
117+
case UR_CONTEXT_INFO_ATOMIC_FENCE_SCOPE_CAPABILITIES: {
118+
if (const auto flags = ctx_info_mem_flags_map.find(info);
119+
flags != ctx_info_mem_flags_map.end()) {
120+
auto value = reinterpret_cast<uint32_t *>(info_data.data());
121+
ASSERT_EQ(*value & flags->second, 0);
122+
}
123+
break;
124+
}
86125
default:
87126
break;
88127
}

test/conformance/enqueue/urEnqueueUSMFill2D.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,11 @@ struct urEnqueueUSMFill2DTestWithParam
3434
UUR_RETURN_ON_FATAL_FAILURE(urQueueTestWithParam::SetUp());
3535

3636
bool memfill2d_support = false;
37-
ASSERT_SUCCESS(urContextGetInfo(
37+
[[maybe_unused]] ur_result_t result = urContextGetInfo(
3838
context, UR_CONTEXT_INFO_USM_FILL2D_SUPPORT,
39-
sizeof(memfill2d_support), &memfill2d_support, nullptr));
39+
sizeof(memfill2d_support), &memfill2d_support, nullptr);
40+
ASSERT_TRUE(result == UR_RESULT_SUCCESS ||
41+
result == UR_RESULT_ERROR_UNSUPPORTED_ENUMERATION);
4042
if (!memfill2d_support) {
4143
GTEST_SKIP() << "2D USM mem fill is not supported";
4244
}

test/conformance/enqueue/urEnqueueUSMMemcpy2D.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,11 @@ struct urEnqueueUSMMemcpy2DTestWithParam
2828
}
2929

3030
bool memcpy2d_support = false;
31-
ASSERT_SUCCESS(urContextGetInfo(
31+
[[maybe_unused]] ur_result_t result = urContextGetInfo(
3232
context, UR_CONTEXT_INFO_USM_MEMCPY2D_SUPPORT,
33-
sizeof(memcpy2d_support), &memcpy2d_support, nullptr));
33+
sizeof(memcpy2d_support), &memcpy2d_support, nullptr);
34+
ASSERT_TRUE(result == UR_RESULT_SUCCESS ||
35+
result == UR_RESULT_ERROR_UNSUPPORTED_ENUMERATION);
3436
if (!memcpy2d_support) {
3537
GTEST_SKIP() << "2D USM memcpy is not supported";
3638
}

0 commit comments

Comments
 (0)