Skip to content

dpl::execution::device_policy construction from SYCL selector is broken #1965

Closed
@dmitriy-sobolev

Description

@dmitriy-sobolev

Describe the Bug:
The documentation allows dpl::execution::device_policy object construction from a SYCL selector (e.g. sycl::default_selector_v), but it does not work.

Note in the documentation:

This code does not work:

// t.cpp
#include <oneapi/dpl/execution>
int main()
{
    auto policy_a = oneapi::dpl::execution::device_policy{sycl::default_selector_v};
    auto policy_b = oneapi::dpl::execution::make_device_policy(sycl::default_selector_v);
    return 0;
}

To Reproduce:

icpx -fsycl -I /path/to/oneDPL/include t.cpp -o t && ./t

// icpx --version
// >> Intel(R) oneAPI DPC++/C++ Compiler 2025.0.0 (2025.0.0.20240909)

Expected Behavior:
The reproducer compiles and silently passes.

Observed Behavior:

t.cpp:4:21: error: no viable constructor or deduction guide for deduction of template arguments of 'oneapi::dpl::execution::device_policy'
    4 |     auto policy_a = oneapi::dpl::execution::device_policy{sycl::default_selector_v};
      |                     ^
/oneDPL/include/oneapi/dpl/pstl/hetero/dpcpp/execution_sycl_defs.h:163:14: note: candidate function template not viable: no known conversion from 'int (const device &)' to 'sycl::queue' for 1st argument
  163 |     explicit device_policy(sycl::queue q) : __qh(std::move(q)) {}
      |              ^             ~~~~~~~~~~~~~
/oneDPL/include/oneapi/dpl/pstl/hetero/dpcpp/execution_sycl_defs.h:163:14: note: implicit deduction guide declared as 'template <typename KernelName = DefaultKernelName> explicit device_policy(sycl::queue q) -> device_policy<KernelName>'
/oneDPL/include/oneapi/dpl/pstl/hetero/dpcpp/execution_sycl_defs.h:164:14: note: candidate function template not viable: no known conversion from 'int (const device &)' to 'sycl::device' for 1st argument
  164 |     explicit device_policy(sycl::device d) : __qh(std::move(d)) {}
      |              ^             ~~~~~~~~~~~~~~
/oneDPL/include/oneapi/dpl/pstl/hetero/dpcpp/execution_sycl_defs.h:164:14: note: implicit deduction guide declared as 'template <typename KernelName = DefaultKernelName> explicit device_policy(sycl::device d) -> device_policy<KernelName>'
/oneDPL/include/oneapi/dpl/pstl/hetero/dpcpp/execution_sycl_defs.h:174:14: note: candidate function template not viable: no known conversion from 'int (const device &)' to '__internal::__global_instance_tag' for 1st argument
  174 |     explicit device_policy(__internal::__global_instance_tag __t)
      |              ^             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/oneDPL/include/oneapi/dpl/pstl/hetero/dpcpp/execution_sycl_defs.h:174:14: note: implicit deduction guide declared as 'template <typename KernelName = DefaultKernelName> explicit device_policy(__internal::__global_instance_tag __t) -> device_policy<KernelName>'
/oneDPL/include/oneapi/dpl/pstl/hetero/dpcpp/execution_sycl_defs.h:155:7: note: candidate template ignored: could not match 'device_policy<KernelName>' against 'int (*)(const device &)'
  155 | class device_policy
      |       ^
/oneDPL/include/oneapi/dpl/pstl/hetero/dpcpp/execution_sycl_defs.h:155:7: note: implicit deduction guide declared as 'template <typename KernelName = DefaultKernelName> device_policy(device_policy<KernelName>) -> device_policy<KernelName>'
/oneDPL/include/oneapi/dpl/pstl/hetero/dpcpp/execution_sycl_defs.h:162:5: note: candidate template ignored: could not match 'device_policy<type-parameter-0-1>' against 'int (const device &)'
  162 |     device_policy(const device_policy<OtherName>& other) : __qh(other.queue()) {}
      |     ^
/oneDPL/include/oneapi/dpl/pstl/hetero/dpcpp/execution_sycl_defs.h:162:5: note: implicit deduction guide declared as 'template <typename KernelName = DefaultKernelName, typename OtherName> device_policy(const device_policy<type-parameter-0-1> &other) -> device_policy<KernelName>'
/oneDPL/include/oneapi/dpl/pstl/hetero/dpcpp/execution_sycl_defs.h:160:5: note: candidate function template not viable: requires 0 arguments, but 1 was provided
  160 |     device_policy() : device_policy(__internal::__get_default_queue()) {}
      |     ^
/oneDPL/include/oneapi/dpl/pstl/hetero/dpcpp/execution_sycl_defs.h:160:5: note: implicit deduction guide declared as 'template <typename KernelName = DefaultKernelName> device_policy() -> device_policy<KernelName>'
/oneDPL/include/oneapi/dpl/pstl/hetero/dpcpp/execution_sycl_defs.h:178:5: note: candidate function template not viable: requires 2 arguments, but 1 was provided
  178 |     device_policy(__internal::__global_instance_tag __t, __internal::__queue_factory __f) : __qh(__t, __f) {}
      |     ^             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Additional Context:

Possible solutions:

  • Remove the note from the documentation. The bug has been here for ~2 years according to Fix error in make_device_policy call #762, so it is questionable whether it should be considered as a breaking change or not.
  • Fix it.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions