Distributed Ranges
Loading...
Searching...
No Matches
broadcasted_vector.hpp
1// SPDX-FileCopyrightText: Intel Corporation
2//
3// SPDX-License-Identifier: BSD-3-Clause
4
5#pragma once
6
7namespace dr::mp {
8
9template <typename T, typename Allocator = dr::mp::__detail::allocator<T>>
11public:
12 broadcasted_vector() = default;
13
14 template <rng::input_range R>
15 void broadcast_data(std::size_t data_size, std::size_t root, R root_data,
16 dr::communicator comm) {
17 if (_data != nullptr) {
18 destroy_data();
19 }
20 _data_size = data_size;
21 _data = alloc.allocate(_data_size);
22 if (comm.rank() == root) {
23 if (use_sycl()) {
24 __detail::sycl_copy(std::to_address(root_data.begin()),
25 std::to_address(root_data.end()), _data);
26 } else {
27 rng::copy(root_data.begin(), root_data.end(), _data);
28 }
29 }
30 comm.bcast(_data, sizeof(T) * _data_size, root);
31 }
32
33 void destroy_data() {
34 alloc.deallocate(_data, _data_size);
35 _data_size = 0;
36 _data = nullptr;
37 }
38
39 T &operator[](std::size_t index) { return _data[index]; }
40
41 T *broadcasted_data() { return _data; }
42
43 auto size() { return _data_size; }
44
45 auto begin() const { return _data; }
46 auto end() const { return begin() + _data_size; }
47
48private:
49 T *_data = nullptr;
50 std::size_t _data_size = 0;
51 Allocator alloc;
52};
53} // namespace dr::mp
Definition: communicator.hpp:13
Definition: index.hpp:34
Definition: broadcasted_vector.hpp:10