Skip to content

Commit cb047e5

Browse files
fix: synchronize resubmission of the same command buffer
synchronization implemented as the host thread waiting for an event to be signalled after the completion of the command buffer execution
1 parent a8b1b8f commit cb047e5

File tree

3 files changed

+63
-84
lines changed

3 files changed

+63
-84
lines changed

unified-runtime/source/adapters/level_zero/v2/queue_immediate_in_order.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1025,6 +1025,11 @@ ur_result_t ur_queue_immediate_in_order_t::enqueueCommandBufferExp(
10251025
ur_event_handle_t executionEvent =
10261026
hCommandBuffer->getExecutionEventUnlocked();
10271027

1028+
if (executionEvent != nullptr) {
1029+
ZE2UR_CALL(zeEventHostSynchronize,
1030+
(executionEvent->getZeEvent(), UINT64_MAX));
1031+
}
1032+
10281033
UR_CALL(enqueueGenericCommandListsExp(
10291034
1, &commandBufferCommandList, phEvent, numEventsInWaitList,
10301035
phEventWaitList, UR_COMMAND_ENQUEUE_COMMAND_BUFFER_EXP, executionEvent));

unified-runtime/test/conformance/exp_command_buffer/enqueue.cpp

Lines changed: 51 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -17,23 +17,19 @@
1717
// enqueue_update.cpp test for a test verifying the order of submissions, as
1818
// the input/output to the kernels can be modified between the submissions.
1919
struct urEnqueueCommandBufferExpTest
20-
: uur::command_buffer::urCommandBufferExpExecutionTestWithParam<ur_queue_flags_t> {
20+
: uur::command_buffer::urCommandBufferExpExecutionTestWithParam<
21+
ur_queue_flags_t> {
2122
virtual void SetUp() override {
2223
program_name = "increment";
23-
UUR_RETURN_ON_FATAL_FAILURE(urCommandBufferExpExecutionTestWithParam::SetUp());
24+
UUR_RETURN_ON_FATAL_FAILURE(
25+
urCommandBufferExpExecutionTestWithParam::SetUp());
2426

25-
// Create an in-order queue
26-
queue_type = std::get<1>(GetParam());
27+
// Create an in-order or out-of-order queue, depending on the passed parameter
28+
ur_queue_flags_t queue_type = std::get<1>(GetParam());
2729
ur_queue_properties_t queue_properties = {
28-
UR_STRUCTURE_TYPE_QUEUE_PROPERTIES, nullptr, queue_type}; //GetParam()}; //0};
29-
ASSERT_SUCCESS(
30-
urQueueCreate(context, device, &queue_properties, &in_or_out_of_order_queue));
31-
32-
// // Create an out-of-order queue
33-
// queue_properties.flags = UR_QUEUE_FLAG_OUT_OF_ORDER_EXEC_MODE_ENABLE;
34-
// ASSERT_SUCCESS(
35-
// urQueueCreate(context, device, &queue_properties, &out_of_order_queue));
36-
// ASSERT_NE(out_of_order_queue, nullptr);
30+
UR_STRUCTURE_TYPE_QUEUE_PROPERTIES, nullptr, queue_type};
31+
ASSERT_SUCCESS(urQueueCreate(context, device, &queue_properties,
32+
&in_or_out_of_order_queue));
3733

3834
ASSERT_SUCCESS(urUSMDeviceAlloc(context, device, nullptr, nullptr,
3935
allocation_size, &device_ptr));
@@ -47,13 +43,18 @@ struct urEnqueueCommandBufferExpTest
4743
std::vector<int> temp_val(buffer_size, 3);
4844

4945
for (int i = 0; i < num_copy_buffers; i++) {
50-
ASSERT_SUCCESS(urUSMDeviceAlloc(context, device, nullptr, nullptr, buffer_size * sizeof(int), (void**) &(dst_buffers[i])));
51-
ASSERT_SUCCESS(urUSMDeviceAlloc(context, device, nullptr, nullptr, buffer_size * sizeof(int), (void**) &(src_buffers[i])));
52-
53-
ASSERT_SUCCESS(urEnqueueUSMMemcpy(in_or_out_of_order_queue, false, src_buffers[i], temp_val.data(), buffer_size * sizeof(int), 0, nullptr, nullptr));
46+
ASSERT_SUCCESS(urUSMDeviceAlloc(context, device, nullptr, nullptr,
47+
buffer_size * sizeof(int32_t),
48+
(void **)&(dst_buffers[i])));
49+
ASSERT_SUCCESS(urUSMDeviceAlloc(context, device, nullptr, nullptr,
50+
buffer_size * sizeof(int32_t),
51+
(void **)&(src_buffers[i])));
52+
53+
ASSERT_SUCCESS(urEnqueueUSMMemcpy(
54+
in_or_out_of_order_queue, false, src_buffers[i], temp_val.data(),
55+
buffer_size * sizeof(int32_t), 0, nullptr, nullptr));
5456
}
5557

56-
5758
ASSERT_SUCCESS(urQueueFinish(queue));
5859

5960
// Create command-buffer with a single kernel that does "Ptr[i] += 1;"
@@ -63,9 +64,12 @@ struct urEnqueueCommandBufferExpTest
6364
nullptr, 0, nullptr, 0, nullptr, 0, nullptr, nullptr, nullptr,
6465
nullptr));
6566

66-
67+
// Schedule memory copying in order to prolong the buffer execution
6768
for (int i = 0; i < num_copy_buffers; i++) {
68-
ASSERT_SUCCESS(urCommandBufferAppendUSMMemcpyExp(cmd_buf_handle, dst_buffers[i], src_buffers[i], buffer_size * sizeof(int), 0, nullptr, 0, nullptr, nullptr, nullptr, nullptr));
69+
ASSERT_SUCCESS(urCommandBufferAppendUSMMemcpyExp(
70+
cmd_buf_handle, dst_buffers[i], src_buffers[i],
71+
buffer_size * sizeof(int32_t), 0, nullptr, 0, nullptr, nullptr, nullptr,
72+
nullptr));
6973
}
7074

7175
ASSERT_SUCCESS(urCommandBufferFinalizeExp(cmd_buf_handle));
@@ -76,10 +80,6 @@ struct urEnqueueCommandBufferExpTest
7680
EXPECT_SUCCESS(urQueueRelease(in_or_out_of_order_queue));
7781
}
7882

79-
// if (out_of_order_queue) {
80-
// EXPECT_SUCCESS(urQueueRelease(out_of_order_queue));
81-
// }
82-
8383
if (device_ptr) {
8484
EXPECT_SUCCESS(urUSMFree(context, device_ptr));
8585
}
@@ -94,13 +94,11 @@ struct urEnqueueCommandBufferExpTest
9494
}
9595
}
9696

97-
UUR_RETURN_ON_FATAL_FAILURE(urCommandBufferExpExecutionTestWithParam::TearDown());
97+
UUR_RETURN_ON_FATAL_FAILURE(
98+
urCommandBufferExpExecutionTestWithParam::TearDown());
9899
}
99100

100101
ur_queue_handle_t in_or_out_of_order_queue = nullptr;
101-
ur_queue_flags_t queue_type; // = 0;
102-
103-
// ur_queue_handle_t out_of_order_queue = nullptr;
104102

105103
static constexpr size_t global_size = 16;
106104
static constexpr size_t global_offset = 0;
@@ -110,56 +108,52 @@ struct urEnqueueCommandBufferExpTest
110108

111109
static constexpr int num_copy_buffers = 10;
112110
static constexpr int buffer_size = 512;
113-
int* dst_buffers[num_copy_buffers];
114-
int* src_buffers[num_copy_buffers];
111+
int32_t *dst_buffers[num_copy_buffers] = {};
112+
int32_t *src_buffers[num_copy_buffers] = {};
115113
};
116114

117-
118115
std::string deviceTestWithQueueTypePrinter(
119-
const ::testing::TestParamInfo<std::tuple<uur::DeviceTuple, ur_queue_flags_t>> &info) {
116+
const ::testing::TestParamInfo<
117+
std::tuple<uur::DeviceTuple, ur_queue_flags_t>> &info) {
120118
auto device = std::get<0>(info.param).device;
121119
auto queue_type = std::get<1>(info.param);
122120

123121
std::stringstream ss;
124122

125123
switch (queue_type) {
126-
case 0:
127-
ss << "InOrderQueue";
128-
break;
124+
case 0:
125+
ss << "InOrderQueue";
126+
break;
129127

130-
// change to if and bitwise and?
131-
case UR_QUEUE_FLAG_OUT_OF_ORDER_EXEC_MODE_ENABLE:
132-
ss << "OutOfOrderQueue";
133-
break;
128+
case UR_QUEUE_FLAG_OUT_OF_ORDER_EXEC_MODE_ENABLE:
129+
ss << "OutOfOrderQueue";
130+
break;
134131

135-
default:
136-
ss << "UnspecifiedQueueType" << queue_type;
132+
default:
133+
ss << "UnspecifiedQueueType" << queue_type;
137134
}
138135

139-
140136
return uur::GetPlatformAndDeviceName(device) + "__" +
141137
uur::GTestSanitizeString(ss.str());
142138
}
143139

144-
// UUR_INSTANTIATE_DEVICE_TEST_SUITE(urEnqueueCommandBufferExpTest);
145-
UUR_DEVICE_TEST_SUITE_WITH_PARAM(urEnqueueCommandBufferExpTest, testing::Values(0, UR_QUEUE_FLAG_OUT_OF_ORDER_EXEC_MODE_ENABLE), deviceTestWithQueueTypePrinter);
140+
UUR_DEVICE_TEST_SUITE_WITH_PARAM(
141+
urEnqueueCommandBufferExpTest,
142+
testing::Values(0, UR_QUEUE_FLAG_OUT_OF_ORDER_EXEC_MODE_ENABLE),
143+
deviceTestWithQueueTypePrinter);
146144

147145
// Tests that the same command-buffer submitted across different in-order
148146
// queues has an implicit dependency on first submission
149147
TEST_P(urEnqueueCommandBufferExpTest, SerializeAcrossQueues) {
150148
// Execute command-buffer to first in-order queue (created by parent
151-
// urQueueTest fixture)
152-
if (queue_type == UR_QUEUE_FLAG_OUT_OF_ORDER_EXEC_MODE_ENABLE) {
153-
GTEST_SKIP() << "unwantedoutoforder";
154-
}
155-
149+
// urQueueTestWithParam fixture)
156150
ASSERT_SUCCESS(
157151
urEnqueueCommandBufferExp(queue, cmd_buf_handle, 0, nullptr, nullptr));
158152

159153
// Execute command-buffer to second in-order queue, should have implicit
160154
// dependency on first submission.
161-
ASSERT_SUCCESS(urEnqueueCommandBufferExp(in_or_out_of_order_queue, cmd_buf_handle, 0,
162-
nullptr, nullptr));
155+
ASSERT_SUCCESS(urEnqueueCommandBufferExp(
156+
in_or_out_of_order_queue, cmd_buf_handle, 0, nullptr, nullptr));
163157

164158
// Wait for both submissions to complete
165159
ASSERT_SUCCESS(urQueueFlush(queue));
@@ -177,47 +171,24 @@ TEST_P(urEnqueueCommandBufferExpTest, SerializeAcrossQueues) {
177171
}
178172
}
179173

180-
// // Tests that submitting a command-buffer twice to an out-of-order queue
181-
// // relying on implicit serialization semantics for dependencies.
182-
// TEST_P(urEnqueueCommandBufferExpTest, SerializeOutofOrderQueue) {
183-
// ASSERT_SUCCESS(urEnqueueCommandBufferExp(out_of_order_queue, cmd_buf_handle,
184-
// 0, nullptr, nullptr));
185-
// ASSERT_SUCCESS(urEnqueueCommandBufferExp(out_of_order_queue, cmd_buf_handle,
186-
// 0, nullptr, nullptr));
187-
188-
// // Wait for both submissions to complete
189-
// ASSERT_SUCCESS(urQueueFinish(out_of_order_queue));
190-
191-
// std::vector<uint32_t> Output(global_size);
192-
// ASSERT_SUCCESS(urEnqueueUSMMemcpy(out_of_order_queue, true, Output.data(),
193-
// device_ptr, allocation_size, 0, nullptr,
194-
// nullptr));
195-
196-
// // Verify
197-
// const uint32_t reference = 2;
198-
// for (size_t i = 0; i < global_size; i++) {
199-
// ASSERT_EQ(reference, Output[i]);
200-
// }
201-
// }
202-
203174
TEST_P(urEnqueueCommandBufferExpTest, SerializeInOrOutOfOrderQueue) {
204175
const int iterations = 5;
205176
for (int i = 0; i < iterations; i++) {
206-
ASSERT_SUCCESS(urEnqueueCommandBufferExp(in_or_out_of_order_queue, cmd_buf_handle,
207-
0, nullptr, nullptr));
177+
ASSERT_SUCCESS(urEnqueueCommandBufferExp(
178+
in_or_out_of_order_queue, cmd_buf_handle, 0, nullptr, nullptr));
208179
}
209180

210181
// Wait for both submissions to complete
211182
ASSERT_SUCCESS(urQueueFinish(in_or_out_of_order_queue));
212183

213184
std::vector<uint32_t> Output(global_size);
214-
ASSERT_SUCCESS(urEnqueueUSMMemcpy(in_or_out_of_order_queue, true, Output.data(),
215-
device_ptr, allocation_size, 0, nullptr,
216-
nullptr));
185+
ASSERT_SUCCESS(urEnqueueUSMMemcpy(in_or_out_of_order_queue, true,
186+
Output.data(), device_ptr, allocation_size,
187+
0, nullptr, nullptr));
217188

218189
// Verify
219190
const uint32_t reference = iterations;
220191
for (size_t i = 0; i < global_size; i++) {
221192
ASSERT_EQ(reference, Output[i]);
222193
}
223-
}
194+
}

unified-runtime/test/conformance/exp_command_buffer/fixtures.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ struct urCommandBufferExpExecutionTest : uur::urKernelExecutionTest {
9898
UUR_RETURN_ON_FATAL_FAILURE(checkCommandBufferSupport(device));
9999

100100
ur_exp_command_buffer_desc_t desc{UR_STRUCTURE_TYPE_EXP_COMMAND_BUFFER_DESC,
101-
nullptr, false, false /* WAS: false */, false};
101+
nullptr, false, false, false};
102102
ASSERT_SUCCESS(
103103
urCommandBufferCreateExp(context, device, &desc, &cmd_buf_handle));
104104
ASSERT_NE(cmd_buf_handle, nullptr);
@@ -115,9 +115,11 @@ struct urCommandBufferExpExecutionTest : uur::urKernelExecutionTest {
115115
};
116116

117117
template <class T>
118-
struct urCommandBufferExpExecutionTestWithParam : urKernelExecutionTestWithParam<T> {
118+
struct urCommandBufferExpExecutionTestWithParam
119+
: urKernelExecutionTestWithParam<T> {
119120
void SetUp() override {
120-
UUR_RETURN_ON_FATAL_FAILURE(uur::urKernelExecutionTestWithParam<T>::SetUp());
121+
UUR_RETURN_ON_FATAL_FAILURE(
122+
uur::urKernelExecutionTestWithParam<T>::SetUp());
121123

122124
UUR_RETURN_ON_FATAL_FAILURE(checkCommandBufferSupport(this->device));
123125

@@ -132,7 +134,8 @@ struct urCommandBufferExpExecutionTestWithParam : urKernelExecutionTestWithParam
132134
if (cmd_buf_handle) {
133135
EXPECT_SUCCESS(urCommandBufferReleaseExp(cmd_buf_handle));
134136
}
135-
UUR_RETURN_ON_FATAL_FAILURE(uur::urKernelExecutionTestWithParam<T>::TearDown());
137+
UUR_RETURN_ON_FATAL_FAILURE(
138+
uur::urKernelExecutionTestWithParam<T>::TearDown());
136139
}
137140

138141
ur_exp_command_buffer_handle_t cmd_buf_handle = nullptr;

0 commit comments

Comments
 (0)