10#ifndef LUPI_data_buffer_hpp_included
11#define LUPI_data_buffer_hpp_included 1
197 std::size_t sub = a_delta % 8;
198 if (sub != 0) a_delta += (8-sub);
204 std::size_t sub = a_delta % 8;
205 if (sub != 0) a_delta += (8-sub);
218#if defined(__CUDACC__) || defined (__HIP__)
220 #define LUPI_GPU_MALLOC cudaMalloc
221 #define LUPI_GPU_MEMCPY cudaMemcpy
222 #define LUPI_GPU_HTOD cudaMemcpyHostToDevice
224 #define LUPI_GPU_MALLOC hipMalloc
225 #define LUPI_GPU_MEMCPY hipMemcpy
226 #define LUPI_GPU_HTOD hipMemcpyHostToDevice
265 #undef LUPI_GPU_MALLOC
266 #undef LUPI_GPU_MEMCPY
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; }}
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; }}
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)
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)); } }
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)++ ]; }} }
322#if LUPI_WARP_SIZE > 1 && defined(LUPI_ON_GPU)
323#define DATA_MEMBER_VECTOR_FLOAT(member, buf, mode) \
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 ) \
331 std::size_t thrMemberId = member_index + LUPI_THREADID; \
332 if (thrMemberId >= vector_size) continue; \
333 member[thrMemberId] = (buf).m_floatData[bufferIndex + LUPI_THREADID]; \
335 (buf).m_floatIndex += vector_size; \
337#define DATA_MEMBER_VECTOR_DOUBLE(member, buf, mode) \
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 ) \
345 std::size_t thrMemberId = member_index + LUPI_THREADID; \
346 if (thrMemberId >= vector_size) continue; \
347 member[thrMemberId] = (buf).m_doubleData[bufferIndex + LUPI_THREADID]; \
349 (buf).m_doubleIndex += vector_size; \
352#define DATA_MEMBER_VECTOR_FLOAT(member, buf, mode) \
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); \
360 member.resize(vector_size, &(buf).m_sharedPlacement); \
363 if ( mode == LUPI::DataBuffer::Mode::Memory ) { \
364 (buf).incrementSharedPlacement(sizeof(float) * member.capacity()); \
366 for ( std::size_t member_index = 0; member_index < vector_size; member_index++ ) \
368 DATA_MEMBER_FLOAT(member[member_index], (buf), mode); \
371#define DATA_MEMBER_VECTOR_DOUBLE(member, buf, mode) \
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); \
379 member.resize(vector_size, &(buf).m_sharedPlacement); \
382 if ( mode == LUPI::DataBuffer::Mode::Memory ) { \
383 (buf).incrementSharedPlacement(sizeof(double) * member.capacity()); \
385 for ( std::size_t member_index = 0; member_index < vector_size; member_index++ ) \
387 DATA_MEMBER_DOUBLE(member[member_index], (buf), mode); \
392#if LUPI_WARP_SIZE > 1 && defined(LUPI_ON_GPU)
393#define DATA_MEMBER_VECTOR_INT(member, buf, mode) \
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 ) \
401 std::size_t thrMemberId = member_index + LUPI_THREADID; \
402 if (thrMemberId >= vector_size) continue; \
403 member[thrMemberId] = (buf).m_intData[bufferIndex + LUPI_THREADID]; \
405 (buf).m_intIndex += vector_size; \
408#define DATA_MEMBER_VECTOR_INT(member, buf, mode) \
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); \
416 member.resize(vector_size, &(buf).m_sharedPlacement); \
419 if ( mode == LUPI::DataBuffer::Mode::Memory ) { \
420 (buf).incrementSharedPlacement(sizeof(int) * member.capacity()); \
422 for ( std::size_t member_index = 0; member_index < vector_size; member_index++ ) \
424 DATA_MEMBER_INT(member[member_index], (buf), mode); \
429#if LUPI_WARP_SIZE > 1 && defined(LUPI_ON_GPU)
430#define DATA_MEMBER_VECTOR_BOOL(member, buf, mode) \
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 ) \
438 std::size_t thrMemberId = member_index + LUPI_THREADID; \
439 if (thrMemberId >= vector_size) continue; \
440 member[thrMemberId] = (buf).m_intData[bufferIndex + LUPI_THREADID]; \
442 (buf).m_intIndex += vector_size; \
445#define DATA_MEMBER_VECTOR_BOOL(member, buf, mode) \
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); \
453 member.resize(vector_size, &(buf).m_sharedPlacement); \
456 if ( mode == LUPI::DataBuffer::Mode::Memory ) { \
457 (buf).incrementSharedPlacement(sizeof(int) * member.capacity()); \
459 for ( std::size_t member_index = 0; member_index < vector_size; member_index++ ) \
461 DATA_MEMBER_CAST(member[member_index], (buf), mode, bool); \
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]; \
475 (buf).m_charIndex += array_size; \
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 ); \
484#if LUPI_WARP_SIZE > 1 && defined(LUPI_ON_GPU)
485#define DATA_MEMBER_VECTOR_SIZE_T(member, buf, mode) \
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 ) \
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]; \
497 (buf).m_size_tIndex += vector_size; \
500#define DATA_MEMBER_VECTOR_SIZE_T(member, buf, mode) \
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); \
508 member.resize(vector_size, &(buf).m_sharedPlacement); \
511 if ( mode == LUPI::DataBuffer::Mode::Memory ) { \
512 (buf).incrementSharedPlacement(sizeof(std::size_t) * member.capacity()); \
514 for ( std::size_t member_index = 0; member_index < vector_size; member_index++ ) \
516 DATA_MEMBER_SIZE_T(member[member_index], (buf), mode); \
G4PVDivision & operator=(const G4PVDivision &)=delete
#define gpuErrorCheck(ans)
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)
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
char * m_sharedPlacementStart
LUPI_HOST_DEVICE void freeMemory(void)
LUPI_HOST_DEVICE void zeroIndexes(void)
LUPI_HOST_DEVICE void allocateBuffers(void)