Skip to content
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
3e0fe6a
WIP [SYCL][PI] Add PI_EXT_INTEL_DEVICE_INFO_MAX_COMPUTE_QUEUE_INDICES
aelovikov-intel Nov 28, 2022
f642f25
WIP Add SYCL-level interface
aelovikov-intel Nov 28, 2022
fedf467
WIP Add property, not passed to the plugin yet
aelovikov-intel Nov 28, 2022
f1ff38b
WIP Define feature macro
aelovikov-intel Nov 28, 2022
a34fc24
WIP Introduce piQueueCreateEx
aelovikov-intel Nov 29, 2022
00fa9bf
WIP Change SYCL RT to use piQueueCreateEx
aelovikov-intel Nov 29, 2022
971ef1a
WIP Final piece?
aelovikov-intel Nov 30, 2022
19ddea0
Fix typo
aelovikov-intel Nov 30, 2022
3d6892b
Add PI_EXT_INTEL_DEVICE_INFO_MAX_COMPUTE_QUEUE_INDICES case for ESIMD…
aelovikov-intel Nov 30, 2022
97337cb
Merge remote-tracking branch 'origin/sycl' into queue-index
aelovikov-intel Nov 30, 2022
ebb1f30
Update TODO comment
aelovikov-intel Nov 30, 2022
48c8b81
clang-format
aelovikov-intel Nov 30, 2022
ae6d72a
Fix CUDA/HIP build
aelovikov-intel Nov 30, 2022
0acba89
Same for ESIMD_EMULATOR
aelovikov-intel Nov 30, 2022
b3c49ff
Update Linux symbols
aelovikov-intel Dec 1, 2022
0f36b15
Windows symbols
aelovikov-intel Dec 1, 2022
cc76d2c
Merge remote-tracking branch 'origin/sycl' into queue-index
aelovikov-intel Dec 1, 2022
ca1eea8
Add sycl/unittests/queue/InOrderQueue.cpp
aelovikov-intel Dec 1, 2022
1e199b3
Merge remote-tracking branch 'origin/sycl' into queue-index
aelovikov-intel Dec 1, 2022
fb9841b
Add missing PI entry for opencl plugin
aelovikov-intel Dec 1, 2022
312388e
clang-format
aelovikov-intel Dec 1, 2022
98560e0
Merge remote-tracking branch 'origin/sycl' into queue-index
aelovikov-intel Dec 2, 2022
930fe25
Merge remote-tracking branch 'origin/sycl' into queue-index
aelovikov-intel Dec 5, 2022
fb22a45
Bump _PI_H_VERSION_MINOR
aelovikov-intel Dec 6, 2022
a9fffdd
Merge remote-tracking branch 'origin/sycl' into queue-index
aelovikov-intel Dec 9, 2022
9892278
Move the extension to "supported"
aelovikov-intel Dec 9, 2022
7cfb199
Rename piQueueCreateEx -> piextQueueCreate
aelovikov-intel Dec 11, 2022
622c991
Rename PI QUEUE flags
aelovikov-intel Dec 11, 2022
423a8f2
Extra doc comments
aelovikov-intel Dec 11, 2022
ca9de54
Merge remote-tracking branch 'origin/sycl' into queue-index
aelovikov-intel Dec 11, 2022
7522fa9
Merge remote-tracking branch 'origin/sycl' into queue-index
aelovikov-intel Dec 12, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions sycl/include/sycl/detail/pi.def
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ _PI_API(piextContextGetNativeHandle)
_PI_API(piextContextCreateWithNativeHandle)
// Queue
_PI_API(piQueueCreate)
_PI_API(piQueueCreateEx)
_PI_API(piQueueGetInfo)
_PI_API(piQueueFinish)
_PI_API(piQueueFlush)
Expand Down
10 changes: 10 additions & 0 deletions sycl/include/sycl/detail/pi.h
Original file line number Diff line number Diff line change
Expand Up @@ -286,6 +286,9 @@ typedef enum {
// Return 0 if device doesn't have any memory modules. Return the minimum of
// the bus width values if there are several memory modules on the device.
PI_EXT_INTEL_DEVICE_INFO_MEMORY_BUS_WIDTH = 0x10031,
// Return 1 if the device doesn't have a notion of a "queue index". Otherwise,
// return the number of queue indices that are available for this device.
PI_EXT_INTEL_DEVICE_INFO_MAX_COMPUTE_QUEUE_INDICES = 0x10032,
PI_DEVICE_INFO_ATOMIC_64 = 0x10110,
PI_DEVICE_INFO_ATOMIC_MEMORY_ORDER_CAPABILITIES = 0x10111,
PI_DEVICE_INFO_ATOMIC_MEMORY_SCOPE_CAPABILITIES = 0x11000,
Expand Down Expand Up @@ -575,6 +578,8 @@ constexpr pi_usm_mem_properties PI_MEM_USM_ALLOC_BUFFER_LOCATION = 0x419E;
// NOTE: queue properties are implemented this way to better support bit
// manipulations
using pi_queue_properties = pi_bitfield;
constexpr pi_queue_properties PI_QUEUE_FLAGS = -1;
constexpr pi_queue_properties PI_QUEUE_COMPUTE_INDEX = -2;
constexpr pi_queue_properties PI_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE = (1 << 0);
constexpr pi_queue_properties PI_QUEUE_PROFILING_ENABLE = (1 << 1);
constexpr pi_queue_properties PI_QUEUE_ON_DEVICE = (1 << 2);
Expand Down Expand Up @@ -1109,9 +1114,14 @@ __SYCL_EXPORT pi_result piextContextCreateWithNativeHandle(
//
// Queue
//

// TODO: Remove during next ABI break.
__SYCL_EXPORT pi_result piQueueCreate(pi_context context, pi_device device,
pi_queue_properties properties,
pi_queue *queue);
__SYCL_EXPORT pi_result piQueueCreateEx(pi_context context, pi_device device,
pi_queue_properties *properties,
pi_queue *queue);

__SYCL_EXPORT pi_result piQueueGetInfo(pi_queue command_queue,
pi_queue_info param_name,
Expand Down
3 changes: 2 additions & 1 deletion sycl/include/sycl/detail/property_helper.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,8 @@ enum PropWithDataKind {
ImageContextBound = 3,
BufferMemChannel = 4,
AccPropBufferLocation = 5,
PropWithDataKindSize = 6,
QueueComputeIndex = 6,
PropWithDataKindSize = 7,
};

// Base class for dataless properties, needed to check that the type of an
Expand Down
1 change: 1 addition & 0 deletions sycl/include/sycl/feature_test.hpp.in
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ __SYCL_INLINE_VER_NAMESPACE(_V1) {
#define SYCL_EXT_INTEL_MEM_CHANNEL_PROPERTY 1
#define SYCL_EXT_INTEL_USM_ADDRESS_SPACES 1
#define SYCL_EXT_INTEL_RUNTIME_BUFFER_LOCATION 1
#define SYCL_EXT_INTEL_QUEUE_INDEX 1
#define SYCL_EXT_ONEAPI_BACKEND_LEVEL_ZERO 3
#define SYCL_EXT_ONEAPI_USM_DEVICE_READ_ONLY 1
#define SYCL_EXT_ONEAPI_KERNEL_PROPERTIES 1
Expand Down
1 change: 1 addition & 0 deletions sycl/include/sycl/info/ext_intel_device_traits.def
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ __SYCL_PARAM_TRAITS_SPEC(ext::intel, device, uuid, detail::uuid_type, PI_DEVICE_
__SYCL_PARAM_TRAITS_SPEC(ext::intel, device, free_memory, pi_uint64, PI_EXT_INTEL_DEVICE_INFO_FREE_MEMORY)
__SYCL_PARAM_TRAITS_SPEC(ext::intel, device, memory_clock_rate, pi_uint32, PI_EXT_INTEL_DEVICE_INFO_MEMORY_CLOCK_RATE)
__SYCL_PARAM_TRAITS_SPEC(ext::intel, device, memory_bus_width, pi_uint32, PI_EXT_INTEL_DEVICE_INFO_MEMORY_BUS_WIDTH)
__SYCL_PARAM_TRAITS_SPEC(ext::intel, device, max_compute_queue_indices, pi_int32, PI_EXT_INTEL_DEVICE_INFO_MAX_COMPUTE_QUEUE_INDICES)
#ifdef __SYCL_PARAM_TRAITS_TEMPLATE_SPEC_NEEDS_UNDEF
#undef __SYCL_PARAM_TRAITS_TEMPLATE_SPEC
#undef __SYCL_PARAM_TRAITS_TEMPLATE_SPEC_NEEDS_UNDEF
Expand Down
21 changes: 21 additions & 0 deletions sycl/include/sycl/properties/queue_properties.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,24 @@ class use_default_stream
} // namespace queue
} // namespace property

namespace ext {
namespace intel {
namespace property {
namespace queue {
class compute_index : public sycl::detail::PropertyWithData<
sycl::detail::PropWithDataKind::QueueComputeIndex> {
public:
compute_index(int idx) : idx(idx) {}
int get_index() { return idx; }

private:
int idx;
};
} // namespace queue
} // namespace property
} // namespace intel
} // namespace ext

// Forward declaration
class queue;

Expand All @@ -72,6 +90,9 @@ struct is_property_of<property::queue::cuda::use_default_stream, queue>
template <>
struct is_property_of<ext::oneapi::cuda::property::queue::use_default_stream,
queue> : std::true_type {};
template <>
struct is_property_of<ext::intel::property::queue::compute_index, queue>
: std::true_type {};

} // __SYCL_INLINE_VER_NAMESPACE(_V1)
} // namespace sycl
15 changes: 15 additions & 0 deletions sycl/plugins/cuda/pi_cuda.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1945,6 +1945,10 @@ pi_result cuda_piDeviceGetInfo(pi_device device, pi_device_info param_name,
sycl::detail::pi::assertion(value >= 0);
return getInfo(param_value_size, param_value, param_value_size_ret, value);
}
case PI_EXT_INTEL_DEVICE_INFO_MAX_COMPUTE_QUEUE_INDICES: {
return getInfo(param_value_size, param_value, param_value_size_ret,
pi_int32{1});
}

// TODO: Investigate if this information is available on CUDA.
case PI_DEVICE_INFO_DEVICE_ID:
Expand Down Expand Up @@ -2524,6 +2528,16 @@ pi_result cuda_piQueueCreate(pi_context context, pi_device device,
return PI_ERROR_OUT_OF_RESOURCES;
}
}
pi_result cuda_piQueueCreateEx(pi_context Context, pi_device Device,
pi_queue_properties *Properties, pi_queue *Queue) {
PI_ASSERT(Properties, PI_ERROR_INVALID_VALUE);
// Expect flags mask to be passed first.
PI_ASSERT(Properties[0] == PI_QUEUE_FLAGS, PI_ERROR_INVALID_VALUE);
pi_queue_properties Flags = Properties[1];
// Extra data isn't supported yet.
PI_ASSERT(Properties[2] == 0, PI_ERROR_INVALID_VALUE)
return cuda_piQueueCreate(Context, Device, Flags, Queue);
}

pi_result cuda_piQueueGetInfo(pi_queue command_queue, pi_queue_info param_name,
size_t param_value_size, void *param_value,
Expand Down Expand Up @@ -5452,6 +5466,7 @@ pi_result piPluginInit(pi_plugin *PluginInit) {
cuda_piextContextCreateWithNativeHandle)
// Queue
_PI_CL(piQueueCreate, cuda_piQueueCreate)
_PI_CL(piQueueCreateEx, cuda_piQueueCreateEx)
_PI_CL(piQueueGetInfo, cuda_piQueueGetInfo)
_PI_CL(piQueueFinish, cuda_piQueueFinish)
_PI_CL(piQueueFlush, cuda_piQueueFlush)
Expand Down
12 changes: 12 additions & 0 deletions sycl/plugins/esimd_emulator/pi_esimd_emulator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -785,6 +785,8 @@ pi_result piDeviceGetInfo(pi_device Device, pi_device_info ParamName,
return ReturnValue(pi_uint32{0});
case PI_DEVICE_INFO_SUB_GROUP_SIZES_INTEL:
return ReturnValue(size_t{1});
case PI_EXT_INTEL_DEVICE_INFO_MAX_COMPUTE_QUEUE_INDICES:
return ReturnValue(pi_int32{1});

CASE_PI_UNSUPPORTED(PI_DEVICE_INFO_MAX_NUM_SUB_GROUPS)
CASE_PI_UNSUPPORTED(PI_DEVICE_INFO_SUB_GROUP_INDEPENDENT_FORWARD_PROGRESS)
Expand Down Expand Up @@ -923,6 +925,16 @@ bool _pi_context::checkSurfaceArgument(pi_mem_flags Flags, void *HostPtr) {
return true;
}

pi_result piQueueCreateEx(pi_context Context, pi_device Device,
pi_queue_properties *Properties, pi_queue *Queue) {
PI_ASSERT(Properties, PI_ERROR_INVALID_VALUE);
// Expect flags mask to be passed first.
PI_ASSERT(Properties[0] == PI_QUEUE_FLAGS, PI_ERROR_INVALID_VALUE);
pi_queue_properties Flags = Properties[1];
// Extra data isn't supported yet.
PI_ASSERT(Properties[2] == 0, PI_ERROR_INVALID_VALUE)
return piQueueCreate(Context, Device, Flags, Queue);
}
pi_result piQueueCreate(pi_context Context, pi_device Device,
pi_queue_properties Properties, pi_queue *Queue) {
ARG_UNUSED(Device);
Expand Down
15 changes: 15 additions & 0 deletions sycl/plugins/hip/pi_hip.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1841,6 +1841,10 @@ pi_result hip_piDeviceGetInfo(pi_device device, pi_device_info param_name,
sycl::detail::pi::assertion(value >= 0);
return getInfo(param_value_size, param_value, param_value_size_ret, value);
}
case PI_EXT_INTEL_DEVICE_INFO_MAX_COMPUTE_QUEUE_INDICES: {
return getInfo(param_value_size, param_value, param_value_size_ret,
pi_int32{1});
}

// TODO: Implement.
case PI_DEVICE_INFO_ATOMIC_MEMORY_ORDER_CAPABILITIES:
Expand Down Expand Up @@ -2401,6 +2405,16 @@ pi_result hip_piQueueCreate(pi_context context, pi_device device,
return PI_ERROR_OUT_OF_RESOURCES;
}
}
pi_result hip_piQueueCreateEx(pi_context Context, pi_device Device,
pi_queue_properties *Properties, pi_queue *Queue) {
PI_ASSERT(Properties, PI_ERROR_INVALID_VALUE);
// Expect flags mask to be passed first.
PI_ASSERT(Properties[0] == PI_QUEUE_FLAGS, PI_ERROR_INVALID_VALUE);
pi_queue_properties Flags = Properties[1];
// Extra data isn't supported yet.
PI_ASSERT(Properties[2] == 0, PI_ERROR_INVALID_VALUE)
return hip_piQueueCreate(Context, Device, Flags, Queue);
}

pi_result hip_piQueueGetInfo(pi_queue command_queue, pi_queue_info param_name,
size_t param_value_size, void *param_value,
Expand Down Expand Up @@ -5186,6 +5200,7 @@ pi_result piPluginInit(pi_plugin *PluginInit) {
hip_piextContextCreateWithNativeHandle)
// Queue
_PI_CL(piQueueCreate, hip_piQueueCreate)
_PI_CL(piQueueCreateEx, hip_piQueueCreateEx)
_PI_CL(piQueueGetInfo, hip_piQueueGetInfo)
_PI_CL(piQueueFinish, hip_piQueueFinish)
_PI_CL(piQueueFlush, hip_piQueueFlush)
Expand Down
50 changes: 43 additions & 7 deletions sycl/plugins/level_zero/pi_level_zero.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1182,7 +1182,8 @@ _pi_queue::_pi_queue(std::vector<ze_command_queue_handle_t> &ComputeQueues,
std::vector<ze_command_queue_handle_t> &CopyQueues,
pi_context Context, pi_device Device,
bool OwnZeCommandQueue,
pi_queue_properties PiQueueProperties)
pi_queue_properties PiQueueProperties,
int ForceComputeIndex)
: Context{Context}, Device{Device}, OwnZeCommandQueue{OwnZeCommandQueue},
Properties(PiQueueProperties) {

Expand All @@ -1192,9 +1193,19 @@ _pi_queue::_pi_queue(std::vector<ze_command_queue_handle_t> &ComputeQueues,
auto &ComputeQueueGroupInfo = Device->QueueGroup[queue_type::Compute];
ComputeQueueGroup.ZeQueues = ComputeQueues;
if (ComputeQueueGroupInfo.ZeIndex >= 0) {
// Sub-sub-device

// sycl::ext::intel::property::queue::compute_index works with any
// backend/device by allowing single zero index if multiple compute CCSes
// are not supported. Sub-sub-device falls into the same bucket.
assert(ForceComputeIndex <= 0);
ComputeQueueGroup.LowerIndex = ComputeQueueGroupInfo.ZeIndex;
ComputeQueueGroup.UpperIndex = ComputeQueueGroupInfo.ZeIndex;
ComputeQueueGroup.NextIndex = ComputeQueueGroupInfo.ZeIndex;
} else if (ForceComputeIndex >= 0) {
ComputeQueueGroup.LowerIndex = ForceComputeIndex;
ComputeQueueGroup.UpperIndex = ForceComputeIndex;
ComputeQueueGroup.NextIndex = ForceComputeIndex;
} else {
// Set-up to round-robin across allowed range of engines.
uint32_t FilterLowerIndex = getRangeOfAllowedComputeEngines().first;
Expand Down Expand Up @@ -3183,6 +3194,15 @@ pi_result piDeviceGetInfo(pi_device Device, pi_device_info ParamName,
Device->ZeDeviceMemoryProperties->end(), Comp);
return ReturnValue(pi_uint32{MinIt->maxBusWidth});
}
case PI_EXT_INTEL_DEVICE_INFO_MAX_COMPUTE_QUEUE_INDICES: {
if (Device->QueueGroup[_pi_queue::queue_type::Compute].ZeIndex >= 0)
// Sub-sub-device represents a particular compute index already.
return ReturnValue(pi_int32{1});

auto ZeDeviceNumIndices = Device->QueueGroup[_pi_queue::queue_type::Compute]
.ZeProperties.numQueues;
return ReturnValue(pi_cast<pi_int32>(ZeDeviceNumIndices));
}
case PI_DEVICE_INFO_GPU_EU_COUNT: {
pi_uint32 count = Device->ZeDeviceProperties->numEUsPerSubslice *
Device->ZeDeviceProperties->numSubslicesPerSlice *
Expand Down Expand Up @@ -3517,13 +3537,29 @@ pi_result piContextRelease(pi_context Context) {
}

pi_result piQueueCreate(pi_context Context, pi_device Device,
pi_queue_properties Properties, pi_queue *Queue) {
pi_queue_properties Flags, pi_queue *Queue) {
pi_queue_properties Properties[] = {PI_QUEUE_FLAGS, Flags, 0};
return piQueueCreateEx(Context, Device, Properties, Queue);
}
pi_result piQueueCreateEx(pi_context Context, pi_device Device,
pi_queue_properties *Properties, pi_queue *Queue) {
PI_ASSERT(Properties, PI_ERROR_INVALID_VALUE);
// Expect flags mask to be passed first.
PI_ASSERT(Properties[0] == PI_QUEUE_FLAGS, PI_ERROR_INVALID_VALUE);
pi_queue_properties Flags = Properties[1];

PI_ASSERT(Properties[2] == 0 ||
(Properties[2] == PI_QUEUE_COMPUTE_INDEX && Properties[4] == 0),
PI_ERROR_INVALID_VALUE);
auto ForceComputeIndex = Properties[2] == PI_QUEUE_COMPUTE_INDEX
? static_cast<int>(Properties[3])
: -1; // Use default/round-robin.

// Check that unexpected bits are not set.
PI_ASSERT(!(Properties & ~(PI_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE |
PI_QUEUE_PROFILING_ENABLE | PI_QUEUE_ON_DEVICE |
PI_QUEUE_ON_DEVICE_DEFAULT |
PI_EXT_ONEAPI_QUEUE_DISCARD_EVENTS)),
PI_ASSERT(!(Flags & ~(PI_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE |
PI_QUEUE_PROFILING_ENABLE | PI_QUEUE_ON_DEVICE |
PI_QUEUE_ON_DEVICE_DEFAULT |
PI_EXT_ONEAPI_QUEUE_DISCARD_EVENTS)),
PI_ERROR_INVALID_VALUE);

PI_ASSERT(Context, PI_ERROR_INVALID_CONTEXT);
Expand Down Expand Up @@ -3554,7 +3590,7 @@ pi_result piQueueCreate(pi_context Context, pi_device Device,

try {
*Queue = new _pi_queue(ZeComputeCommandQueues, ZeCopyCommandQueues, Context,
Device, true, Properties);
Device, true, Flags, ForceComputeIndex);
} catch (const std::bad_alloc &) {
return PI_ERROR_OUT_OF_HOST_MEMORY;
} catch (...) {
Expand Down
2 changes: 1 addition & 1 deletion sycl/plugins/level_zero/pi_level_zero.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -644,7 +644,7 @@ struct _pi_queue : _pi_object {
_pi_queue(std::vector<ze_command_queue_handle_t> &ComputeQueues,
std::vector<ze_command_queue_handle_t> &CopyQueues,
pi_context Context, pi_device Device, bool OwnZeCommandQueue,
pi_queue_properties Properties = 0);
pi_queue_properties Properties = 0, int ForceComputeIndex = -1);

using queue_type = _pi_device::queue_group_info_t::type;

Expand Down
15 changes: 15 additions & 0 deletions sycl/plugins/opencl/pi_opencl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -330,6 +330,11 @@ pi_result piDeviceGetInfo(pi_device device, pi_device_info paramName,
out[2] = Max;
return PI_SUCCESS;
}
case PI_EXT_INTEL_DEVICE_INFO_MAX_COMPUTE_QUEUE_INDICES: {
pi_int32 result = 1;
std::memcpy(paramValue, &result, sizeof(pi_int32));
return PI_SUCCESS;
}

default:
cl_int result = clGetDeviceInfo(
Expand Down Expand Up @@ -457,6 +462,16 @@ pi_result piextDeviceCreateWithNativeHandle(pi_native_handle nativeHandle,
return PI_SUCCESS;
}

pi_result piQueueCreateEx(pi_context Context, pi_device Device,
pi_queue_properties *Properties, pi_queue *Queue) {
assert(Properties);
// Expect flags mask to be passed first.
assert(Properties[0] == PI_QUEUE_FLAGS);
pi_queue_properties Flags = Properties[1];
// Extra data isn't supported yet.
assert(Properties[2] == 0);
return piQueueCreate(Context, Device, Flags, Queue);
}
pi_result piQueueCreate(pi_context context, pi_device device,
pi_queue_properties properties, pi_queue *queue) {
assert(queue && "piQueueCreate failed, queue argument is null");
Expand Down
8 changes: 8 additions & 0 deletions sycl/source/detail/device_info.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1589,6 +1589,14 @@ get_device_info_host<ext::intel::info::device::memory_bus_width>() {
PI_ERROR_INVALID_DEVICE);
}

template <>
inline int32_t
get_device_info_host<ext::intel::info::device::max_compute_queue_indices>() {
throw runtime_error(
"Obtaining max compute queue indices is not supported on HOST device",
PI_ERROR_INVALID_DEVICE);
}

} // namespace detail
} // __SYCL_INLINE_VER_NAMESPACE(_V1)
} // namespace sycl
24 changes: 22 additions & 2 deletions sycl/source/detail/queue_impl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,18 @@ class queue_impl {
"Queue cannot be constructed with both of "
"discard_events and enable_profiling.");
}
if (has_property<ext::intel::property::queue::compute_index>()) {
int Idx = get_property<ext::intel::property::queue::compute_index>()
.get_index();
int NumIndices =
createSyclObjFromImpl<device>(Device)
.get_info<ext::intel::info::device::max_compute_queue_indices>();
if (Idx < 0 || Idx >= NumIndices)
throw sycl::exception(
make_error_code(errc::invalid),
"Queue compute index must be a non-negative number less than "
"device's number of available compute queue indices.");
}
if (!Context->isDeviceValid(Device)) {
if (!Context->is_host() &&
Context->getPlugin().getBackend() == backend::opencl)
Expand Down Expand Up @@ -318,8 +330,16 @@ class queue_impl {
const detail::plugin &Plugin = getPlugin();

assert(Plugin.getBackend() == MDevice->getPlugin().getBackend());
RT::PiResult Error = Plugin.call_nocheck<PiApiKind::piQueueCreate>(
Context, Device, CreationFlags, &Queue);
RT::PiQueueProperties Properties[] = {PI_QUEUE_FLAGS, CreationFlags, 0, 0,
0};
if (has_property<ext::intel::property::queue::compute_index>()) {
int Idx = get_property<ext::intel::property::queue::compute_index>()
.get_index();
Properties[2] = PI_QUEUE_COMPUTE_INDEX;
Properties[3] = static_cast<RT::PiQueueProperties>(Idx);
}
RT::PiResult Error = Plugin.call_nocheck<PiApiKind::piQueueCreateEx>(
Context, Device, Properties, &Queue);

// If creating out-of-order queue failed and this property is not
// supported (for example, on FPGA), it will return
Expand Down
6 changes: 6 additions & 0 deletions sycl/unittests/helpers/PiMockPlugin.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -322,6 +322,12 @@ inline pi_result mock_piQueueCreate(pi_context context, pi_device device,
*queue = createDummyHandle<pi_queue>();
return PI_SUCCESS;
}
inline pi_result mock_piQueueCreateEx(pi_context context, pi_device device,
pi_queue_properties *properties,
pi_queue *queue) {
*queue = createDummyHandle<pi_queue>();
return PI_SUCCESS;
}

inline pi_result mock_piQueueGetInfo(pi_queue command_queue,
pi_queue_info param_name,
Expand Down
Loading