Skip to content

Commit 7320835

Browse files
authored
Merge pull request #571 from KseniyaTikhomirova/mem_obj_proposal
[UR] Proposal of new API for memory object properties
2 parents aa5d052 + bee29ae commit 7320835

File tree

15 files changed

+117
-20
lines changed

15 files changed

+117
-20
lines changed

include/ur.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,7 @@ class ur_structure_type_v(IntEnum):
233233
DEVICE_PARTITION_PROPERTIES = 26 ## ::ur_device_partition_properties_t
234234
EXP_COMMAND_BUFFER_DESC = 27 ## ::ur_exp_command_buffer_desc_t
235235
EXP_SAMPLER_MIP_PROPERTIES = 28 ## ::ur_exp_sampler_mip_properties_t
236+
KERNEL_ARG_MEM_OBJ_PROPERTIES = 29 ## ::ur_kernel_arg_mem_obj_properties_t
236237

237238
class ur_structure_type_t(c_int):
238239
def __str__(self):
@@ -1513,6 +1514,17 @@ def __str__(self):
15131514
return str(ur_kernel_exec_info_v(self.value))
15141515

15151516

1517+
###############################################################################
1518+
## @brief Properties for for ::urKernelSetArgMemObj.
1519+
class ur_kernel_arg_mem_obj_properties_t(Structure):
1520+
_fields_ = [
1521+
("stype", ur_structure_type_t), ## [in] type of this structure, must be
1522+
## ::UR_STRUCTURE_TYPE_KERNEL_ARG_MEM_OBJ_PROPERTIES
1523+
("pNext", c_void_p), ## [in,out][optional] pointer to extension-specific structure
1524+
("memoryAccess", ur_mem_flags_t) ## [in] Memory access flag. Allowed values are: ::UR_MEM_FLAG_READ_WRITE,
1525+
## ::UR_MEM_FLAG_WRITE_ONLY, ::UR_MEM_FLAG_READ_ONLY.
1526+
]
1527+
15161528
###############################################################################
15171529
## @brief Properties for for ::urKernelCreateWithNativeHandle.
15181530
class ur_kernel_native_properties_t(Structure):
@@ -2399,9 +2411,9 @@ class ur_program_dditable_t(Structure):
23992411
###############################################################################
24002412
## @brief Function-pointer for urKernelSetArgMemObj
24012413
if __use_win_types:
2402-
_urKernelSetArgMemObj_t = WINFUNCTYPE( ur_result_t, ur_kernel_handle_t, c_ulong, ur_mem_handle_t )
2414+
_urKernelSetArgMemObj_t = WINFUNCTYPE( ur_result_t, ur_kernel_handle_t, c_ulong, POINTER(ur_kernel_arg_mem_obj_properties_t), ur_mem_handle_t )
24032415
else:
2404-
_urKernelSetArgMemObj_t = CFUNCTYPE( ur_result_t, ur_kernel_handle_t, c_ulong, ur_mem_handle_t )
2416+
_urKernelSetArgMemObj_t = CFUNCTYPE( ur_result_t, ur_kernel_handle_t, c_ulong, POINTER(ur_kernel_arg_mem_obj_properties_t), ur_mem_handle_t )
24052417

24062418
###############################################################################
24072419
## @brief Function-pointer for urKernelSetSpecializationConstants

include/ur_api.h

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,7 @@ typedef enum ur_structure_type_t {
257257
UR_STRUCTURE_TYPE_DEVICE_PARTITION_PROPERTIES = 26, ///< ::ur_device_partition_properties_t
258258
UR_STRUCTURE_TYPE_EXP_COMMAND_BUFFER_DESC = 27, ///< ::ur_exp_command_buffer_desc_t
259259
UR_STRUCTURE_TYPE_EXP_SAMPLER_MIP_PROPERTIES = 28, ///< ::ur_exp_sampler_mip_properties_t
260+
UR_STRUCTURE_TYPE_KERNEL_ARG_MEM_OBJ_PROPERTIES = 29, ///< ::ur_kernel_arg_mem_obj_properties_t
260261
/// @cond
261262
UR_STRUCTURE_TYPE_FORCE_UINT32 = 0x7fffffff
262263
/// @endcond
@@ -3893,6 +3894,17 @@ urKernelSetArgSampler(
38933894
ur_sampler_handle_t hArgValue ///< [in] handle of Sampler object.
38943895
);
38953896

3897+
///////////////////////////////////////////////////////////////////////////////
3898+
/// @brief Properties for for ::urKernelSetArgMemObj.
3899+
typedef struct ur_kernel_arg_mem_obj_properties_t {
3900+
ur_structure_type_t stype; ///< [in] type of this structure, must be
3901+
///< ::UR_STRUCTURE_TYPE_KERNEL_ARG_MEM_OBJ_PROPERTIES
3902+
void *pNext; ///< [in,out][optional] pointer to extension-specific structure
3903+
ur_mem_flags_t memoryAccess; ///< [in] Memory access flag. Allowed values are: ::UR_MEM_FLAG_READ_WRITE,
3904+
///< ::UR_MEM_FLAG_WRITE_ONLY, ::UR_MEM_FLAG_READ_ONLY.
3905+
3906+
} ur_kernel_arg_mem_obj_properties_t;
3907+
38963908
///////////////////////////////////////////////////////////////////////////////
38973909
/// @brief Set a Memory object as the argument value of a Kernel.
38983910
///
@@ -3910,9 +3922,10 @@ urKernelSetArgSampler(
39103922
/// - ::UR_RESULT_ERROR_INVALID_KERNEL_ARGUMENT_INDEX
39113923
UR_APIEXPORT ur_result_t UR_APICALL
39123924
urKernelSetArgMemObj(
3913-
ur_kernel_handle_t hKernel, ///< [in] handle of the kernel object
3914-
uint32_t argIndex, ///< [in] argument index in range [0, num args - 1]
3915-
ur_mem_handle_t hArgValue ///< [in][optional] handle of Memory object.
3925+
ur_kernel_handle_t hKernel, ///< [in] handle of the kernel object
3926+
uint32_t argIndex, ///< [in] argument index in range [0, num args - 1]
3927+
const ur_kernel_arg_mem_obj_properties_t *pProperties, ///< [in][optional] pointer to Memory object properties.
3928+
ur_mem_handle_t hArgValue ///< [in][optional] handle of Memory object.
39163929
);
39173930

39183931
///////////////////////////////////////////////////////////////////////////////
@@ -7432,6 +7445,7 @@ typedef struct ur_kernel_set_arg_sampler_params_t {
74327445
typedef struct ur_kernel_set_arg_mem_obj_params_t {
74337446
ur_kernel_handle_t *phKernel;
74347447
uint32_t *pargIndex;
7448+
const ur_kernel_arg_mem_obj_properties_t **ppProperties;
74357449
ur_mem_handle_t *phArgValue;
74367450
} ur_kernel_set_arg_mem_obj_params_t;
74377451

include/ur_ddi.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -517,6 +517,7 @@ typedef ur_result_t(UR_APICALL *ur_pfnKernelSetArgSampler_t)(
517517
typedef ur_result_t(UR_APICALL *ur_pfnKernelSetArgMemObj_t)(
518518
ur_kernel_handle_t,
519519
uint32_t,
520+
const ur_kernel_arg_mem_obj_properties_t *,
520521
ur_mem_handle_t);
521522

522523
///////////////////////////////////////////////////////////////////////////////

scripts/core/PROG.rst

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -216,9 +216,9 @@ explicit and implicit kernel arguments along with data needed for launch.
216216
// Create kernel object from program
217217
${x}_kernel_handle_t hKernel;
218218
${x}KernelCreate(hProgram, "addVectors", &hKernel);
219-
${x}KernelSetArgMemObj(hKernel, 0, A);
220-
${x}KernelSetArgMemObj(hKernel, 1, B);
221-
${x}KernelSetArgMemObj(hKernel, 2, C);
219+
${x}KernelSetArgMemObj(hKernel, 0, nullptr, A);
220+
${x}KernelSetArgMemObj(hKernel, 1, nullptr, B);
221+
${x}KernelSetArgMemObj(hKernel, 2, nullptr, C);
222222
223223
Queue and Enqueue
224224
=================

scripts/core/common.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,8 @@ etors:
331331
desc: $x_exp_command_buffer_desc_t
332332
- name: EXP_SAMPLER_MIP_PROPERTIES
333333
desc: $x_exp_sampler_mip_properties_t
334+
- name: KERNEL_ARG_MEM_OBJ_PROPERTIES
335+
desc: $x_kernel_arg_mem_obj_properties_t
334336
--- #--------------------------------------------------------------------------
335337
type: struct
336338
desc: "Base for all properties types"

scripts/core/kernel.yml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,16 @@ params:
358358
returns:
359359
- $X_RESULT_ERROR_INVALID_KERNEL_ARGUMENT_INDEX
360360
--- #--------------------------------------------------------------------------
361+
type: struct
362+
desc: "Properties for for $xKernelSetArgMemObj."
363+
class: $xKernel
364+
name: $x_kernel_arg_mem_obj_properties_t
365+
base: $x_base_properties_t
366+
members:
367+
- type: $x_mem_flags_t
368+
name: memoryAccess
369+
desc: "[in] Memory access flag. Allowed values are: $X_MEM_FLAG_READ_WRITE, $X_MEM_FLAG_WRITE_ONLY, $X_MEM_FLAG_READ_ONLY."
370+
--- #--------------------------------------------------------------------------
361371
type: function
362372
desc: "Set a Memory object as the argument value of a Kernel."
363373
class: $xKernel
@@ -372,6 +382,9 @@ params:
372382
- type: "uint32_t"
373383
name: argIndex
374384
desc: "[in] argument index in range [0, num args - 1]"
385+
- type: "const $x_kernel_arg_mem_obj_properties_t*"
386+
name: pProperties
387+
desc: "[in][optional] pointer to Memory object properties."
375388
- type: "$x_mem_handle_t"
376389
name: hArgValue
377390
desc: "[in][optional] handle of Memory object."

source/adapters/null/ur_nullddi.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1955,14 +1955,16 @@ __urdlllocal ur_result_t UR_APICALL urKernelSetArgSampler(
19551955
__urdlllocal ur_result_t UR_APICALL urKernelSetArgMemObj(
19561956
ur_kernel_handle_t hKernel, ///< [in] handle of the kernel object
19571957
uint32_t argIndex, ///< [in] argument index in range [0, num args - 1]
1958+
const ur_kernel_arg_mem_obj_properties_t
1959+
*pProperties, ///< [in][optional] pointer to Memory object properties.
19581960
ur_mem_handle_t hArgValue ///< [in][optional] handle of Memory object.
19591961
) try {
19601962
ur_result_t result = UR_RESULT_SUCCESS;
19611963

19621964
// if the driver has created a custom function, then call it instead of using the generic path
19631965
auto pfnSetArgMemObj = d_context.urDdiTable.Kernel.pfnSetArgMemObj;
19641966
if (nullptr != pfnSetArgMemObj) {
1965-
result = pfnSetArgMemObj(hKernel, argIndex, hArgValue);
1967+
result = pfnSetArgMemObj(hKernel, argIndex, pProperties, hArgValue);
19661968
} else {
19671969
// generic implementation
19681970
}

source/common/ur_params.hpp

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,9 @@ inline std::ostream &operator<<(std::ostream &os,
310310
inline std::ostream &operator<<(std::ostream &os,
311311
enum ur_kernel_exec_info_t value);
312312
inline std::ostream &
313+
operator<<(std::ostream &os,
314+
const struct ur_kernel_arg_mem_obj_properties_t params);
315+
inline std::ostream &
313316
operator<<(std::ostream &os, const struct ur_kernel_native_properties_t params);
314317
inline std::ostream &operator<<(std::ostream &os, enum ur_queue_info_t value);
315318
inline std::ostream &operator<<(std::ostream &os, enum ur_queue_flag_t value);
@@ -757,6 +760,10 @@ inline std::ostream &operator<<(std::ostream &os,
757760
case UR_STRUCTURE_TYPE_EXP_SAMPLER_MIP_PROPERTIES:
758761
os << "UR_STRUCTURE_TYPE_EXP_SAMPLER_MIP_PROPERTIES";
759762
break;
763+
764+
case UR_STRUCTURE_TYPE_KERNEL_ARG_MEM_OBJ_PROPERTIES:
765+
os << "UR_STRUCTURE_TYPE_KERNEL_ARG_MEM_OBJ_PROPERTIES";
766+
break;
760767
default:
761768
os << "unknown enumerator";
762769
break;
@@ -938,6 +945,12 @@ inline void serializeStruct(std::ostream &os, const void *ptr) {
938945
(const ur_exp_sampler_mip_properties_t *)ptr;
939946
ur_params::serializePtr(os, pstruct);
940947
} break;
948+
949+
case UR_STRUCTURE_TYPE_KERNEL_ARG_MEM_OBJ_PROPERTIES: {
950+
const ur_kernel_arg_mem_obj_properties_t *pstruct =
951+
(const ur_kernel_arg_mem_obj_properties_t *)ptr;
952+
ur_params::serializePtr(os, pstruct);
953+
} break;
941954
default:
942955
os << "unknown enumerator";
943956
break;
@@ -7241,6 +7254,28 @@ inline void serializeTagged(std::ostream &os, const void *ptr,
72417254
}
72427255
} // namespace ur_params
72437256
inline std::ostream &
7257+
operator<<(std::ostream &os,
7258+
const struct ur_kernel_arg_mem_obj_properties_t params) {
7259+
os << "(struct ur_kernel_arg_mem_obj_properties_t){";
7260+
7261+
os << ".stype = ";
7262+
7263+
os << (params.stype);
7264+
7265+
os << ", ";
7266+
os << ".pNext = ";
7267+
7268+
ur_params::serializeStruct(os, (params.pNext));
7269+
7270+
os << ", ";
7271+
os << ".memoryAccess = ";
7272+
7273+
ur_params::serializeFlag<ur_mem_flag_t>(os, (params.memoryAccess));
7274+
7275+
os << "}";
7276+
return os;
7277+
}
7278+
inline std::ostream &
72447279
operator<<(std::ostream &os,
72457280
const struct ur_kernel_native_properties_t params) {
72467281
os << "(struct ur_kernel_native_properties_t){";
@@ -11835,6 +11870,11 @@ operator<<(std::ostream &os,
1183511870

1183611871
os << *(params->pargIndex);
1183711872

11873+
os << ", ";
11874+
os << ".pProperties = ";
11875+
11876+
ur_params::serializePtr(os, *(params->ppProperties));
11877+
1183811878
os << ", ";
1183911879
os << ".hArgValue = ";
1184011880

source/loader/layers/tracing/ur_trcddi.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2228,6 +2228,8 @@ __urdlllocal ur_result_t UR_APICALL urKernelSetArgSampler(
22282228
__urdlllocal ur_result_t UR_APICALL urKernelSetArgMemObj(
22292229
ur_kernel_handle_t hKernel, ///< [in] handle of the kernel object
22302230
uint32_t argIndex, ///< [in] argument index in range [0, num args - 1]
2231+
const ur_kernel_arg_mem_obj_properties_t
2232+
*pProperties, ///< [in][optional] pointer to Memory object properties.
22312233
ur_mem_handle_t hArgValue ///< [in][optional] handle of Memory object.
22322234
) {
22332235
auto pfnSetArgMemObj = context.urDdiTable.Kernel.pfnSetArgMemObj;
@@ -2237,11 +2239,12 @@ __urdlllocal ur_result_t UR_APICALL urKernelSetArgMemObj(
22372239
}
22382240

22392241
ur_kernel_set_arg_mem_obj_params_t params = {&hKernel, &argIndex,
2240-
&hArgValue};
2242+
&pProperties, &hArgValue};
22412243
uint64_t instance = context.notify_begin(UR_FUNCTION_KERNEL_SET_ARG_MEM_OBJ,
22422244
"urKernelSetArgMemObj", &params);
22432245

2244-
ur_result_t result = pfnSetArgMemObj(hKernel, argIndex, hArgValue);
2246+
ur_result_t result =
2247+
pfnSetArgMemObj(hKernel, argIndex, pProperties, hArgValue);
22452248

22462249
context.notify_end(UR_FUNCTION_KERNEL_SET_ARG_MEM_OBJ,
22472250
"urKernelSetArgMemObj", &params, &result, instance);

source/loader/layers/validation/ur_valddi.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2729,6 +2729,8 @@ __urdlllocal ur_result_t UR_APICALL urKernelSetArgSampler(
27292729
__urdlllocal ur_result_t UR_APICALL urKernelSetArgMemObj(
27302730
ur_kernel_handle_t hKernel, ///< [in] handle of the kernel object
27312731
uint32_t argIndex, ///< [in] argument index in range [0, num args - 1]
2732+
const ur_kernel_arg_mem_obj_properties_t
2733+
*pProperties, ///< [in][optional] pointer to Memory object properties.
27322734
ur_mem_handle_t hArgValue ///< [in][optional] handle of Memory object.
27332735
) {
27342736
auto pfnSetArgMemObj = context.urDdiTable.Kernel.pfnSetArgMemObj;
@@ -2743,7 +2745,8 @@ __urdlllocal ur_result_t UR_APICALL urKernelSetArgMemObj(
27432745
}
27442746
}
27452747

2746-
ur_result_t result = pfnSetArgMemObj(hKernel, argIndex, hArgValue);
2748+
ur_result_t result =
2749+
pfnSetArgMemObj(hKernel, argIndex, pProperties, hArgValue);
27472750

27482751
return result;
27492752
}

source/loader/ur_ldrddi.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2569,6 +2569,8 @@ __urdlllocal ur_result_t UR_APICALL urKernelSetArgSampler(
25692569
__urdlllocal ur_result_t UR_APICALL urKernelSetArgMemObj(
25702570
ur_kernel_handle_t hKernel, ///< [in] handle of the kernel object
25712571
uint32_t argIndex, ///< [in] argument index in range [0, num args - 1]
2572+
const ur_kernel_arg_mem_obj_properties_t
2573+
*pProperties, ///< [in][optional] pointer to Memory object properties.
25722574
ur_mem_handle_t hArgValue ///< [in][optional] handle of Memory object.
25732575
) {
25742576
ur_result_t result = UR_RESULT_SUCCESS;
@@ -2589,7 +2591,7 @@ __urdlllocal ur_result_t UR_APICALL urKernelSetArgMemObj(
25892591
: nullptr;
25902592

25912593
// forward to device-platform
2592-
result = pfnSetArgMemObj(hKernel, argIndex, hArgValue);
2594+
result = pfnSetArgMemObj(hKernel, argIndex, pProperties, hArgValue);
25932595

25942596
return result;
25952597
}

source/loader/ur_libapi.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3039,14 +3039,16 @@ ur_result_t UR_APICALL urKernelSetArgSampler(
30393039
ur_result_t UR_APICALL urKernelSetArgMemObj(
30403040
ur_kernel_handle_t hKernel, ///< [in] handle of the kernel object
30413041
uint32_t argIndex, ///< [in] argument index in range [0, num args - 1]
3042+
const ur_kernel_arg_mem_obj_properties_t
3043+
*pProperties, ///< [in][optional] pointer to Memory object properties.
30423044
ur_mem_handle_t hArgValue ///< [in][optional] handle of Memory object.
30433045
) try {
30443046
auto pfnSetArgMemObj = ur_lib::context->urDdiTable.Kernel.pfnSetArgMemObj;
30453047
if (nullptr == pfnSetArgMemObj) {
30463048
return UR_RESULT_ERROR_UNINITIALIZED;
30473049
}
30483050

3049-
return pfnSetArgMemObj(hKernel, argIndex, hArgValue);
3051+
return pfnSetArgMemObj(hKernel, argIndex, pProperties, hArgValue);
30503052
} catch (...) {
30513053
return exceptionToResult(std::current_exception());
30523054
}

source/ur_api.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2545,6 +2545,8 @@ ur_result_t UR_APICALL urKernelSetArgSampler(
25452545
ur_result_t UR_APICALL urKernelSetArgMemObj(
25462546
ur_kernel_handle_t hKernel, ///< [in] handle of the kernel object
25472547
uint32_t argIndex, ///< [in] argument index in range [0, num args - 1]
2548+
const ur_kernel_arg_mem_obj_properties_t
2549+
*pProperties, ///< [in][optional] pointer to Memory object properties.
25482550
ur_mem_handle_t hArgValue ///< [in][optional] handle of Memory object.
25492551
) {
25502552
ur_result_t result = UR_RESULT_SUCCESS;

test/conformance/kernel/urKernelSetArgMemObj.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,19 +26,20 @@ struct urKernelSetArgMemObjTest : uur::urKernelTest {
2626
UUR_INSTANTIATE_KERNEL_TEST_SUITE_P(urKernelSetArgMemObjTest);
2727

2828
TEST_P(urKernelSetArgMemObjTest, Success) {
29-
ASSERT_SUCCESS(urKernelSetArgMemObj(kernel, 0, buffer));
29+
ASSERT_SUCCESS(urKernelSetArgMemObj(kernel, 0, nullptr, buffer));
3030
}
3131

3232
TEST_P(urKernelSetArgMemObjTest, InvalidNullHandleKernel) {
3333
ASSERT_EQ_RESULT(UR_RESULT_ERROR_INVALID_NULL_HANDLE,
34-
urKernelSetArgMemObj(nullptr, 0, buffer));
34+
urKernelSetArgMemObj(nullptr, 0, nullptr, buffer));
3535
}
3636

3737
TEST_P(urKernelSetArgMemObjTest, InvalidKernelArgumentIndex) {
3838
size_t num_kernel_args = 0;
3939
ASSERT_SUCCESS(urKernelGetInfo(kernel, UR_KERNEL_INFO_NUM_ARGS,
4040
sizeof(num_kernel_args), &num_kernel_args,
4141
nullptr));
42-
ASSERT_EQ_RESULT(UR_RESULT_ERROR_INVALID_KERNEL_ARGUMENT_INDEX,
43-
urKernelSetArgMemObj(kernel, num_kernel_args + 1, buffer));
42+
ASSERT_EQ_RESULT(
43+
UR_RESULT_ERROR_INVALID_KERNEL_ARGUMENT_INDEX,
44+
urKernelSetArgMemObj(kernel, num_kernel_args + 1, nullptr, buffer));
4445
}

test/conformance/testing/include/uur/fixtures.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -696,8 +696,8 @@ struct urKernelExecutionTest : urKernelTest {
696696
sizeof(zero), 0, size, 0, nullptr,
697697
nullptr));
698698
ASSERT_SUCCESS(urQueueFinish(queue));
699-
ASSERT_SUCCESS(
700-
urKernelSetArgMemObj(kernel, current_arg_index, mem_handle));
699+
ASSERT_SUCCESS(urKernelSetArgMemObj(kernel, current_arg_index, nullptr,
700+
mem_handle));
701701

702702
// This emulates the offset struct sycl adds for a 1D buffer accessor.
703703
struct {

0 commit comments

Comments
 (0)