Graphite
Loading...
Searching...
No Matches
vector.hpp
Go to the documentation of this file.
1
2#pragma once
3#include <thrust/device_ptr.h>
4#include <thrust/universal_vector.h>
5namespace graphite {
6
7// https://github.com/NVIDIA/cccl/issues/810
8
9template <typename T>
10struct uninitialized_allocator : thrust::cuda::universal_allocator<T> {
11 __host__ uninitialized_allocator() {}
13 : thrust::cuda::universal_allocator<T>(other) {}
14 __host__ ~uninitialized_allocator() {}
15
16 uninitialized_allocator &operator=(const uninitialized_allocator &) = default;
17
18 template <typename U> struct rebind {
19 typedef uninitialized_allocator<U> other;
20 };
21
22 __host__ __device__ void construct(T *) {}
23};
24
25template <typename T> class managed_vector {
26
27private:
28 size_t m_capacity;
29 size_t m_size;
30
31 thrust::universal_ptr<T> m_data;
32 uninitialized_allocator<T> alloc;
33 // thrust::cuda::universal_allocator<T> alloc;
34
35 void deallocate() {
36 if (m_capacity > 0) {
37 for (size_t i = 0; i < m_size; i++) {
38 m_data[i].~T();
39 }
40 alloc.deallocate(m_data, m_capacity);
41 m_data = nullptr;
42 }
43 }
44
45public:
46 managed_vector() : m_capacity(0), m_size(0), m_data(nullptr) {}
47 managed_vector(size_t size)
48 : m_capacity(size), m_size(size), m_data(alloc.allocate(size)) {}
49
50 managed_vector(const managed_vector &) = delete;
51 managed_vector &operator=(const managed_vector &) = delete;
52 managed_vector(managed_vector &&) = delete;
53 managed_vector &operator=(managed_vector &&) = delete;
54
55 ~managed_vector() { deallocate(); }
56
57 size_t capacity() const { return m_capacity; }
58
59 size_t size() const { return m_size; }
60
61 void reserve(size_t size) {
62 if (size > m_capacity) {
63
64 thrust::universal_ptr<T> new_data = alloc.allocate(size);
65
66 if (m_size > 0) {
67 for (size_t i = 0; i < m_size; i++) {
68 new (new_data.get() + i) T(m_data[i]);
69 }
70 }
71
72 deallocate();
73
74 m_data = new_data;
75 m_capacity = size;
76 }
77 }
78
79 void resize(size_t size) {
80 if (size < m_size) {
81 for (size_t i = size; i < m_size; i++) {
82 m_data[i].~T();
83 }
84 } else if (size > m_capacity) {
85 reserve(size);
86 }
87 m_size = size;
88 }
89
90 void push_back(const T &value) {
91 if (m_size == m_capacity) {
92 reserve(m_capacity == 0 ? 1 : m_capacity * 2);
93 }
94 new (m_data.get() + m_size) T(value);
95 m_size++;
96 }
97
98 void pop_back() {
99 if (m_size > 0) {
100 m_data[m_size - 1].~T();
101 m_size--;
102 }
103 }
104
105 T &operator[](size_t index) { return m_data[index]; }
106 const T &operator[](size_t index) const { return m_data[index]; }
107
108 T &back() { return m_data[m_size - 1]; }
109
110 const T &back() const { return m_data[m_size - 1]; }
111
112 T *begin() { return m_data.get(); }
113
114 T *end() { return m_data.get() + m_size; }
115
116 thrust::universal_ptr<T> data() { return m_data; }
117
118 const thrust::universal_ptr<T> data() const { return m_data; }
119
120 void clear() {
121 for (size_t i = 0; i < m_size; i++) {
122 m_data[i].~T();
123 }
124 m_size = 0;
125 }
126};
127
128} // namespace graphite
Definition vector.hpp:25
Definition vector.hpp:10