10#ifdef SYCL_LANGUAGE_VERSION
14sycl::queue &sycl_queue();
18namespace dr::mp::__detail {
21template <
typename T>
auto sycl_get_deref(T v) {
22 using deref_type = std::remove_reference<
decltype(*v)>::type;
25 sycl::buffer<deref_type> buff(&temp, 1);
27 .submit([&](
auto &&h) {
28 sycl::accessor access(buff, h, sycl::write_only, sycl::no_init);
29 h.single_task([=](
auto i) { access[0] = *v; });
36template <
typename T> T sycl_get(T &v) {
38 sycl_queue().memcpy(&temp, &v,
sizeof(v)).wait();
42template <
typename T>
auto sycl_get(T &v1, T &v2) {
44 auto ev1 = sycl_queue().memcpy(&temp.first, &v1,
sizeof(v1));
45 auto ev2 = sycl_queue().memcpy(&temp.second, &v2,
sizeof(v2));
51template <
typename T>
void sycl_copy(T
const *begin, T
const *end, T *dst) {
52 sycl_queue().memcpy(dst, begin, (end - begin) *
sizeof(T)).wait();
55template <
typename T, std::
size_t Alignment>
56using shared_base_allocator =
57 sycl::usm_allocator<T, sycl::usm::alloc::shared, Alignment>;
63template <
typename T, std::
size_t Alignment = 0>
64class sycl_shared_allocator
65 :
public __detail::shared_base_allocator<T, Alignment> {
67 sycl_shared_allocator(sycl::queue q = sycl_queue())
68 : __detail::shared_base_allocator<T, Alignment>(q) {}
72 device_policy(sycl::queue q = sycl_queue()) : queue(q), dpl_policy(q) {}
75 decltype(oneapi::dpl::execution::make_device_policy(queue)) dpl_policy;
88namespace dr::mp::__detail {
91template <
typename T> T sycl_get(T &v) {
97template <
typename T>
auto sycl_get(T &v1, T &v2) {
99 return std::pair<T, T>{v1, v2};
102template <
typename T>
void sycl_copy(T
const *begin, T
const *end, T *dst) {
110namespace dr::mp::__detail {
113void sycl_copy(T
const *src, T *dst, std::size_t size = 1) {
114 sycl_copy(src, src + size, dst);
Definition: sycl_support.hpp:84