Skip to content

Commit b8a7b01

Browse files
MrSidimsvmaksimo
andauthored
[SYCL] Add properties argument to piMemBufferCreate (#2666)
This will allow to pass property list to lower APIs. This patch adds support for cl_intel_create_buffer_with_properties extension, that adds clCreateBufferWithPropertiesINTEL API function for OpenCL 1.0 with itself is ported from OpenCL 3.0. https://www.khronos.org/registry/OpenCL/extensions/intel/cl_intel_create_buffer_with_properties.html Signed-off-by: Dmitry Sidorov <[email protected]> Co-authored-by: Viktoria Maximova <[email protected]>
1 parent ce08889 commit b8a7b01

File tree

9 files changed

+67
-32
lines changed

9 files changed

+67
-32
lines changed

sycl/include/CL/sycl/detail/pi.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -494,6 +494,12 @@ constexpr pi_mem_flags PI_MEM_FLAGS_HOST_PTR_USE = CL_MEM_USE_HOST_PTR;
494494
constexpr pi_mem_flags PI_MEM_FLAGS_HOST_PTR_COPY = CL_MEM_COPY_HOST_PTR;
495495
constexpr pi_mem_flags PI_MEM_FLAGS_HOST_PTR_ALLOC = CL_MEM_ALLOC_HOST_PTR;
496496

497+
// NOTE: this is made 64-bit to match the size of cl_mem_properties_intel to
498+
// make the translation to OpenCL transparent.
499+
// TODO: populate
500+
//
501+
using pi_mem_properties = pi_bitfield;
502+
497503
// NOTE: queue properties are implemented this way to better support bit
498504
// manipulations
499505
using pi_queue_properties = pi_bitfield;
@@ -982,9 +988,9 @@ __SYCL_EXPORT pi_result piextQueueCreateWithNativeHandle(
982988
//
983989
// Memory
984990
//
985-
__SYCL_EXPORT pi_result piMemBufferCreate(pi_context context,
986-
pi_mem_flags flags, size_t size,
987-
void *host_ptr, pi_mem *ret_mem);
991+
__SYCL_EXPORT pi_result piMemBufferCreate(
992+
pi_context context, pi_mem_flags flags, size_t size, void *host_ptr,
993+
pi_mem *ret_mem, const pi_mem_properties *properties = nullptr);
988994

989995
__SYCL_EXPORT pi_result piMemImageCreate(pi_context context, pi_mem_flags flags,
990996
const pi_image_format *image_format,

sycl/plugins/cuda/pi_cuda.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1628,9 +1628,11 @@ pi_result cuda_piextContextCreateWithNativeHandle(pi_native_handle nativeHandle,
16281628
/// \TODO Implement USE_HOST_PTR using cuHostRegister
16291629
///
16301630
pi_result cuda_piMemBufferCreate(pi_context context, pi_mem_flags flags,
1631-
size_t size, void *host_ptr, pi_mem *ret_mem) {
1631+
size_t size, void *host_ptr, pi_mem *ret_mem,
1632+
const pi_mem_properties *properties) {
16321633
// Need input memory object
16331634
assert(ret_mem != nullptr);
1635+
assert(properties == nullptr && "no mem properties goes to cuda RT yet");
16341636
// Currently, USE_HOST_PTR is not implemented using host register
16351637
// since this triggers a weird segfault after program ends.
16361638
// Setting this constant to true enables testing that behavior.

sycl/plugins/level_zero/pi_level_zero.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1908,12 +1908,15 @@ pi_result piextQueueCreateWithNativeHandle(pi_native_handle NativeHandle,
19081908
}
19091909

19101910
pi_result piMemBufferCreate(pi_context Context, pi_mem_flags Flags, size_t Size,
1911-
void *HostPtr, pi_mem *RetMem) {
1911+
void *HostPtr, pi_mem *RetMem,
1912+
const pi_mem_properties *properties) {
19121913

19131914
// TODO: implement read-only, write-only
19141915
assert((Flags & PI_MEM_FLAGS_ACCESS_RW) != 0);
19151916
assert(Context);
19161917
assert(RetMem);
1918+
assert(properties == nullptr &&
1919+
"no mem properties goes to Level-Zero RT yet");
19171920

19181921
void *Ptr;
19191922
ze_device_handle_t ZeDevice = Context->Devices[0]->ZeDevice;

sycl/plugins/opencl/pi_opencl.cpp

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ CONSTFIX char clHostMemAllocName[] = "clHostMemAllocINTEL";
5353
CONSTFIX char clDeviceMemAllocName[] = "clDeviceMemAllocINTEL";
5454
CONSTFIX char clSharedMemAllocName[] = "clSharedMemAllocINTEL";
5555
CONSTFIX char clMemFreeName[] = "clMemFreeINTEL";
56+
CONSTFIX char clCreateBufferWithPropertiesName[] =
57+
"clCreateBufferWithPropertiesINTEL";
5658
CONSTFIX char clSetKernelArgMemPointerName[] = "clSetKernelArgMemPointerINTEL";
5759
CONSTFIX char clEnqueueMemsetName[] = "clEnqueueMemsetINTEL";
5860
CONSTFIX char clEnqueueMemcpyName[] = "clEnqueueMemcpyINTEL";
@@ -516,12 +518,25 @@ pi_result piextContextCreateWithNativeHandle(pi_native_handle nativeHandle,
516518
}
517519

518520
pi_result piMemBufferCreate(pi_context context, pi_mem_flags flags, size_t size,
519-
void *host_ptr, pi_mem *ret_mem) {
521+
void *host_ptr, pi_mem *ret_mem,
522+
const pi_mem_properties *properties) {
520523
pi_result ret_err = PI_INVALID_OPERATION;
521-
*ret_mem = cast<pi_mem>(clCreateBuffer(cast<cl_context>(context),
522-
cast<cl_mem_flags>(flags), size,
523-
host_ptr, cast<cl_int *>(&ret_err)));
524-
524+
clCreateBufferWithPropertiesINTEL_fn FuncPtr = nullptr;
525+
526+
if (properties)
527+
// First we need to look up the function pointer
528+
ret_err = getExtFuncFromContext<clCreateBufferWithPropertiesName,
529+
clCreateBufferWithPropertiesINTEL_fn>(
530+
context, &FuncPtr);
531+
532+
if (FuncPtr)
533+
*ret_mem = cast<pi_mem>(FuncPtr(cast<cl_context>(context), properties,
534+
cast<cl_mem_flags>(flags), size, host_ptr,
535+
cast<cl_int *>(&ret_err)));
536+
else
537+
*ret_mem = cast<pi_mem>(clCreateBuffer(cast<cl_context>(context),
538+
cast<cl_mem_flags>(flags), size,
539+
host_ptr, cast<cl_int *>(&ret_err)));
525540
return ret_err;
526541
}
527542

sycl/source/detail/memory_manager.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -171,8 +171,9 @@ MemoryManager::allocateBufferObject(ContextImplPtr TargetContext, void *UserPtr,
171171

172172
RT::PiMem NewMem = nullptr;
173173
const detail::plugin &Plugin = TargetContext->getPlugin();
174-
Plugin.call<PiApiKind::piMemBufferCreate>(
175-
TargetContext->getHandleRef(), CreationFlags, Size, UserPtr, &NewMem);
174+
Plugin.call<PiApiKind::piMemBufferCreate>(TargetContext->getHandleRef(),
175+
CreationFlags, Size, UserPtr,
176+
&NewMem, nullptr);
176177
return NewMem;
177178
}
178179

sycl/unittests/pi/EnqueueMemTest.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,11 @@ class EnqueueMemTest : public testing::TestWithParam<detail::plugin> {
5050
_context, _device, 0, &_queue)),
5151
PI_SUCCESS);
5252

53-
ASSERT_EQ(
54-
(plugin.call_nocheck<detail::PiApiKind::piMemBufferCreate>(
55-
_context, PI_MEM_FLAGS_ACCESS_RW,
56-
_numElementsX * _numElementsY * sizeof(pi_int32), nullptr, &_mem)),
57-
PI_SUCCESS);
53+
ASSERT_EQ((plugin.call_nocheck<detail::PiApiKind::piMemBufferCreate>(
54+
_context, PI_MEM_FLAGS_ACCESS_RW,
55+
_numElementsX * _numElementsY * sizeof(pi_int32), nullptr,
56+
&_mem, nullptr)),
57+
PI_SUCCESS);
5858
}
5959

6060
void TearDown() override {

sycl/unittests/pi/cuda/test_commands.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,10 @@ TEST_F(CudaCommandsTest, PIEnqueueReadBufferBlocking) {
7676
int output[memSize] = {};
7777

7878
pi_mem memObj;
79-
ASSERT_EQ((plugin.call_nocheck<detail::PiApiKind::piMemBufferCreate>(
80-
context_, PI_MEM_FLAGS_ACCESS_RW, bytes, nullptr, &memObj)),
81-
PI_SUCCESS);
79+
ASSERT_EQ(
80+
(plugin.call_nocheck<detail::PiApiKind::piMemBufferCreate>(
81+
context_, PI_MEM_FLAGS_ACCESS_RW, bytes, nullptr, &memObj, nullptr)),
82+
PI_SUCCESS);
8283

8384
ASSERT_EQ((plugin.call_nocheck<detail::PiApiKind::piEnqueueMemBufferWrite>(
8485
queue_, memObj, true, 0, bytes, data, 0, nullptr, nullptr)),
@@ -105,9 +106,10 @@ TEST_F(CudaCommandsTest, PIEnqueueReadBufferNonBlocking) {
105106
int output[memSize] = {};
106107

107108
pi_mem memObj;
108-
ASSERT_EQ((plugin.call_nocheck<detail::PiApiKind::piMemBufferCreate>(
109-
context_, PI_MEM_FLAGS_ACCESS_RW, bytes, nullptr, &memObj)),
110-
PI_SUCCESS);
109+
ASSERT_EQ(
110+
(plugin.call_nocheck<detail::PiApiKind::piMemBufferCreate>(
111+
context_, PI_MEM_FLAGS_ACCESS_RW, bytes, nullptr, &memObj, nullptr)),
112+
PI_SUCCESS);
111113

112114
pi_event cpIn, cpOut;
113115
ASSERT_EQ((plugin.call_nocheck<detail::PiApiKind::piEnqueueMemBufferWrite>(

sycl/unittests/pi/cuda/test_kernels.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,8 @@ TEST_F(CudaKernelsTest, PIKernelSetMemObj) {
240240
size_t memSize = 1024u;
241241
pi_mem memObj;
242242
ASSERT_EQ((plugin.call_nocheck<detail::PiApiKind::piMemBufferCreate>(
243-
context_, PI_MEM_FLAGS_ACCESS_RW, memSize, nullptr, &memObj)),
243+
context_, PI_MEM_FLAGS_ACCESS_RW, memSize, nullptr, &memObj,
244+
nullptr)),
244245
PI_SUCCESS);
245246

246247
ASSERT_EQ((plugin.call_nocheck<detail::PiApiKind::piKernelSetArg>(
@@ -274,7 +275,8 @@ TEST_F(CudaKernelsTest, PIkerneldispatch) {
274275
size_t memSize = 1024u;
275276
pi_mem memObj;
276277
ASSERT_EQ((plugin.call_nocheck<detail::PiApiKind::piMemBufferCreate>(
277-
context_, PI_MEM_FLAGS_ACCESS_RW, memSize, nullptr, &memObj)),
278+
context_, PI_MEM_FLAGS_ACCESS_RW, memSize, nullptr, &memObj,
279+
nullptr)),
278280
PI_SUCCESS);
279281

280282
ASSERT_EQ((plugin.call_nocheck<detail::PiApiKind::piextKernelSetArgMemObj>(
@@ -316,12 +318,14 @@ TEST_F(CudaKernelsTest, PIkerneldispatchTwo) {
316318
size_t memSize = 1024u;
317319
pi_mem memObj;
318320
ASSERT_EQ((plugin.call_nocheck<detail::PiApiKind::piMemBufferCreate>(
319-
context_, PI_MEM_FLAGS_ACCESS_RW, memSize, nullptr, &memObj)),
321+
context_, PI_MEM_FLAGS_ACCESS_RW, memSize, nullptr, &memObj,
322+
nullptr)),
320323
PI_SUCCESS);
321324

322325
pi_mem memObj2;
323326
ASSERT_EQ((plugin.call_nocheck<detail::PiApiKind::piMemBufferCreate>(
324-
context_, PI_MEM_FLAGS_ACCESS_RW, memSize, nullptr, &memObj2)),
327+
context_, PI_MEM_FLAGS_ACCESS_RW, memSize, nullptr, &memObj2,
328+
nullptr)),
325329
PI_SUCCESS);
326330

327331
ASSERT_EQ((plugin.call_nocheck<detail::PiApiKind::piextKernelSetArgMemObj>(

sycl/unittests/pi/cuda/test_mem_obj.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@ TEST_F(CudaTestMemObj, piMemBufferCreateSimple) {
6666
const size_t memSize = 1024u;
6767
pi_mem memObj;
6868
ASSERT_EQ((plugin.call_nocheck<detail::PiApiKind::piMemBufferCreate>(
69-
context_, PI_MEM_FLAGS_ACCESS_RW, memSize, nullptr, &memObj)),
69+
context_, PI_MEM_FLAGS_ACCESS_RW, memSize, nullptr, &memObj,
70+
nullptr)),
7071
PI_SUCCESS);
7172

7273
ASSERT_EQ((plugin.call_nocheck<detail::PiApiKind::piMemRelease>(memObj)),
@@ -78,7 +79,7 @@ TEST_F(CudaTestMemObj, piMemBufferAllocHost) {
7879
pi_mem memObj;
7980
ASSERT_EQ((plugin.call_nocheck<detail::PiApiKind::piMemBufferCreate>(
8081
context_, PI_MEM_FLAGS_ACCESS_RW | PI_MEM_FLAGS_HOST_PTR_ALLOC,
81-
memSize, nullptr, &memObj)),
82+
memSize, nullptr, &memObj, nullptr)),
8283
PI_SUCCESS);
8384

8485
ASSERT_EQ((plugin.call_nocheck<detail::PiApiKind::piMemRelease>(memObj)),
@@ -106,7 +107,8 @@ TEST_F(CudaTestMemObj, piMemBufferCreateNoActiveContext) {
106107
// to allocate the memory object
107108
pi_mem memObj;
108109
ASSERT_EQ((plugin.call_nocheck<detail::PiApiKind::piMemBufferCreate>(
109-
context_, PI_MEM_FLAGS_ACCESS_RW, memSize, nullptr, &memObj)),
110+
context_, PI_MEM_FLAGS_ACCESS_RW, memSize, nullptr, &memObj,
111+
nullptr)),
110112
PI_SUCCESS);
111113
ASSERT_NE(memObj, nullptr);
112114

@@ -128,7 +130,7 @@ TEST_F(CudaTestMemObj, piMemBufferPinnedMappedRead) {
128130
pi_mem memObj;
129131
ASSERT_EQ((plugin.call_nocheck<detail::PiApiKind::piMemBufferCreate>(
130132
context_, PI_MEM_FLAGS_ACCESS_RW | PI_MEM_FLAGS_HOST_PTR_ALLOC,
131-
memSize, nullptr, &memObj)),
133+
memSize, nullptr, &memObj, nullptr)),
132134
PI_SUCCESS);
133135

134136
ASSERT_EQ(
@@ -167,7 +169,7 @@ TEST_F(CudaTestMemObj, piMemBufferPinnedMappedWrite) {
167169
pi_mem memObj;
168170
ASSERT_EQ((plugin.call_nocheck<detail::PiApiKind::piMemBufferCreate>(
169171
context_, PI_MEM_FLAGS_ACCESS_RW | PI_MEM_FLAGS_HOST_PTR_ALLOC,
170-
memSize, nullptr, &memObj)),
172+
memSize, nullptr, &memObj, nullptr)),
171173
PI_SUCCESS);
172174

173175
int *host_ptr = nullptr;

0 commit comments

Comments
 (0)