Skip to content

Commit 0be37b3

Browse files
committed
[SYCL][BindlessImages] Fix storing result events for semaphores (intel#20080)
intel#20040 addressed an issue where semaphore operations would not pass and retrieve events from semaphore operations. However, the changes did not correctly store the result events. This commit addresses this. Signed-off-by: Larsen, Steffen <[email protected]> (cherry picked from commit 68f3fdf)
1 parent 0c7a1d9 commit 0be37b3

File tree

2 files changed

+56
-14
lines changed

2 files changed

+56
-14
lines changed

sycl/source/detail/scheduler/commands.cpp

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3710,11 +3710,17 @@ ur_result_t ExecCGCommand::enqueueImpQueue() {
37103710
auto OptWaitValue = SemWait->getWaitValue();
37113711
uint64_t WaitValue = OptWaitValue.has_value() ? OptWaitValue.value() : 0;
37123712

3713-
return Adapter
3714-
.call_nocheck<UrApiKind::urBindlessImagesWaitExternalSemaphoreExp>(
3713+
if (auto Result = Adapter.call_nocheck<
3714+
UrApiKind::urBindlessImagesWaitExternalSemaphoreExp>(
37153715
MQueue->getHandleRef(), SemWait->getExternalSemaphore(),
37163716
OptWaitValue.has_value(), WaitValue, RawEvents.size(),
37173717
RawEvents.data(), Event);
3718+
Result != UR_RESULT_SUCCESS)
3719+
return Result;
3720+
3721+
SetEventHandleOrDiscard();
3722+
3723+
return UR_RESULT_SUCCESS;
37183724
}
37193725
case CGType::SemaphoreSignal: {
37203726
assert(MQueue &&
@@ -3724,11 +3730,17 @@ ur_result_t ExecCGCommand::enqueueImpQueue() {
37243730
auto OptSignalValue = SemSignal->getSignalValue();
37253731
uint64_t SignalValue =
37263732
OptSignalValue.has_value() ? OptSignalValue.value() : 0;
3727-
return Adapter
3728-
.call_nocheck<UrApiKind::urBindlessImagesSignalExternalSemaphoreExp>(
3733+
if (auto Result = Adapter.call_nocheck<
3734+
UrApiKind::urBindlessImagesSignalExternalSemaphoreExp>(
37293735
MQueue->getHandleRef(), SemSignal->getExternalSemaphore(),
37303736
OptSignalValue.has_value(), SignalValue, RawEvents.size(),
37313737
RawEvents.data(), Event);
3738+
Result != UR_RESULT_SUCCESS)
3739+
return Result;
3740+
3741+
SetEventHandleOrDiscard();
3742+
3743+
return UR_RESULT_SUCCESS;
37323744
}
37333745
case CGType::AsyncAlloc: {
37343746
// NO-OP. Async alloc calls adapter immediately in order to return a valid

sycl/unittests/Extensions/BindlessImages/Semaphores.cpp

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ constexpr uint64_t SignalValue = 24;
1616
thread_local int urBindlessImagesWaitExternalSemaphoreExp_counter = 0;
1717
thread_local bool urBindlessImagesWaitExternalSemaphoreExp_expectHasWaitValue =
1818
false;
19+
thread_local ur_event_handle_t
20+
urBindlessImagesWaitExternalSemaphoreExp_lastEvent = nullptr;
1921
inline ur_result_t
2022
urBindlessImagesWaitExternalSemaphoreExp_replace(void *pParams) {
2123
++urBindlessImagesWaitExternalSemaphoreExp_counter;
@@ -30,6 +32,11 @@ urBindlessImagesWaitExternalSemaphoreExp_replace(void *pParams) {
3032
EXPECT_EQ(*Params.pnumEventsInWaitList, uint32_t{0});
3133
EXPECT_EQ(*Params.pphEventWaitList, nullptr);
3234
EXPECT_NE(*Params.pphEvent, nullptr);
35+
if (*Params.pphEvent) {
36+
urBindlessImagesWaitExternalSemaphoreExp_lastEvent =
37+
mock::createDummyHandle<ur_event_handle_t>();
38+
**Params.pphEvent = urBindlessImagesWaitExternalSemaphoreExp_lastEvent;
39+
}
3340
return UR_RESULT_SUCCESS;
3441
}
3542

@@ -38,6 +45,8 @@ thread_local bool
3845
urBindlessImagesSignalExternalSemaphoreExp_expectHasSignalValue = false;
3946
thread_local uint32_t
4047
urBindlessImagesSignalExternalSemaphoreExp_expectedNumWaitEvents = 0;
48+
thread_local ur_event_handle_t
49+
urBindlessImagesSignalExternalSemaphoreExp_lastEvent = nullptr;
4150
inline ur_result_t
4251
urBindlessImagesSignalExternalSemaphoreExp_replace(void *pParams) {
4352
++urBindlessImagesSignalExternalSemaphoreExp_counter;
@@ -57,6 +66,11 @@ urBindlessImagesSignalExternalSemaphoreExp_replace(void *pParams) {
5766
EXPECT_EQ(*Params.pphEventWaitList, nullptr);
5867
}
5968
EXPECT_NE(*Params.pphEvent, nullptr);
69+
if (*Params.pphEvent) {
70+
urBindlessImagesSignalExternalSemaphoreExp_lastEvent =
71+
mock::createDummyHandle<ur_event_handle_t>();
72+
**Params.pphEvent = urBindlessImagesSignalExternalSemaphoreExp_lastEvent;
73+
}
6074
return UR_RESULT_SUCCESS;
6175
}
6276

@@ -80,15 +94,19 @@ TEST(BindlessImagesExtensionTests, ExternalSemaphoreWait) {
8094
syclexp::external_semaphore_handle_type::opaque_fd;
8195

8296
urBindlessImagesWaitExternalSemaphoreExp_expectHasWaitValue = false;
83-
Q.ext_oneapi_wait_external_semaphore(DummySemaphore);
97+
sycl::event E = Q.ext_oneapi_wait_external_semaphore(DummySemaphore);
8498
EXPECT_EQ(urBindlessImagesWaitExternalSemaphoreExp_counter, 1);
99+
EXPECT_EQ(sycl::detail::getSyclObjImpl(E)->getHandle(),
100+
urBindlessImagesWaitExternalSemaphoreExp_lastEvent);
85101

86102
DummySemaphore.handle_type =
87103
syclexp::external_semaphore_handle_type::timeline_fd;
88104

89105
urBindlessImagesWaitExternalSemaphoreExp_expectHasWaitValue = true;
90-
Q.ext_oneapi_wait_external_semaphore(DummySemaphore, WaitValue);
106+
E = Q.ext_oneapi_wait_external_semaphore(DummySemaphore, WaitValue);
91107
EXPECT_EQ(urBindlessImagesWaitExternalSemaphoreExp_counter, 2);
108+
EXPECT_EQ(sycl::detail::getSyclObjImpl(E)->getHandle(),
109+
urBindlessImagesWaitExternalSemaphoreExp_lastEvent);
92110
}
93111

94112
TEST(BindlessImagesExtensionTests, ExternalSemaphoreSignal) {
@@ -126,36 +144,48 @@ TEST(BindlessImagesExtensionTests, ExternalSemaphoreSignal) {
126144

127145
urBindlessImagesSignalExternalSemaphoreExp_expectHasSignalValue = false;
128146
urBindlessImagesSignalExternalSemaphoreExp_expectedNumWaitEvents = 0;
129-
Q.ext_oneapi_signal_external_semaphore(DummySemaphore);
147+
sycl::event E = Q.ext_oneapi_signal_external_semaphore(DummySemaphore);
130148
EXPECT_EQ(urBindlessImagesSignalExternalSemaphoreExp_counter, 1);
149+
EXPECT_EQ(sycl::detail::getSyclObjImpl(E)->getHandle(),
150+
urBindlessImagesSignalExternalSemaphoreExp_lastEvent);
131151

132152
urBindlessImagesSignalExternalSemaphoreExp_expectHasSignalValue = false;
133153
urBindlessImagesSignalExternalSemaphoreExp_expectedNumWaitEvents = 1;
134-
Q.ext_oneapi_signal_external_semaphore(DummySemaphore, DummyEvent1);
154+
E = Q.ext_oneapi_signal_external_semaphore(DummySemaphore, DummyEvent1);
135155
EXPECT_EQ(urBindlessImagesSignalExternalSemaphoreExp_counter, 2);
156+
EXPECT_EQ(sycl::detail::getSyclObjImpl(E)->getHandle(),
157+
urBindlessImagesSignalExternalSemaphoreExp_lastEvent);
136158

137159
urBindlessImagesSignalExternalSemaphoreExp_expectHasSignalValue = false;
138160
urBindlessImagesSignalExternalSemaphoreExp_expectedNumWaitEvents = 2;
139-
Q.ext_oneapi_signal_external_semaphore(DummySemaphore, DummyEventList);
161+
E = Q.ext_oneapi_signal_external_semaphore(DummySemaphore, DummyEventList);
140162
EXPECT_EQ(urBindlessImagesSignalExternalSemaphoreExp_counter, 3);
163+
EXPECT_EQ(sycl::detail::getSyclObjImpl(E)->getHandle(),
164+
urBindlessImagesSignalExternalSemaphoreExp_lastEvent);
141165

142166
DummySemaphore.handle_type =
143167
syclexp::external_semaphore_handle_type::timeline_fd;
144168

145169
urBindlessImagesSignalExternalSemaphoreExp_expectHasSignalValue = true;
146170
urBindlessImagesSignalExternalSemaphoreExp_expectedNumWaitEvents = 0;
147-
Q.ext_oneapi_signal_external_semaphore(DummySemaphore, SignalValue);
171+
E = Q.ext_oneapi_signal_external_semaphore(DummySemaphore, SignalValue);
148172
EXPECT_EQ(urBindlessImagesSignalExternalSemaphoreExp_counter, 4);
173+
EXPECT_EQ(sycl::detail::getSyclObjImpl(E)->getHandle(),
174+
urBindlessImagesSignalExternalSemaphoreExp_lastEvent);
149175

150176
urBindlessImagesSignalExternalSemaphoreExp_expectHasSignalValue = true;
151177
urBindlessImagesSignalExternalSemaphoreExp_expectedNumWaitEvents = 1;
152-
Q.ext_oneapi_signal_external_semaphore(DummySemaphore, SignalValue,
153-
DummyEvent1);
178+
E = Q.ext_oneapi_signal_external_semaphore(DummySemaphore, SignalValue,
179+
DummyEvent1);
154180
EXPECT_EQ(urBindlessImagesSignalExternalSemaphoreExp_counter, 5);
181+
EXPECT_EQ(sycl::detail::getSyclObjImpl(E)->getHandle(),
182+
urBindlessImagesSignalExternalSemaphoreExp_lastEvent);
155183

156184
urBindlessImagesSignalExternalSemaphoreExp_expectHasSignalValue = true;
157185
urBindlessImagesSignalExternalSemaphoreExp_expectedNumWaitEvents = 2;
158-
Q.ext_oneapi_signal_external_semaphore(DummySemaphore, SignalValue,
159-
DummyEventList);
186+
E = Q.ext_oneapi_signal_external_semaphore(DummySemaphore, SignalValue,
187+
DummyEventList);
160188
EXPECT_EQ(urBindlessImagesSignalExternalSemaphoreExp_counter, 6);
189+
EXPECT_EQ(sycl::detail::getSyclObjImpl(E)->getHandle(),
190+
urBindlessImagesSignalExternalSemaphoreExp_lastEvent);
161191
}

0 commit comments

Comments
 (0)