Hipace
Classes | Public Member Functions | Private Types | Private Member Functions | Private Attributes | Static Private Attributes | List of all members
MultiBuffer Class Reference

#include <MultiBuffer.H>

Classes

struct  DataNode
 

Public Member Functions

void initialize (int nslices, int nbeams, bool buffer_on_host, bool use_laser, amrex::Box laser_box, int max_leading_slices, int max_trailing_slices)
 
void get_data (int slice, MultiBeam &beams, MultiLaser &laser, int beam_slice)
 
void put_data (int slice, MultiBeam &beams, MultiLaser &laser, int beam_slice, bool is_last_time_step)
 
amrex::Real get_time ()
 
void put_time (amrex::Real time)
 
 ~MultiBuffer ()
 
void unpack_data (int slice, MultiBeam &beams, MultiLaser &laser, int beam_slice)
 

Private Types

enum class  memory_location { nowhere , pinned , device }
 
enum  comm_progress : int {
  uninitialized , sim_completed , async_progress_begin , ready_to_send ,
  send_started , sent , receive_started , received ,
  async_progress_end , ready_to_define , in_use , nprogress
}
 
enum class  offset_type {
  beam_idcpu , beam_real , beam_int , laser ,
  total
}
 
using storage_type = amrex::ParallelDescriptor::lull_t
 

Private Member Functions

std::size_t get_metadata_size ()
 
std::size_t * get_metadata_location (int slice)
 
void allocate_buffer (int slice)
 
void free_buffer (int slice)
 
void make_progress (int slice, bool is_blocking, int current_slice)
 
void write_metadata (int slice, MultiBeam &beams, int beam_slice)
 
std::size_t get_buffer_offset (int slice, offset_type type, MultiBeam &beams, int ibeam, int comp)
 
void memcpy_to_buffer (int slice, std::size_t buffer_offset, const void *src_ptr, std::size_t num_bytes)
 
void memcpy_from_buffer (int slice, std::size_t buffer_offset, void *dst_ptr, std::size_t num_bytes)
 
void pack_data (int slice, MultiBeam &beams, MultiLaser &laser, int beam_slice)
 

Private Attributes

amrex::Gpu::PinnedVector< std::size_t > m_metadata {}
 
amrex::Vector< DataNodem_datanodes {}
 
bool m_is_head_rank = false
 
bool m_is_serial = true
 
int m_rank_send_to = 0
 
int m_rank_receive_from = 0
 
int m_tag_time_start = 0
 
int m_tag_buffer_start = 0
 
int m_tag_metadata_start = 0
 
MPI_Comm m_comm = MPI_COMM_NULL
 
bool m_buffer_on_host = true
 
int m_nslices = 0
 
int m_nbeams = 0
 
bool m_use_laser = false
 
int m_laser_ncomp = 4
 
amrex::Box m_laser_slice_box {}
 
int m_max_leading_slices = std::numeric_limits<int>::max()
 
int m_max_trailing_slices = std::numeric_limits<int>::max()
 
amrex::Real m_time_send_buffer = 0.
 
MPI_Request m_time_send_request = MPI_REQUEST_NULL
 
bool m_time_send_started = false
 
std::array< int, comm_progress::nprogress > m_async_metadata_slice {}
 
std::array< int, comm_progress::nprogress > m_async_data_slice {}
 

Static Private Attributes

static constexpr std::size_t buffer_size_roundup = alignof(amrex::Real) / alignof(int)
 

Member Typedef Documentation

◆ storage_type

using MultiBuffer::storage_type = amrex::ParallelDescriptor::lull_t
private

Member Enumeration Documentation

◆ comm_progress

Enumerator
uninitialized 
sim_completed 
async_progress_begin 
ready_to_send 
send_started 
sent 
receive_started 
received 
async_progress_end 
ready_to_define 
in_use 
nprogress 

◆ memory_location

enum MultiBuffer::memory_location
strongprivate
Enumerator
nowhere 
pinned 
device 

◆ offset_type

enum MultiBuffer::offset_type
strongprivate
Enumerator
beam_idcpu 
beam_real 
beam_int 
laser 
total 

Constructor & Destructor Documentation

◆ ~MultiBuffer()

MultiBuffer::~MultiBuffer ( )

Member Function Documentation

◆ allocate_buffer()

void MultiBuffer::allocate_buffer ( int  slice)
private

◆ free_buffer()

void MultiBuffer::free_buffer ( int  slice)
private

◆ get_buffer_offset()

std::size_t MultiBuffer::get_buffer_offset ( int  slice,
offset_type  type,
MultiBeam beams,
int  ibeam,
int  comp 
)
private

◆ get_data()

void MultiBuffer::get_data ( int  slice,
MultiBeam beams,
MultiLaser laser,
int  beam_slice 
)

◆ get_metadata_location()

std::size_t * MultiBuffer::get_metadata_location ( int  slice)
private

◆ get_metadata_size()

std::size_t MultiBuffer::get_metadata_size ( )
private

◆ get_time()

amrex::Real MultiBuffer::get_time ( )

◆ initialize()

void MultiBuffer::initialize ( int  nslices,
int  nbeams,
bool  buffer_on_host,
bool  use_laser,
amrex::Box  laser_box,
int  max_leading_slices,
int  max_trailing_slices 
)

◆ make_progress()

void MultiBuffer::make_progress ( int  slice,
bool  is_blocking,
int  current_slice 
)
private

◆ memcpy_from_buffer()

void MultiBuffer::memcpy_from_buffer ( int  slice,
std::size_t  buffer_offset,
void *  dst_ptr,
std::size_t  num_bytes 
)
private

◆ memcpy_to_buffer()

void MultiBuffer::memcpy_to_buffer ( int  slice,
std::size_t  buffer_offset,
const void *  src_ptr,
std::size_t  num_bytes 
)
private

◆ pack_data()

void MultiBuffer::pack_data ( int  slice,
MultiBeam beams,
MultiLaser laser,
int  beam_slice 
)
private

◆ put_data()

void MultiBuffer::put_data ( int  slice,
MultiBeam beams,
MultiLaser laser,
int  beam_slice,
bool  is_last_time_step 
)

◆ put_time()

void MultiBuffer::put_time ( amrex::Real  time)

◆ unpack_data()

void MultiBuffer::unpack_data ( int  slice,
MultiBeam beams,
MultiLaser laser,
int  beam_slice 
)

◆ write_metadata()

void MultiBuffer::write_metadata ( int  slice,
MultiBeam beams,
int  beam_slice 
)
private

Member Data Documentation

◆ buffer_size_roundup

constexpr std::size_t MultiBuffer::buffer_size_roundup = alignof(amrex::Real) / alignof(int)
staticconstexprprivate

◆ m_async_data_slice

std::array<int, comm_progress::nprogress> MultiBuffer::m_async_data_slice {}
private

◆ m_async_metadata_slice

std::array<int, comm_progress::nprogress> MultiBuffer::m_async_metadata_slice {}
private

◆ m_buffer_on_host

bool MultiBuffer::m_buffer_on_host = true
private

◆ m_comm

MPI_Comm MultiBuffer::m_comm = MPI_COMM_NULL
private

◆ m_datanodes

amrex::Vector<DataNode> MultiBuffer::m_datanodes {}
private

◆ m_is_head_rank

bool MultiBuffer::m_is_head_rank = false
private

◆ m_is_serial

bool MultiBuffer::m_is_serial = true
private

◆ m_laser_ncomp

int MultiBuffer::m_laser_ncomp = 4
private

◆ m_laser_slice_box

amrex::Box MultiBuffer::m_laser_slice_box {}
private

◆ m_max_leading_slices

int MultiBuffer::m_max_leading_slices = std::numeric_limits<int>::max()
private

◆ m_max_trailing_slices

int MultiBuffer::m_max_trailing_slices = std::numeric_limits<int>::max()
private

◆ m_metadata

amrex::Gpu::PinnedVector<std::size_t> MultiBuffer::m_metadata {}
private

◆ m_nbeams

int MultiBuffer::m_nbeams = 0
private

◆ m_nslices

int MultiBuffer::m_nslices = 0
private

◆ m_rank_receive_from

int MultiBuffer::m_rank_receive_from = 0
private

◆ m_rank_send_to

int MultiBuffer::m_rank_send_to = 0
private

◆ m_tag_buffer_start

int MultiBuffer::m_tag_buffer_start = 0
private

◆ m_tag_metadata_start

int MultiBuffer::m_tag_metadata_start = 0
private

◆ m_tag_time_start

int MultiBuffer::m_tag_time_start = 0
private

◆ m_time_send_buffer

amrex::Real MultiBuffer::m_time_send_buffer = 0.
private

◆ m_time_send_request

MPI_Request MultiBuffer::m_time_send_request = MPI_REQUEST_NULL
private

◆ m_time_send_started

bool MultiBuffer::m_time_send_started = false
private

◆ m_use_laser

bool MultiBuffer::m_use_laser = false
private

The documentation for this class was generated from the following files: