PeriDyno 1.0.0
Loading...
Searching...
No Matches
ArrayMap.inl
Go to the documentation of this file.
1#include "ArrayTools.h"
2#include "Algorithm/Scan.h"
4
5namespace dyno
6{
7 template<class ElementType>
8 class ArrayMap<ElementType, DeviceType::GPU>
9 {
10 public:
12 {
13 };
14
19
27 bool resize(const DArray<uint> counts);
28 bool resize(const uint arraySize, const uint eleSize);
29
30 void reset();
31
32 template<typename ET2>
33 bool resize(const ArrayMap<ET2, DeviceType::GPU>& src);
34
35 DYN_FUNC inline uint size() const { return m_maps.size(); }
36 DYN_FUNC inline uint elementSize() const { return m_elements.size(); }
37
38 GPU_FUNC inline Map<int, ElementType>& operator [] (unsigned int id) {
39 return m_maps[id];
40 }
41
42 GPU_FUNC inline const Map<int, ElementType>& operator [] (unsigned int id) const {
43 return m_maps[id];
44 }
45
46 DYN_FUNC inline bool isCPU() const { return false; }
47 DYN_FUNC inline bool isGPU() const { return true; }
48 DYN_FUNC inline bool isEmpty() const { return m_index.size() == 0; }
49
50 void clear();
51
52 void assign(const ArrayMap<ElementType, DeviceType::GPU>& src);
53 void assign(const ArrayMap<ElementType, DeviceType::CPU>& src);
54 void assign(std::vector<std::map<int, ElementType>>& src);
55
56 friend std::ostream& operator<<(std::ostream& out, const ArrayMap<ElementType, DeviceType::GPU>& aMap)
57 {
59 hMap.assign(aMap);
60 out << hMap;
61
62 return out;
63 }
64
65 const DArray<uint>& index() const { return m_index; }
67 const DArray<Map<int, ElementType>>& maps() const { return m_maps; }
68
73
74 private:
77
79 };
80
81 template<typename T>
83
84 template<class ElementType>
86 {
87 m_index.clear();
88 m_elements.clear();
89 m_maps.clear();
90 }
91
92 template<class ElementType>
94 {
95 assert(counts.size() > 0);
96
97 if (m_index.size() != counts.size())
98 {
99 m_index.resize(counts.size());
100 m_maps.resize(counts.size());
101 }
102
103 m_index.assign(counts);
104
105 Reduction<uint> reduce;
106 int total_num = reduce.accumulate(m_index.begin(), m_index.size());
107
108 Scan<uint> scan;
109 scan.exclusive(m_index);
110
111 m_elements.resize(total_num);
112
114
115 return true;
116 }
117
118 template<class ElementType>
123
124 template<class ElementType>
125 bool ArrayMap<ElementType, DeviceType::GPU>::resize(const uint arraySize, const uint eleSize)
126 {
127 assert(arraySize > 0);
128 assert(eleSize > 0);
129
130 if (m_index.size() != arraySize)
131 {
132 m_index.resize(arraySize);
133 m_maps.resize(arraySize);
134 }
135
136 CArray<uint> hIndex;
137 hIndex.resize(arraySize);
138 int accNum = 0;
139 for (size_t i = 0; i < arraySize; i++)
140 {
141 hIndex[i] = (uint)accNum;
142 accNum += eleSize;
143 }
144
145 m_index.assign(hIndex);
146
147 m_elements.resize(arraySize*eleSize);
148
150
151 return true;
152 }
153
154 template<typename ElementType>
155 template<typename ET2>
157 uint arraySize = src.size();
158 if (m_index.size() != arraySize)
159 {
160 m_index.resize(arraySize);
161 m_maps.resize(arraySize);
162 }
163
164 m_index.assign(src.index());
165 m_elements.resize(src.elementSize());
166
168
169 return true;
170 }
171
172 template<class ElementType>
174 {
175 m_index.assign(src.index());
176 m_elements.assign(src.elements());
177
178 m_maps.assign(src.maps());
179
180 //redirect the element address
182 }
183
184 template<class ElementType>
186 {
187 m_index.assign(src.index());
188 m_elements.assign(src.elements());
189
190 m_maps.assign(src.maps());
191
192 //redirect the element address
194 }
195
196 template<class ElementType>
197 void ArrayMap<ElementType, DeviceType::GPU>::assign(std::vector<std::map<int,ElementType>>& src)
198 {
199 size_t indNum = src.size();
200 CArray<uint> hIndex(indNum);
201
203
204 size_t eleNum = 0;
205 for (int i = 0; i < src.size(); i++)
206 {
207 hIndex[i] = (uint)eleNum;
208 eleNum += src[i].size();
209
210 if (src[i].size() > 0)
211 {
212 for (typename std::map<int, ElementType>::iterator map_it = src[i].begin(); map_it != src[i].end(); map_it++)
213 {
214 Pair<int, ElementType> mypair(map_it->first, map_it->second);
215 hElements.pushBack(mypair);
216 }
217 }
218 }
220 maps.resize(indNum);
221
222 m_index.assign(hIndex);
223 m_elements.assign(hElements);
224 Pair<int, ElementType>* strAdr = m_elements.begin();
225
226 eleNum = 0;
227 for (int i = 0; i < src.size(); i++)
228 {
229 size_t num_i = src[i].size();
231 mmap.assign(strAdr + eleNum, num_i, num_i);
232 //printf("DArrayMap.assign(std::vector<std::map<>>): the ptrpair is: %x \n", (strAdr + eleNum));
233 maps[i] = mmap;
234
235 eleNum += src[i].size();
236 }
237
238 m_maps.assign(maps);
239 }
240
241 template<class ElementType>
243 {
244 assert(num > 0);
245
246 m_maps.resize(num);
247 m_index.resize(num);
248
249 return true;
250 }
251
252 template<class ElementType>
257
258 template<class ElementType>
260 {
261 for (int i = 0; i < m_maps.size(); i++)
262 {
263 m_maps[i].clear();
264 }
265
266 m_maps.clear();
267 m_index.clear();
268 m_elements.clear();
269 }
270
271 template<class ElementType>
273 {
274 m_index.assign(src.index());
275 m_elements.assign(src.elements());
276
277 m_maps.assign(src.maps());
278
279 //redirect the element address
280 for (int i = 0; i < src.size(); i++)
281 {
282 m_maps[i].reserve(m_elements.begin() + m_index[i], m_maps[i].size());
283 }
284 }
285
286 template<class ElementType>
288 {
289 m_index.assign(src.index());
290 m_elements.assign(src.elements());
291
292 m_maps.assign(src.maps());
293
294 //redirect the element address
295 for (int i = 0; i < src.size(); i++)
296 {
297 m_maps[i].reserve(m_elements.begin() + m_index[i], m_maps[i].size());
298 }
299 }
300}
assert(queueCount >=1)
CArray< Pair< int, ElementType > > m_elements
Definition ArrayMap.h:88
CArray< Map< int, ElementType > > m_maps
Definition ArrayMap.h:90
const DArray< uint > & index() const
Definition ArrayMap.inl:65
ArrayMap< ElementType, DeviceType::GPU > & operator=(const ArrayMap< ElementType, DeviceType::GPU > &)=delete
To avoid erroneous shallow copy.
DArray< Map< int, ElementType > > m_maps
Definition ArrayMap.inl:78
const DArray< Map< int, ElementType > > & maps() const
Definition ArrayMap.inl:67
~ArrayMap()
Do not release memory here, call clear() explicitly.
Definition ArrayMap.inl:18
friend std::ostream & operator<<(std::ostream &out, const ArrayMap< ElementType, DeviceType::GPU > &aMap)
Definition ArrayMap.inl:56
const DArray< Pair< int, ElementType > > & elements() const
Definition ArrayMap.inl:66
DArray< Pair< int, ElementType > > m_elements
Definition ArrayMap.inl:76
Be aware do not use this structure on GPU if the data size is large.
Definition Map.h:16
DYN_FUNC void assign(Pair< MKey, T > *beg, int num, int buffer_size)
Definition Map.h:41
DYN_FUNC uint size()
Definition Map.inl:52
T accumulate(const T *val, const uint num)
void exclusive(T *output, const T *input, size_t length, bool bcao=true)
This is an implementation of AdditiveCCD based on peridyno.
Definition Array.h:25
void parallel_init_for_map(void *maps, void *elements, size_t ele_size, DArray< uint > &index)
Array< T, DeviceType::GPU > DArray
Definition Array.inl:89
ArrayMap< T, DeviceType::GPU > DArrayMap
Definition ArrayMap.inl:82
void parallel_allocate_for_map(void *maps, void *elements, size_t ele_size, DArray< uint > &index)
Array< T, DeviceType::CPU > CArray
Definition Array.h:151
unsigned int uint
Definition VkProgram.h:14