Skip to content

Commit 7863c0b

Browse files
authored
[SYCL] Fix handling of queue::in_order property (#2140)
Fixed one of the sycl::queue constructor was ignoring the queue::in_order property. Also did some refactoring so now queue_impl checks properties to undrestand if in-order queue is required rather than relying on flag which is passed to constructor.
1 parent 126b483 commit 7863c0b

File tree

5 files changed

+38
-30
lines changed

5 files changed

+38
-30
lines changed

sycl/source/detail/queue_impl.hpp

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -50,16 +50,14 @@ class queue_impl {
5050
/// \param Device is a SYCL device that is used to dispatch tasks submitted
5151
/// to the queue.
5252
/// \param AsyncHandler is a SYCL asynchronous exception handler.
53-
/// \param Order specifies whether the queue being constructed as in-order
54-
/// or out-of-order.
5553
/// \param PropList is a list of properties to use for queue construction.
56-
queue_impl(DeviceImplPtr Device, async_handler AsyncHandler, QueueOrder Order,
54+
queue_impl(DeviceImplPtr Device, async_handler AsyncHandler,
5755
const property_list &PropList)
5856
: queue_impl(Device,
5957
detail::getSyclObjImpl(context(
6058
createSyclObjFromImpl<device>(Device), {},
6159
(DefaultContextType == cuda_context_type::primary))),
62-
AsyncHandler, Order, PropList){};
60+
AsyncHandler, PropList){};
6361

6462
/// Constructs a SYCL queue with an async_handler and property_list provided
6563
/// form a device and a context.
@@ -69,12 +67,9 @@ class queue_impl {
6967
/// \param Context is a SYCL context to associate with the queue being
7068
/// constructed.
7169
/// \param AsyncHandler is a SYCL asynchronous exception handler.
72-
/// \param Order specifies whether the queue being constructed as in-order
73-
/// or out-of-order.
7470
/// \param PropList is a list of properties to use for queue construction.
7571
queue_impl(DeviceImplPtr Device, ContextImplPtr Context,
76-
async_handler AsyncHandler, QueueOrder Order,
77-
const property_list &PropList)
72+
async_handler AsyncHandler, const property_list &PropList)
7873
: MDevice(Device), MContext(Context), MAsyncHandler(AsyncHandler),
7974
MPropList(PropList), MHostQueue(MDevice->is_host()),
8075
MOpenCLInterop(!MHostQueue) {
@@ -84,7 +79,11 @@ class queue_impl {
8479
"as the context does not contain the given device.",
8580
PI_INVALID_DEVICE);
8681
if (!MHostQueue) {
87-
MCommandQueue = createQueue(Order);
82+
const QueueOrder qorder =
83+
MPropList.has_property<property::queue::in_order>()
84+
? QueueOrder::Ordered
85+
: QueueOrder::OOO;
86+
MCommandQueue = createQueue(qorder);
8887
}
8988
}
9089

sycl/source/detail/scheduler/scheduler.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ Scheduler::Scheduler() {
231231
sycl::device HostDevice;
232232
DefaultHostQueue = QueueImplPtr(
233233
new queue_impl(detail::getSyclObjImpl(HostDevice), /*AsyncHandler=*/{},
234-
QueueOrder::Ordered, /*PropList=*/{}));
234+
/*PropList=*/{}));
235235
}
236236

237237
void Scheduler::lockSharedTimedMutex(

sycl/source/queue.cpp

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,6 @@
1818
__SYCL_INLINE_NAMESPACE(cl) {
1919
namespace sycl {
2020

21-
namespace detail {
22-
23-
QueueOrder getQueueOrder(const property_list &propList) {
24-
if (propList.has_property<property::queue::in_order>()) {
25-
return QueueOrder::Ordered;
26-
}
27-
return QueueOrder::OOO;
28-
}
29-
30-
} // namespace detail
31-
3221
queue::queue(const context &syclContext, const device_selector &deviceSelector,
3322
const async_handler &asyncHandler, const property_list &propList) {
3423

@@ -42,7 +31,7 @@ queue::queue(const context &syclContext, const device_selector &deviceSelector,
4231

4332
impl = std::make_shared<detail::queue_impl>(
4433
detail::getSyclObjImpl(syclDevice), detail::getSyclObjImpl(syclContext),
45-
asyncHandler, detail::getQueueOrder(propList), propList);
34+
asyncHandler, propList);
4635
}
4736

4837
queue::queue(const context &syclContext,
@@ -51,14 +40,13 @@ queue::queue(const context &syclContext,
5140
const property_list &propList) {
5241
impl = std::make_shared<detail::queue_impl>(
5342
detail::getSyclObjImpl(syclDevice), detail::getSyclObjImpl(syclContext),
54-
asyncHandler, cl::sycl::detail::QueueOrder::OOO, propList);
43+
asyncHandler, propList);
5544
}
5645

5746
queue::queue(const device &syclDevice, const async_handler &asyncHandler,
5847
const property_list &propList) {
5948
impl = std::make_shared<detail::queue_impl>(
60-
detail::getSyclObjImpl(syclDevice), asyncHandler,
61-
detail::getQueueOrder(propList), propList);
49+
detail::getSyclObjImpl(syclDevice), asyncHandler, propList);
6250
}
6351

6452
queue::queue(cl_command_queue clQueue, const context &syclContext,

sycl/test/inorder_queue/prop.cpp

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,10 @@ bool getQueueOrder(cl_command_queue cq) {
2929
: true;
3030
}
3131

32-
int main() {
33-
queue q{property::queue::in_order()};
32+
int CheckQueueOrder(const queue &q) {
3433
auto dev = q.get_device();
35-
36-
cl_command_queue cq = q.get();
34+
35+
cl_command_queue cq = q.get();
3736
bool expected_result = dev.is_host() ? true : getQueueOrder(cq);
3837
if (!expected_result)
3938
return -1;
@@ -44,3 +43,25 @@ int main() {
4443

4544
return 0;
4645
}
46+
47+
int main() {
48+
queue q1{property::queue::in_order()};
49+
int res = CheckQueueOrder(q1);
50+
if (res != 0)
51+
return res;
52+
53+
device dev{cl::sycl::default_selector{}};
54+
context ctx{dev};
55+
56+
auto exception_handler = [](cl::sycl::exception_list exceptions) {
57+
};
58+
59+
queue q2{
60+
ctx, dev, exception_handler, {sycl::property::queue::in_order()}};
61+
62+
res = CheckQueueOrder(q2);
63+
if (res != 0)
64+
return res;
65+
66+
return 0;
67+
}

sycl/unittests/scheduler/CommandsWaitForEvents.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ TEST_F(SchedulerTest, CommandsWaitForEvents) {
9797
sycl::device HostDevice;
9898
std::shared_ptr<detail::queue_impl> DefaultHostQueue(new detail::queue_impl(
9999
detail::getSyclObjImpl(HostDevice), /*AsyncHandler=*/{},
100-
detail::QueueOrder::Ordered, /*PropList=*/{}));
100+
/*PropList=*/{}));
101101

102102
MockCommand Cmd(DefaultHostQueue);
103103

0 commit comments

Comments
 (0)