Geant4 11.4.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
LUPI_dataBuffer.hpp
Go to the documentation of this file.
1/*
2# <<BEGIN-copyright>>
3# Copyright 2019, Lawrence Livermore National Security, LLC.
4# This file is part of the gidiplus package (https://github.com/LLNL/gidiplus).
5# gidiplus is licensed under the MIT license (see https://opensource.org/licenses/MIT).
6# SPDX-License-Identifier: MIT
7# <<END-copyright>>
8*/
9
10#ifndef LUPI_data_buffer_hpp_included
11#define LUPI_data_buffer_hpp_included 1
12
13#include <cstdint>
14
15#include <LUPI_defines.hpp>
16#include <LUPI_declareMacro.hpp>
17
18namespace LUPI {
19
20/*
21============================================================
22========================= DataBuffer =======================
23============================================================
24*/
26
27 public:
28 std::size_t m_intIndex;
29 std::size_t m_floatIndex;
30 std::size_t m_doubleIndex;
31 std::size_t m_charIndex;
32 std::size_t m_longIndex;
33 std::size_t m_size_tIndex;
34
37 double *m_doubleData;
39 std::uint64_t *m_longData;
40 std::size_t *m_size_tData;
41
42 // For unpacking into pre-allocated memory
45 std::size_t m_maxPlacementSize;
46
47 // If m_sharedPlacementStart is not a nullPtr, place int and double vector information here
48 // m_sharedMaxPlacementSize is how much shared memory will be used.
52
53 enum class Mode { Count, Pack, Unpack, Reset, Memory };
54
56 m_intIndex( 0 ),
57 m_floatIndex( 0 ),
58 m_doubleIndex( 0 ),
59 m_charIndex( 0 ),
60 m_longIndex( 0 ),
61 m_size_tIndex( 0 ),
62
63 m_intData( nullptr ),
64 m_floatData( nullptr ),
65 m_doubleData( nullptr ),
66 m_charData( nullptr ),
67 m_longData( nullptr ),
68 m_size_tData( nullptr ),
69
70 m_placementStart( nullptr ),
71 m_placement( nullptr ),
73 m_sharedPlacementStart( nullptr ),
74 m_sharedPlacement( nullptr ),
76 }
77
79 m_intIndex( 0 ),
80 m_floatIndex( 0 ),
81 m_doubleIndex( 0 ),
82 m_charIndex( 0 ),
83 m_longIndex( 0 ),
84 m_size_tIndex( 0 ),
85
86 m_intData( nullptr ),
87 m_floatData( nullptr ),
88 m_doubleData( nullptr ),
89 m_charData( nullptr ),
90 m_longData( nullptr ),
91 m_size_tData( nullptr ),
92
93 m_placementStart( nullptr ),
94 m_placement( nullptr ),
96 m_sharedPlacementStart( nullptr ),
97 m_sharedPlacement( nullptr ),
99
100 if( rhs.m_placementStart == nullptr ) m_placementStart = rhs.m_placementStart; // Only to stop compiler warning of unused variable as cannot get [[maybe_unused]] to work.
101
102 }
103
105
106 delete [] m_intData;
107 delete [] m_floatData;
108 delete [] m_doubleData;
109 delete [] m_charData;
110 delete [] m_longData;
111 delete [] m_size_tData;
112 }
113
118
119 LUPI_HOST_DEVICE void copyIndexes( DataBuffer const &a_input ) {
120
121 m_intIndex = a_input.m_intIndex;
122 m_floatIndex = a_input.m_floatIndex;
124 m_charIndex = a_input.m_charIndex;
125 m_longIndex = a_input.m_longIndex;
127 }
128
129 LUPI_HOST_DEVICE void simpleCopy( DataBuffer const &a_input ) {
130
131 m_intIndex = a_input.m_intIndex;
132 m_floatIndex = a_input.m_floatIndex;
134 m_charIndex = a_input.m_charIndex;
135 m_longIndex = a_input.m_longIndex;
137
138 m_intData = a_input.m_intData;
139 m_floatData = a_input.m_floatData;
140 m_doubleData = a_input.m_doubleData;
141 m_charData = a_input.m_charData;
142 m_longData = a_input.m_longData;
143 m_size_tData = a_input.m_size_tData;
144
146 m_placement = a_input.m_placement;
151 }
152
153 // Useful for temporary buffers that we don't want destroying the data in the destructor
155
156 m_intData = nullptr;
157 m_floatData = nullptr;
158 m_doubleData = nullptr;
159 m_charData = nullptr;
160 m_longData = nullptr;
161 m_size_tData = nullptr;
162 }
163
165
166 m_intData = new int[m_intIndex];
167 m_floatData = new float[m_floatIndex];
168 m_doubleData = new double[m_doubleIndex];
169 m_charData = new char[m_charIndex];
170 m_longData = new std::uint64_t[m_longIndex];
171 m_size_tData = new std::size_t[m_size_tIndex];
172 }
173
175
176 delete [] m_intData;
177 delete [] m_floatData;
178 delete [] m_doubleData;
179 delete [] m_charData;
180 delete [] m_longData;
181 delete [] m_size_tData;
182
183 zeroIndexes( );
185 }
186
187 LUPI_HOST_DEVICE bool compareIndexes( LUPI_maybeUnused char const *a_file, LUPI_maybeUnused int a_line, DataBuffer const &a_input ) {
188
189 return( ( a_input.m_intIndex == m_intIndex ) && ( a_input.m_floatIndex == m_floatIndex ) &&
190 ( a_input.m_doubleIndex == m_doubleIndex ) &&
191 ( a_input.m_charIndex == m_charIndex ) && ( a_input.m_longIndex == m_longIndex ) &&
192 ( a_input.m_size_tIndex == m_size_tIndex ) );
193 }
194
195 LUPI_HOST_DEVICE void incrementPlacement(std::size_t a_delta) {
196
197 std::size_t sub = a_delta % 8;
198 if (sub != 0) a_delta += (8-sub);
199 m_placement += a_delta;
200 }
201
202 LUPI_HOST_DEVICE void incrementSharedPlacement(std::size_t a_delta) {
203
204 std::size_t sub = a_delta % 8;
205 if (sub != 0) a_delta += (8-sub);
206 m_sharedPlacement += a_delta;
207 }
208
209 // Returns true if data buffer has not gone over any memory limits
211
212 if (m_placementStart == 0 && m_sharedPlacementStart == 0) return true;
213 if (m_placement > m_maxPlacementSize + m_placementStart) return false;
215 return true;
216 }
217
218#if defined(__CUDACC__) || defined (__HIP__)
219 #ifdef __CUDACC__
220 #define LUPI_GPU_MALLOC cudaMalloc
221 #define LUPI_GPU_MEMCPY cudaMemcpy
222 #define LUPI_GPU_HTOD cudaMemcpyHostToDevice
223 #else
224 #define LUPI_GPU_MALLOC hipMalloc
225 #define LUPI_GPU_MEMCPY hipMemcpy
226 #define LUPI_GPU_HTOD hipMemcpyHostToDevice
227 #endif
228 // Copy this host object to the device and return its pointer
229 LUPI_HOST DataBuffer *copyToDevice(std::size_t a_cpuSize, char *&a_protarePtr) {
230
231 DataBuffer *devicePtr = nullptr;
232 DataBuffer buf_tmp;
233
234 buf_tmp.copyIndexes(*this);
235 buf_tmp.m_maxPlacementSize = a_cpuSize;
236
237 gpuErrorCheck( LUPI_GPU_MALLOC( (void **) &buf_tmp.m_intData, sizeof(int) * m_intIndex) );
238 gpuErrorCheck( LUPI_GPU_MEMCPY( buf_tmp.m_intData, m_intData, sizeof(int) * m_intIndex, LUPI_GPU_HTOD ) );
239 gpuErrorCheck( LUPI_GPU_MALLOC( (void **) &buf_tmp.m_floatData, sizeof(float) * m_floatIndex ) );
240 gpuErrorCheck( LUPI_GPU_MEMCPY( buf_tmp.m_floatData, m_floatData, sizeof(float) * m_floatIndex, LUPI_GPU_HTOD ) );
241 gpuErrorCheck( LUPI_GPU_MALLOC( (void **) &buf_tmp.m_doubleData, sizeof(double) * m_doubleIndex ) );
242 gpuErrorCheck( LUPI_GPU_MEMCPY( buf_tmp.m_doubleData, m_doubleData, sizeof(double) * m_doubleIndex, LUPI_GPU_HTOD ) );
243 gpuErrorCheck( LUPI_GPU_MALLOC( (void **) &buf_tmp.m_charData, sizeof(char) * m_charIndex ) );
244 gpuErrorCheck( LUPI_GPU_MEMCPY( buf_tmp.m_charData, m_charData, sizeof(char) * m_charIndex, LUPI_GPU_HTOD ) );
245 gpuErrorCheck( LUPI_GPU_MALLOC( (void **) &buf_tmp.m_longData, sizeof(std::uint64_t) * m_longIndex ) );
246 gpuErrorCheck( LUPI_GPU_MEMCPY( buf_tmp.m_longData, m_longData, sizeof(std::uint64_t) * m_longIndex, LUPI_GPU_HTOD ) );
247 gpuErrorCheck( LUPI_GPU_MALLOC( (void **) &buf_tmp.m_size_tData, sizeof(std::size_t) * m_size_tIndex ) );
248 gpuErrorCheck( LUPI_GPU_MEMCPY( buf_tmp.m_size_tData, m_size_tData, sizeof(std::size_t) * m_size_tIndex, LUPI_GPU_HTOD ) );
249
250 gpuErrorCheck( LUPI_GPU_MALLOC( (void **) &buf_tmp.m_placementStart, buf_tmp.m_maxPlacementSize ) );
251 // Set to 0 for easier byte comparisons. This may be removed after testing is done
252 //gpuErrorCheck( cudaMemset( (void *) buf_tmp.m_placementStart, 0, buf_tmp.m_maxPlacementSize ) );
253 buf_tmp.m_placement = buf_tmp.m_placementStart;
254
255 a_protarePtr = buf_tmp.m_placementStart;
256
257 gpuErrorCheck( LUPI_GPU_MALLOC( (void **) &devicePtr, sizeof(DataBuffer) ) );
258 gpuErrorCheck( LUPI_GPU_MEMCPY( devicePtr, &buf_tmp, sizeof(DataBuffer), LUPI_GPU_HTOD ) );
259
260 // Don't need destructor trying to free the device memory.
261 buf_tmp.nullOutPointers( );
262
263 return devicePtr;
264 }
265 #undef LUPI_GPU_MALLOC
266 #undef LUPI_GPU_MEMCPY
267 #undef LUPI_GPU_HTOD
268#endif
269
270 private:
271 DataBuffer &operator=( DataBuffer const &tmp ); // disable assignment operator
272
273};
274
275} // End of namespace LUPI.
276
277#define DATA_MEMBER_SIMPLE(member, buffer, index, mode) \
278 {if ( mode == LUPI::DataBuffer::Mode::Count ) {(index)++; } \
279 else if ( mode == LUPI::DataBuffer::Mode::Pack ) {(buffer)[ (index)++ ] = (member); } \
280 else if ( mode == LUPI::DataBuffer::Mode::Unpack ) {member = (buffer)[ (index)++ ]; } \
281 else if ( mode == LUPI::DataBuffer::Mode::Reset ) {(index)++; member = 0; }}
282
283#define DATA_MEMBER_CAST(member, buf, mode, someType) \
284 {if ( mode == LUPI::DataBuffer::Mode::Count ) {((buf).m_intIndex)++; } \
285 else if ( mode == LUPI::DataBuffer::Mode::Pack ) {(buf).m_intData[ ((buf).m_intIndex)++ ] = (int)(member); } \
286 else if ( mode == LUPI::DataBuffer::Mode::Unpack ) {member = (someType) (buf).m_intData[ ((buf).m_intIndex)++ ]; } \
287 else if ( mode == LUPI::DataBuffer::Mode::Reset ) {((buf).m_intIndex)++; member = (someType) 0; }}
288
289#define DATA_MEMBER_CHAR( member, buf, mode) DATA_MEMBER_SIMPLE(member, (buf).m_charData, (buf).m_charIndex, mode)
290#define DATA_MEMBER_INT( member, buf, mode) DATA_MEMBER_SIMPLE(member, (buf).m_intData, (buf).m_intIndex, mode)
291#define DATA_MEMBER_FLOAT(member, buf, mode) DATA_MEMBER_SIMPLE(member, (buf).m_floatData, (buf).m_floatIndex, mode)
292#define DATA_MEMBER_DOUBLE(member, buf, mode) DATA_MEMBER_SIMPLE(member, (buf).m_doubleData, (buf).m_doubleIndex, mode)
293#define DATA_MEMBER_SIZE_T(member, buf, mode) DATA_MEMBER_SIMPLE(member, (buf).m_size_tData, (buf).m_size_tIndex, mode)
294
295#define DATA_MEMBER_STRING(member, buf, mode) \
296 {if ( mode == LUPI::DataBuffer::Mode::Count ) {((buf).m_charIndex) += member.size(); ((buf).m_size_tIndex)++; } \
297 else if ( mode == LUPI::DataBuffer::Mode::Pack ) {std::size_t array_size = member.size(); \
298 (buf).m_size_tData[((buf).m_size_tIndex)++] = array_size; \
299 for (std::size_t size_index = 0; size_index < array_size; size_index++)\
300 {(buf).m_charData[ ((buf).m_charIndex)++ ] = (member[size_index]); }} \
301 else if ( mode == LUPI::DataBuffer::Mode::Unpack ) {std::size_t array_size = (buf).m_size_tData[((buf).m_size_tIndex)++]; \
302 member.resize(array_size, &(buf).m_placement); \
303 for (std::size_t size_index = 0; size_index < array_size; size_index++) \
304 {member[size_index] = (buf).m_charData[ ((buf).m_charIndex)++ ]; }} \
305 else if ( mode == LUPI::DataBuffer::Mode::Reset ) {std::size_t array_size = member.size(); \
306 for (std::size_t size_index = 0; size_index < array_size; size_index++) \
307 {((buf).m_charIndex)++; member[size_index] = '\0'; }} \
308 else if ( mode == LUPI::DataBuffer::Mode::Memory ) { (buf).incrementPlacement(sizeof(char) * (member.size()+1)); } }
309
310#define DATA_MEMBER_STD_STRING(member, buf, mode) { \
311 if ( mode == LUPI::DataBuffer::Mode::Count ) \
312 {((buf).m_charIndex) += member.size(); ((buf).m_size_tIndex)++; } \
313 else if ( mode == LUPI::DataBuffer::Mode::Pack ) {std::size_t array_size = member.size(); \
314 (buf).m_size_tData[((buf).m_size_tIndex)++] = array_size; \
315 for (std::size_t size_index = 0; size_index < array_size; size_index++)\
316 {(buf).m_charData[((buf).m_charIndex)++] = (member[size_index]); }} \
317 else if ( mode == LUPI::DataBuffer::Mode::Unpack ) {std::size_t array_size = (std::size_t) (buf).m_size_tData[((buf).m_size_tIndex)++]; \
318 member.resize(array_size); \
319 for (std::size_t size_index = 0; size_index < array_size; size_index++) \
320 {member[size_index] = (buf).m_charData[ ((buf).m_charIndex)++ ]; }} }
321
322#if LUPI_WARP_SIZE > 1 && defined(LUPI_ON_GPU)
323#define DATA_MEMBER_VECTOR_FLOAT(member, buf, mode) \
324 { \
325 std::size_t vector_size = member.size(); \
326 DATA_MEMBER_SIZE_T(vector_size, (buf), mode); \
327 if ( mode == LUPI::DataBuffer::Mode::Unpack ) member.resize(vector_size, &(buf).m_placement); \
328 std::size_t bufferIndex = (buf).m_floatIndex; \
329 for ( std::size_t member_index = 0; member_index < vector_size; member_index += LUPI_WARP_SIZE, bufferIndex += LUPI_WARP_SIZE ) \
330 { \
331 std::size_t thrMemberId = member_index + LUPI_THREADID; \
332 if (thrMemberId >= vector_size) continue; \
333 member[thrMemberId] = (buf).m_floatData[bufferIndex + LUPI_THREADID]; \
334 } \
335 (buf).m_floatIndex += vector_size; \
336 }
337#define DATA_MEMBER_VECTOR_DOUBLE(member, buf, mode) \
338 { \
339 std::size_t vector_size = member.size(); \
340 DATA_MEMBER_SIZE_T(vector_size, (buf), mode); \
341 if ( mode == LUPI::DataBuffer::Mode::Unpack ) member.resize(vector_size, &(buf).m_placement); \
342 std::size_t bufferIndex = (buf).m_doubleIndex; \
343 for ( std::size_t member_index = 0; member_index < vector_size; member_index += LUPI_WARP_SIZE, bufferIndex += LUPI_WARP_SIZE ) \
344 { \
345 std::size_t thrMemberId = member_index + LUPI_THREADID; \
346 if (thrMemberId >= vector_size) continue; \
347 member[thrMemberId] = (buf).m_doubleData[bufferIndex + LUPI_THREADID]; \
348 } \
349 (buf).m_doubleIndex += vector_size; \
350 }
351#else
352#define DATA_MEMBER_VECTOR_FLOAT(member, buf, mode) \
353 { \
354 std::size_t vector_size = member.size(); \
355 DATA_MEMBER_SIZE_T(vector_size, (buf), mode); \
356 if ( mode == LUPI::DataBuffer::Mode::Unpack ) { \
357 if ((buf).m_sharedPlacement == nullptr) { \
358 member.resize(vector_size, &(buf).m_placement); \
359 } else { \
360 member.resize(vector_size, &(buf).m_sharedPlacement); \
361 } \
362 }\
363 if ( mode == LUPI::DataBuffer::Mode::Memory ) { \
364 (buf).incrementSharedPlacement(sizeof(float) * member.capacity()); \
365 } \
366 for ( std::size_t member_index = 0; member_index < vector_size; member_index++ ) \
367 { \
368 DATA_MEMBER_FLOAT(member[member_index], (buf), mode); \
369 } \
370 }
371#define DATA_MEMBER_VECTOR_DOUBLE(member, buf, mode) \
372 { \
373 std::size_t vector_size = member.size(); \
374 DATA_MEMBER_SIZE_T(vector_size, (buf), mode); \
375 if ( mode == LUPI::DataBuffer::Mode::Unpack ) { \
376 if ((buf).m_sharedPlacement == nullptr) { \
377 member.resize(vector_size, &(buf).m_placement); \
378 } else { \
379 member.resize(vector_size, &(buf).m_sharedPlacement); \
380 } \
381 }\
382 if ( mode == LUPI::DataBuffer::Mode::Memory ) { \
383 (buf).incrementSharedPlacement(sizeof(double) * member.capacity()); \
384 } \
385 for ( std::size_t member_index = 0; member_index < vector_size; member_index++ ) \
386 { \
387 DATA_MEMBER_DOUBLE(member[member_index], (buf), mode); \
388 } \
389 }
390#endif
391
392#if LUPI_WARP_SIZE > 1 && defined(LUPI_ON_GPU)
393#define DATA_MEMBER_VECTOR_INT(member, buf, mode) \
394 { \
395 std::size_t vector_size = member.size(); \
396 DATA_MEMBER_SIZE_T(vector_size, (buf), mode); \
397 if ( mode == LUPI::DataBuffer::Mode::Unpack ) member.resize(vector_size, &(buf).m_placement); \
398 std::size_t bufferIndex = (buf).m_intIndex; \
399 for ( std::size_t member_index = 0; member_index < vector_size; member_index += LUPI_WARP_SIZE, bufferIndex += LUPI_WARP_SIZE ) \
400 { \
401 std::size_t thrMemberId = member_index + LUPI_THREADID; \
402 if (thrMemberId >= vector_size) continue; \
403 member[thrMemberId] = (buf).m_intData[bufferIndex + LUPI_THREADID]; \
404 } \
405 (buf).m_intIndex += vector_size; \
406 }
407#else
408#define DATA_MEMBER_VECTOR_INT(member, buf, mode) \
409 { \
410 std::size_t vector_size = member.size(); \
411 DATA_MEMBER_SIZE_T(vector_size, (buf), mode); \
412 if ( mode == LUPI::DataBuffer::Mode::Unpack ) { \
413 if ((buf).m_sharedPlacement == nullptr) { \
414 member.resize(vector_size, &(buf).m_placement); \
415 } else { \
416 member.resize(vector_size, &(buf).m_sharedPlacement); \
417 } \
418 }\
419 if ( mode == LUPI::DataBuffer::Mode::Memory ) { \
420 (buf).incrementSharedPlacement(sizeof(int) * member.capacity()); \
421 } \
422 for ( std::size_t member_index = 0; member_index < vector_size; member_index++ ) \
423 { \
424 DATA_MEMBER_INT(member[member_index], (buf), mode); \
425 } \
426 }
427#endif
428
429#if LUPI_WARP_SIZE > 1 && defined(LUPI_ON_GPU)
430#define DATA_MEMBER_VECTOR_BOOL(member, buf, mode) \
431 { \
432 std::size_t vector_size = member.size(); \
433 DATA_MEMBER_SIZE_T(vector_size, (buf), mode); \
434 if ( mode == LUPI::DataBuffer::Mode::Unpack ) member.resize(vector_size, &(buf).m_placement); \
435 std::size_t bufferIndex = (buf).m_intIndex; \
436 for ( std::size_t member_index = 0; member_index < vector_size; member_index += LUPI_WARP_SIZE, bufferIndex += LUPI_WARP_SIZE ) \
437 { \
438 std::size_t thrMemberId = member_index + LUPI_THREADID; \
439 if (thrMemberId >= vector_size) continue; \
440 member[thrMemberId] = (buf).m_intData[bufferIndex + LUPI_THREADID]; \
441 } \
442 (buf).m_intIndex += vector_size; \
443 }
444#else
445#define DATA_MEMBER_VECTOR_BOOL(member, buf, mode) \
446 { \
447 std::size_t vector_size = member.size(); \
448 DATA_MEMBER_SIZE_T(vector_size, (buf), mode); \
449 if ( mode == LUPI::DataBuffer::Mode::Unpack ) { \
450 if ((buf).m_sharedPlacement == nullptr) { \
451 member.resize(vector_size, &(buf).m_placement); \
452 } else { \
453 member.resize(vector_size, &(buf).m_sharedPlacement); \
454 } \
455 }\
456 if ( mode == LUPI::DataBuffer::Mode::Memory ) { \
457 (buf).incrementSharedPlacement(sizeof(int) * member.capacity()); \
458 } \
459 for ( std::size_t member_index = 0; member_index < vector_size; member_index++ ) \
460 { \
461 DATA_MEMBER_CAST(member[member_index], (buf), mode, bool); \
462 } \
463 }
464#endif
465
466#if LUPI_WARP_SIZE > 1 && defined(LUPI_ON_GPU)
467#define DATA_MEMBER_CHAR_ARRAY( member, buf, mode ) { \
468 std::size_t array_size = sizeof( member ); \
469 std::size_t bufferIndex = (buf).m_charIndex; \
470 for ( std::size_t member_index = 0; member_index < array_size; member_index += LUPI_WARP_SIZE, bufferIndex += LUPI_WARP_SIZE ) { \
471 std::size_t thrMemberId = member_index + LUPI_THREADID; \
472 if( thrMemberId >= array_size ) continue; \
473 member[thrMemberId] = (buf).m_charData[bufferIndex + LUPI_THREADID]; \
474 } \
475 (buf).m_charIndex += array_size; \
476 }
477#else
478#define DATA_MEMBER_CHAR_ARRAY( member, buf, mode ) { \
479 std::size_t array_size = sizeof( member ); \
480 for ( std::size_t member_index = 0; member_index < array_size; member_index++ ) DATA_MEMBER_CHAR( member[member_index], (buf), mode ); \
481 }
482#endif
483
484#if LUPI_WARP_SIZE > 1 && defined(LUPI_ON_GPU)
485#define DATA_MEMBER_VECTOR_SIZE_T(member, buf, mode) \
486 { \
487 std::size_t vector_size = member.size(); \
488 DATA_MEMBER_SIZE_T(vector_size, (buf), mode); \
489 if ( mode == LUPI::DataBuffer::Mode::Unpack ) member.resize(vector_size, &(buf).m_placement); \
490 std::size_t bufferIndex = (buf).m_size_tIndex; \
491 for ( std::size_t member_index = 0; member_index < vector_size; member_index += LUPI_WARP_SIZE, bufferIndex += LUPI_WARP_SIZE ) \
492 { \
493 std::size_t thrMemberId = member_index + LUPI_THREADID; \
494 if (thrMemberId >= vector_size) continue; \
495 member[thrMemberId] = (buf).m_size_tData[bufferIndex + LUPI_THREADID]; \
496 } \
497 (buf).m_size_tIndex += vector_size; \
498 }
499#else
500#define DATA_MEMBER_VECTOR_SIZE_T(member, buf, mode) \
501 { \
502 std::size_t vector_size = member.size(); \
503 DATA_MEMBER_SIZE_T(vector_size, (buf), mode); \
504 if ( mode == LUPI::DataBuffer::Mode::Unpack ) { \
505 if ((buf).m_sharedPlacement == nullptr) { \
506 member.resize(vector_size, &(buf).m_placement); \
507 } else { \
508 member.resize(vector_size, &(buf).m_sharedPlacement); \
509 } \
510 }\
511 if ( mode == LUPI::DataBuffer::Mode::Memory ) { \
512 (buf).incrementSharedPlacement(sizeof(std::size_t) * member.capacity()); \
513 } \
514 for ( std::size_t member_index = 0; member_index < vector_size; member_index++ ) \
515 { \
516 DATA_MEMBER_SIZE_T(member[member_index], (buf), mode); \
517 } \
518 }
519#endif
520
521#endif // End of LUPI_data_buffer_hpp_included
G4PVDivision & operator=(const G4PVDivision &)=delete
#define LUPI_HOST_DEVICE
#define LUPI_HOST
#define gpuErrorCheck(ans)
#define LUPI_maybeUnused
LUPI_HOST_DEVICE void nullOutPointers(void)
std::size_t * m_size_tData
std::size_t m_sharedMaxPlacementSize
LUPI_HOST_DEVICE void copyIndexes(DataBuffer const &a_input)
LUPI_HOST_DEVICE void simpleCopy(DataBuffer const &a_input)
LUPI_HOST_DEVICE bool compareIndexes(LUPI_maybeUnused char const *a_file, LUPI_maybeUnused int a_line, DataBuffer const &a_input)
std::size_t m_longIndex
LUPI_HOST_DEVICE ~DataBuffer()
std::uint64_t * m_longData
std::size_t m_size_tIndex
LUPI_HOST_DEVICE bool validate()
LUPI_HOST_DEVICE void incrementSharedPlacement(std::size_t a_delta)
LUPI_HOST_DEVICE DataBuffer(DataBuffer const &rhs)
std::size_t m_maxPlacementSize
LUPI_HOST_DEVICE void incrementPlacement(std::size_t a_delta)
LUPI_HOST_DEVICE DataBuffer(void)
std::size_t m_doubleIndex
LUPI_HOST_DEVICE void freeMemory(void)
std::size_t m_floatIndex
std::size_t m_charIndex
LUPI_HOST_DEVICE void zeroIndexes(void)
LUPI_HOST_DEVICE void allocateBuffers(void)
Definition LUPI.hpp:40