Skip to content

Commit 3a92906

Browse files
committed
Fixes to address fails after merge with master branch
* Include Level Zero to pi unit testing * Provide correct flag during buffer creation in EnqueueMemTest unit test * Wait after piEnqueueMemBufferFill in EnqueueMemTest unit test because otherwise it is not guaranteed that buffer will be filled with data before reading to the host. * Event provided to pi call can be null if we don't want to track status of the enqueued command. Handle this case in L0 plugin. * Handle PI_DEVICE_TYPE_DEFAULT in L0 plugin properly Signed-off-by: Artur Gainullin <artur.gainullin@intel.com>
1 parent 88559cf commit 3a92906

File tree

3 files changed

+110
-70
lines changed

3 files changed

+110
-70
lines changed

sycl/plugins/level_zero/pi_level0.cpp

Lines changed: 99 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -573,8 +573,9 @@ pi_result piDevicesGet(pi_platform Platform, pi_device_type DeviceType,
573573
// Get number of devices supporting L0
574574
uint32_t ZeDeviceCount = 0;
575575
const bool AskingForGPU = (DeviceType & PI_DEVICE_TYPE_GPU);
576+
const bool AskingForDefault = (DeviceType == PI_DEVICE_TYPE_DEFAULT);
576577
ZE_CALL(zeDeviceGet(ZeDriver, &ZeDeviceCount, nullptr));
577-
if (ZeDeviceCount == 0 || !AskingForGPU) {
578+
if (ZeDeviceCount == 0 || !(AskingForGPU || AskingForDefault)) {
578579
if (NumDevices)
579580
*NumDevices = 0;
580581
return PI_SUCCESS;
@@ -2122,15 +2123,18 @@ piEnqueueKernelLaunch(pi_queue Queue, pi_kernel Kernel, pi_uint32 WorkDim,
21222123
if (auto Res = Queue->Context->Device->createCommandList(&ZeCommandList))
21232124
return Res;
21242125

2125-
auto Res = piEventCreate(Kernel->Program->Context, Event);
2126-
if (Res != PI_SUCCESS)
2127-
return Res;
2126+
ze_event_handle_t ZeEvent = nullptr;
2127+
if (Event) {
2128+
auto Res = piEventCreate(Kernel->Program->Context, Event);
2129+
if (Res != PI_SUCCESS)
2130+
return Res;
21282131

2129-
(*Event)->Queue = Queue;
2130-
(*Event)->CommandType = PI_COMMAND_TYPE_NDRANGE_KERNEL;
2131-
(*Event)->ZeCommandList = ZeCommandList;
2132+
(*Event)->Queue = Queue;
2133+
(*Event)->CommandType = PI_COMMAND_TYPE_NDRANGE_KERNEL;
2134+
(*Event)->ZeCommandList = ZeCommandList;
21322135

2133-
ze_event_handle_t ZeEvent = (*Event)->ZeEvent;
2136+
ZeEvent = (*Event)->ZeEvent;
2137+
}
21342138

21352139
ze_event_handle_t *ZeEventWaitList =
21362140
_pi_event::createZeEventList(NumEventsInWaitList, EventWaitList);
@@ -2176,6 +2180,7 @@ pi_result piEventCreate(pi_context Context, pi_event *RetEvent) {
21762180
ZE_CALL(zeEventCreate(ZeEventPool, &ZeEventDesc, &ZeEvent));
21772181

21782182
try {
2183+
assert(RetEvent);
21792184
*RetEvent =
21802185
new _pi_event(ZeEvent, ZeEventPool, Context, PI_COMMAND_TYPE_USER);
21812186
} catch (const std::bad_alloc &) {
@@ -2537,15 +2542,18 @@ enqueueMemCopyHelper(pi_command_type CommandType, pi_queue Queue, void *Dst,
25372542
if (auto Res = Queue->Context->Device->createCommandList(&ZeCommandList))
25382543
return Res;
25392544

2540-
auto Res = piEventCreate(Queue->Context, Event);
2541-
if (Res != PI_SUCCESS)
2542-
return Res;
2545+
ze_event_handle_t ZeEvent = nullptr;
2546+
if (Event) {
2547+
auto Res = piEventCreate(Queue->Context, Event);
2548+
if (Res != PI_SUCCESS)
2549+
return Res;
25432550

2544-
(*Event)->Queue = Queue;
2545-
(*Event)->CommandType = CommandType;
2546-
(*Event)->ZeCommandList = ZeCommandList;
2551+
(*Event)->Queue = Queue;
2552+
(*Event)->CommandType = CommandType;
2553+
(*Event)->ZeCommandList = ZeCommandList;
25472554

2548-
ze_event_handle_t ZeEvent = (*Event)->ZeEvent;
2555+
ZeEvent = (*Event)->ZeEvent;
2556+
}
25492557

25502558
ze_event_handle_t *ZeEventWaitList =
25512559
_pi_event::createZeEventList(NumEventsInWaitList, EventWaitList);
@@ -2592,15 +2600,18 @@ static pi_result enqueueMemCopyRectHelper(
25922600
if (auto Res = Queue->Context->Device->createCommandList(&ZeCommandList))
25932601
return Res;
25942602

2595-
auto Res = piEventCreate(Queue->Context, Event);
2596-
if (Res != PI_SUCCESS)
2597-
return Res;
2603+
ze_event_handle_t ZeEvent = nullptr;
2604+
if (Event) {
2605+
auto Res = piEventCreate(Queue->Context, Event);
2606+
if (Res != PI_SUCCESS)
2607+
return Res;
25982608

2599-
(*Event)->Queue = Queue;
2600-
(*Event)->CommandType = CommandType;
2601-
(*Event)->ZeCommandList = ZeCommandList;
2609+
(*Event)->Queue = Queue;
2610+
(*Event)->CommandType = CommandType;
2611+
(*Event)->ZeCommandList = ZeCommandList;
26022612

2603-
ze_event_handle_t ZeEvent = (*Event)->ZeEvent;
2613+
ZeEvent = (*Event)->ZeEvent;
2614+
}
26042615

26052616
ze_event_handle_t *ZeEventWaitList =
26062617
_pi_event::createZeEventList(NumEventsInWaitList, EventWaitList);
@@ -2749,15 +2760,18 @@ enqueueMemFillHelper(pi_command_type CommandType, pi_queue Queue, void *Ptr,
27492760
if (auto Res = Queue->Context->Device->createCommandList(&ZeCommandList))
27502761
return Res;
27512762

2752-
auto Res = piEventCreate(Queue->Context, Event);
2753-
if (Res != PI_SUCCESS)
2754-
return Res;
2763+
ze_event_handle_t ZeEvent = nullptr;
2764+
if (Event) {
2765+
auto Res = piEventCreate(Queue->Context, Event);
2766+
if (Res != PI_SUCCESS)
2767+
return Res;
27552768

2756-
(*Event)->Queue = Queue;
2757-
(*Event)->CommandType = CommandType;
2758-
(*Event)->ZeCommandList = ZeCommandList;
2769+
(*Event)->Queue = Queue;
2770+
(*Event)->CommandType = CommandType;
2771+
(*Event)->ZeCommandList = ZeCommandList;
27592772

2760-
ze_event_handle_t ZeEvent = (*Event)->ZeEvent;
2773+
ZeEvent = (*Event)->ZeEvent;
2774+
}
27612775

27622776
ze_event_handle_t *ZeEventWaitList =
27632777
_pi_event::createZeEventList(NumEventsInWaitList, EventWaitList);
@@ -2824,13 +2838,18 @@ piEnqueueMemBufferMap(pi_queue Queue, pi_mem Buffer, pi_bool BlockingMap,
28242838
if (auto Res = Queue->Context->Device->createCommandList(&ZeCommandList))
28252839
return Res;
28262840

2827-
auto Res = piEventCreate(Queue->Context, Event);
2828-
if (Res != PI_SUCCESS)
2829-
return Res;
2841+
ze_event_handle_t ZeEvent = nullptr;
2842+
if (Event) {
2843+
auto Res = piEventCreate(Queue->Context, Event);
2844+
if (Res != PI_SUCCESS)
2845+
return Res;
28302846

2831-
(*Event)->Queue = Queue;
2832-
(*Event)->CommandType = PI_COMMAND_TYPE_MEM_BUFFER_MAP;
2833-
(*Event)->ZeCommandList = ZeCommandList;
2847+
(*Event)->Queue = Queue;
2848+
(*Event)->CommandType = PI_COMMAND_TYPE_MEM_BUFFER_MAP;
2849+
(*Event)->ZeCommandList = ZeCommandList;
2850+
2851+
ZeEvent = (*Event)->ZeEvent;
2852+
}
28342853

28352854
ze_event_handle_t *ZeEventWaitList =
28362855
_pi_event::createZeEventList(NumEventsInWaitList, EventWaitList);
@@ -2865,7 +2884,6 @@ piEnqueueMemBufferMap(pi_queue Queue, pi_mem Buffer, pi_bool BlockingMap,
28652884
RetMap));
28662885
}
28672886

2868-
ze_event_handle_t ZeEvent = (*Event)->ZeEvent;
28692887
ZE_CALL(zeCommandListAppendMemoryCopy(
28702888
ZeCommandList, *RetMap, pi_cast<char *>(Buffer->getZeHandle()) + Offset,
28712889
Size, ZeEvent));
@@ -2891,13 +2909,18 @@ pi_result piEnqueueMemUnmap(pi_queue Queue, pi_mem MemObj, void *MappedPtr,
28912909
// of unmap completion.
28922910
assert(Event);
28932911

2894-
auto Res = piEventCreate(Queue->Context, Event);
2895-
if (Res != PI_SUCCESS)
2896-
return Res;
2912+
ze_event_handle_t ZeEvent = nullptr;
2913+
if (Event) {
2914+
auto Res = piEventCreate(Queue->Context, Event);
2915+
if (Res != PI_SUCCESS)
2916+
return Res;
28972917

2898-
(*Event)->Queue = Queue;
2899-
(*Event)->CommandType = PI_COMMAND_TYPE_MEM_BUFFER_UNMAP;
2900-
(*Event)->ZeCommandList = ZeCommandList;
2918+
(*Event)->Queue = Queue;
2919+
(*Event)->CommandType = PI_COMMAND_TYPE_MEM_BUFFER_UNMAP;
2920+
(*Event)->ZeCommandList = ZeCommandList;
2921+
2922+
ZeEvent = (*Event)->ZeEvent;
2923+
}
29012924

29022925
ze_event_handle_t *ZeEventWaitList =
29032926
_pi_event::createZeEventList(NumEventsInWaitList, EventWaitList);
@@ -2914,7 +2937,6 @@ pi_result piEnqueueMemUnmap(pi_queue Queue, pi_mem MemObj, void *MappedPtr,
29142937
if (pi_result Res = MemObj->removeMapping(MappedPtr, MapInfo))
29152938
return Res;
29162939

2917-
ze_event_handle_t ZeEvent = (*Event)->ZeEvent;
29182940
ZE_CALL(zeCommandListAppendMemoryCopy(
29192941
ZeCommandList, pi_cast<char *>(MemObj->getZeHandle()) + MapInfo.Offset,
29202942
MappedPtr, MapInfo.Size, ZeEvent));
@@ -2998,15 +3020,18 @@ enqueueMemImageCommandHelper(pi_command_type CommandType, pi_queue Queue,
29983020
if (auto Res = Queue->Context->Device->createCommandList(&ZeCommandList))
29993021
return Res;
30003022

3001-
auto Res = piEventCreate(Queue->Context, Event);
3002-
if (Res != PI_SUCCESS)
3003-
return Res;
3023+
ze_event_handle_t ZeEvent = nullptr;
3024+
if (Event) {
3025+
auto Res = piEventCreate(Queue->Context, Event);
3026+
if (Res != PI_SUCCESS)
3027+
return Res;
30043028

3005-
(*Event)->Queue = Queue;
3006-
(*Event)->CommandType = CommandType;
3007-
(*Event)->ZeCommandList = ZeCommandList;
3029+
(*Event)->Queue = Queue;
3030+
(*Event)->CommandType = CommandType;
3031+
(*Event)->ZeCommandList = ZeCommandList;
30083032

3009-
ze_event_handle_t ZeEvent = (*Event)->ZeEvent;
3033+
ZeEvent = (*Event)->ZeEvent;
3034+
}
30103035

30113036
ze_event_handle_t *ZeEventWaitList =
30123037
_pi_event::createZeEventList(NumEventsInWaitList, EventWaitList);
@@ -3349,13 +3374,18 @@ pi_result piextUSMEnqueuePrefetch(pi_queue Queue, const void *Ptr, size_t Size,
33493374
return Res;
33503375

33513376
// TODO: do we need to create a unique command type for this?
3352-
auto Res = piEventCreate(Queue->Context, Event);
3353-
if (Res != PI_SUCCESS)
3354-
return Res;
3377+
ze_event_handle_t ZeEvent = nullptr;
3378+
if (Event) {
3379+
auto Res = piEventCreate(Queue->Context, Event);
3380+
if (Res != PI_SUCCESS)
3381+
return Res;
3382+
3383+
(*Event)->Queue = Queue;
3384+
(*Event)->CommandType = PI_COMMAND_TYPE_USER;
3385+
(*Event)->ZeCommandList = ZeCommandList;
33553386

3356-
(*Event)->Queue = Queue;
3357-
(*Event)->CommandType = PI_COMMAND_TYPE_USER;
3358-
(*Event)->ZeCommandList = ZeCommandList;
3387+
ZeEvent = (*Event)->ZeEvent;
3388+
}
33593389

33603390
ze_event_handle_t *ZeEventWaitList =
33613391
_pi_event::createZeEventList(NumEventsInWaitlist, EventsWaitlist);
@@ -3368,7 +3398,7 @@ pi_result piextUSMEnqueuePrefetch(pi_queue Queue, const void *Ptr, size_t Size,
33683398

33693399
// TODO: L0 does not have a completion "event" with the prefetch API,
33703400
// so manually add command to signal our event.
3371-
ZE_CALL(zeCommandListAppendSignalEvent(ZeCommandList, (*Event)->ZeEvent));
3401+
ZE_CALL(zeCommandListAppendSignalEvent(ZeCommandList, ZeEvent));
33723402

33733403
if (auto Res = Queue->executeCommandList(ZeCommandList, false))
33743404
return Res;
@@ -3433,20 +3463,25 @@ pi_result piextUSMEnqueueMemAdvise(pi_queue Queue, const void *Ptr,
34333463
return Res;
34343464

34353465
// TODO: do we need to create a unique command type for this?
3436-
auto Res = piEventCreate(Queue->Context, Event);
3437-
if (Res != PI_SUCCESS)
3438-
return Res;
3466+
ze_event_handle_t ZeEvent = nullptr;
3467+
if (Event) {
3468+
auto Res = piEventCreate(Queue->Context, Event);
3469+
if (Res != PI_SUCCESS)
3470+
return Res;
3471+
3472+
(*Event)->Queue = Queue;
3473+
(*Event)->CommandType = PI_COMMAND_TYPE_USER;
3474+
(*Event)->ZeCommandList = ZeCommandList;
34393475

3440-
(*Event)->Queue = Queue;
3441-
(*Event)->CommandType = PI_COMMAND_TYPE_USER;
3442-
(*Event)->ZeCommandList = ZeCommandList;
3476+
ZeEvent = (*Event)->ZeEvent;
3477+
}
34433478

34443479
ZE_CALL(zeCommandListAppendMemAdvise(
34453480
ZeCommandList, Queue->Context->Device->ZeDevice, Ptr, Length, ZeAdvice));
34463481

34473482
// TODO: L0 does not have a completion "event" with the advise API,
34483483
// so manually add command to signal our event.
3449-
ZE_CALL(zeCommandListAppendSignalEvent(ZeCommandList, (*Event)->ZeEvent));
3484+
ZE_CALL(zeCommandListAppendSignalEvent(ZeCommandList, ZeEvent));
34503485

34513486
Queue->executeCommandList(ZeCommandList, false);
34523487
return PI_SUCCESS;

sycl/unittests/pi/BackendString.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,10 @@ inline const char *GetBackendString(cl::sycl::backend backend) {
1515
PI_BACKEND_STR(cuda);
1616
PI_BACKEND_STR(host);
1717
PI_BACKEND_STR(opencl);
18+
PI_BACKEND_STR(level0);
1819
#undef PI_BACKEND_STR
1920
default:
2021
return "Unknown Plugin";
2122
}
2223
}
23-
} // namespace pi
24+
} // namespace pi

sycl/unittests/pi/EnqueueMemTest.cpp

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

53-
ASSERT_EQ((plugin.call_nocheck<detail::PiApiKind::piMemBufferCreate>(
54-
_context, 0, _numElementsX * _numElementsY * sizeof(pi_int32),
55-
nullptr, &_mem)),
56-
PI_SUCCESS);
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);
5758
}
5859

5960
void TearDown() override {
@@ -84,9 +85,12 @@ class EnqueueMemTest : public testing::TestWithParam<detail::plugin> {
8485
0, nullptr, nullptr)),
8586
PI_SUCCESS);
8687

88+
pi_event event;
8789
ASSERT_EQ((plugin.call_nocheck<detail::PiApiKind::piEnqueueMemBufferFill>(
8890
_queue, _mem, &pattern, sizeof(T), 0, sizeof(inValues), 0,
89-
nullptr, nullptr)),
91+
nullptr, &event)),
92+
PI_SUCCESS);
93+
ASSERT_EQ((plugin.call_nocheck<detail::PiApiKind::piEventsWait>(1, &event)),
9094
PI_SUCCESS);
9195

9296
T outValues[_numElementsX] = {};

0 commit comments

Comments
 (0)