Skip to content

Commit 68f3fdf

Browse files
[SYCL][BindlessImages] Fix storing result events for semaphores (#20080)
#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]>
1 parent 8f25b7f commit 68f3fdf

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
@@ -3682,11 +3682,17 @@ ur_result_t ExecCGCommand::enqueueImpQueue() {
36823682
auto OptWaitValue = SemWait->getWaitValue();
36833683
uint64_t WaitValue = OptWaitValue.has_value() ? OptWaitValue.value() : 0;
36843684

3685-
return Adapter
3686-
.call_nocheck<UrApiKind::urBindlessImagesWaitExternalSemaphoreExp>(
3685+
if (auto Result = Adapter.call_nocheck<
3686+
UrApiKind::urBindlessImagesWaitExternalSemaphoreExp>(
36873687
MQueue->getHandleRef(), SemWait->getExternalSemaphore(),
36883688
OptWaitValue.has_value(), WaitValue, RawEvents.size(),
36893689
RawEvents.data(), Event);
3690+
Result != UR_RESULT_SUCCESS)
3691+
return Result;
3692+
3693+
SetEventHandleOrDiscard();
3694+
3695+
return UR_RESULT_SUCCESS;
36903696
}
36913697
case CGType::SemaphoreSignal: {
36923698
assert(MQueue &&
@@ -3696,11 +3702,17 @@ ur_result_t ExecCGCommand::enqueueImpQueue() {
36963702
auto OptSignalValue = SemSignal->getSignalValue();
36973703
uint64_t SignalValue =
36983704
OptSignalValue.has_value() ? OptSignalValue.value() : 0;
3699-
return Adapter
3700-
.call_nocheck<UrApiKind::urBindlessImagesSignalExternalSemaphoreExp>(
3705+
if (auto Result = Adapter.call_nocheck<
3706+
UrApiKind::urBindlessImagesSignalExternalSemaphoreExp>(
37013707
MQueue->getHandleRef(), SemSignal->getExternalSemaphore(),
37023708
OptSignalValue.has_value(), SignalValue, RawEvents.size(),
37033709
RawEvents.data(), Event);
3710+
Result != UR_RESULT_SUCCESS)
3711+
return Result;
3712+
3713+
SetEventHandleOrDiscard();
3714+
3715+
return UR_RESULT_SUCCESS;
37043716
}
37053717
case CGType::AsyncAlloc: {
37063718
// 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)