10#include <sycl/sycl.hpp>
14#include <dr/sp/algorithms/execution_policy.hpp>
15#include <dr/sp/util.hpp>
16#include <oneapi/dpl/execution>
22inline sycl::context *global_context_;
24inline std::vector<sycl::device> devices_;
26inline std::vector<sycl::queue> queues_;
28inline std::vector<oneapi::dpl::execution::device_policy<>> dpl_policies_;
30inline std::size_t ngpus_;
32inline sycl::context &global_context() {
return *global_context_; }
34inline std::size_t ngpus() {
return ngpus_; }
36inline std::span<sycl::device> global_devices() {
return devices_; }
40inline sycl::context &context() {
return __detail::global_context(); }
42inline std::span<sycl::device> devices() {
return __detail::global_devices(); }
44inline std::size_t nprocs() {
return __detail::ngpus(); }
46inline device_policy par_unseq;
48template <rng::range R>
49inline void init(R &&devices)
51 std::is_same_v<sycl::device, std::remove_cvref_t<rng::range_value_t<R>>>)
53 __detail::devices_.assign(rng::begin(devices), rng::end(devices));
54 __detail::global_context_ =
new sycl::context(__detail::devices_);
55 __detail::ngpus_ = rng::size(__detail::devices_);
57 for (
auto &&device : __detail::devices_) {
58 sycl::queue q(*__detail::global_context_, device);
59 __detail::queues_.push_back(q);
61 __detail::dpl_policies_.emplace_back(__detail::queues_.back());
64 par_unseq = device_policy(__detail::devices_);
67template <__detail::sycl_device_selector Selector>
68inline void init(Selector &&selector) {
69 auto devices = get_numa_devices(selector);
73inline void init() { init(sycl::default_selector_v); }
75inline void finalize() {
76 __detail::dpl_policies_.clear();
77 __detail::queues_.clear();
78 __detail::devices_.clear();
79 delete __detail::global_context_;
84inline sycl::queue &queue(std::size_t rank) {
return queues_[rank]; }
87inline sycl::queue &queue(
const sycl::device &device) {
88 for (std::size_t rank = 0; rank < sp::nprocs(); rank++) {
89 if (sp::devices()[rank] == device) {
98inline sycl::queue &default_queue() {
return queue(0); }
100inline auto &dpl_policy(std::size_t rank) {
101 return __detail::dpl_policies_[rank];