Distributed Ranges
Loading...
Searching...
No Matches
detail.hpp
1// SPDX-FileCopyrightText: Intel Corporation
2//
3// SPDX-License-Identifier: BSD-3-Clause
4
5#pragma once
6
7#include <dr/detail/ranges.hpp>
8#include <dr/detail/sycl_utils.hpp>
9#include <dr/sp/device_ptr.hpp>
10#include <dr/sp/init.hpp>
11#include <iterator>
12#include <sycl/sycl.hpp>
13
14namespace dr::sp {
15
16namespace __detail {
17
18inline constexpr auto local = dr::ranges::__detail::local;
19
20template <typename Src, typename Dest>
21concept is_syclmemcopyable = std::is_same_v<std::remove_const_t<Src>, Dest> &&
22 std::is_trivially_copyable_v<Dest>;
23
24template <std::contiguous_iterator Iter>
25sycl::usm::alloc get_pointer_type(Iter iter) {
26 return sycl::get_pointer_type(std::to_address(iter), sp::context());
27}
28
29template <typename T> sycl::usm::alloc get_pointer_type(sp::device_ptr<T> ptr) {
30 return sycl::get_pointer_type(ptr.get_raw_pointer(), sp::context());
31}
32
33template <std::contiguous_iterator Iter>
34sycl::device get_pointer_device(Iter iter) {
35 return sycl::get_pointer_device(std::to_address(iter), sp::context());
36}
37
38template <typename T> sycl::device get_pointer_device(sp::device_ptr<T> ptr) {
39 return sycl::get_pointer_device(ptr.get_raw_pointer(), sp::context());
40}
41
42template <typename InputIt> sycl::queue &get_queue_for_pointer(InputIt iter) {
43 if (get_pointer_type(iter) == sycl::usm::alloc::device) {
44 auto device = get_pointer_device(iter);
45 return __detail::queue(device);
46 } else {
47 return default_queue();
48 }
49}
50
51template <typename InputIt, typename OutputIt>
52sycl::queue &get_queue_for_pointers(InputIt iter, OutputIt iter2) {
53 if (get_pointer_type(iter) == sycl::usm::alloc::device) {
54 auto device = get_pointer_device(iter);
55 return __detail::queue(device);
56 } else if (get_pointer_type(iter2) == sycl::usm::alloc::device) {
57 auto device = get_pointer_device(iter2);
58 return __detail::queue(device);
59 } else {
60 return default_queue();
61 }
62}
63
64inline sycl::event combine_events(sycl::queue &q,
65 const std::vector<sycl::event> &events) {
66 auto e = q.submit([&](auto &&h) {
67 h.depends_on(events);
68 h.host_task([] {});
69 });
70
71 return e;
72}
73
74inline sycl::event combine_events(const std::vector<sycl::event> &events) {
75 auto &&q = __detail::queue(0);
76 return combine_events(q, events);
77}
78
79inline void wait(sycl::event &event) { event.wait(); }
80
81inline void wait(sycl::event &&event) { event.wait(); }
82
83inline void wait(const std::vector<sycl::event> &events) {
84 sycl::event::wait(events);
85}
86
87} // namespace __detail
88
89} // namespace dr::sp
Definition: device_ptr.hpp:17
Definition: detail.hpp:21