Skip to content
Snippets Groups Projects
Commit f547b5fa authored by Berenger Bramas's avatar Berenger Bramas
Browse files

Ensure that the pre-allocated buffers are enlarged when the size of rhs increase in particle output

parent 33103bb8
Branches
Tags
1 merge request!23WIP: Feature/use cmake
Pipeline #
...@@ -28,11 +28,13 @@ class abstract_particles_output { ...@@ -28,11 +28,13 @@ class abstract_particles_output {
std::unique_ptr<real_number[]> buffer_particles_positions_send; std::unique_ptr<real_number[]> buffer_particles_positions_send;
std::vector<std::unique_ptr<real_number[]>> buffer_particles_rhs_send; std::vector<std::unique_ptr<real_number[]>> buffer_particles_rhs_send;
partsize_t size_buffers_send; partsize_t size_buffers_send;
int buffers_size_particle_rhs_send;
std::unique_ptr<real_number[]> buffer_particles_positions_recv; std::unique_ptr<real_number[]> buffer_particles_positions_recv;
std::vector<std::unique_ptr<real_number[]>> buffer_particles_rhs_recv; std::vector<std::unique_ptr<real_number[]>> buffer_particles_rhs_recv;
std::unique_ptr<partsize_t[]> buffer_indexes_recv; std::unique_ptr<partsize_t[]> buffer_indexes_recv;
partsize_t size_buffers_recv; partsize_t size_buffers_recv;
int buffers_size_particle_rhs_recv;
int nb_processes_involved; int nb_processes_involved;
bool current_is_involved; bool current_is_involved;
...@@ -66,7 +68,9 @@ public: ...@@ -66,7 +68,9 @@ public:
: mpi_com(in_mpi_com), my_rank(-1), nb_processes(-1), : mpi_com(in_mpi_com), my_rank(-1), nb_processes(-1),
total_nb_particles(inTotalNbParticles), nb_rhs(in_nb_rhs), total_nb_particles(inTotalNbParticles), nb_rhs(in_nb_rhs),
buffer_particles_rhs_send(in_nb_rhs), size_buffers_send(-1), buffer_particles_rhs_send(in_nb_rhs), size_buffers_send(-1),
buffers_size_particle_rhs_send(-1),
buffer_particles_rhs_recv(in_nb_rhs), size_buffers_recv(-1), buffer_particles_rhs_recv(in_nb_rhs), size_buffers_recv(-1),
buffers_size_particle_rhs_recv(-1),
nb_processes_involved(0), current_is_involved(true), particles_chunk_per_process(0), nb_processes_involved(0), current_is_involved(true), particles_chunk_per_process(0),
particles_chunk_current_size(0), particles_chunk_current_offset(0) { particles_chunk_current_size(0), particles_chunk_current_offset(0) {
...@@ -143,6 +147,8 @@ public: ...@@ -143,6 +147,8 @@ public:
buffer_particles_rhs_send[idx_rhs].release(); buffer_particles_rhs_send[idx_rhs].release();
buffer_particles_rhs_recv[idx_rhs].release(); buffer_particles_rhs_recv[idx_rhs].release();
} }
buffers_size_particle_rhs_send = -1;
buffers_size_particle_rhs_recv = -1;
} }
template <int size_particle_rhs> template <int size_particle_rhs>
...@@ -159,12 +165,22 @@ public: ...@@ -159,12 +165,22 @@ public:
TIMEZONE("sort-to-distribute"); TIMEZONE("sort-to-distribute");
if(size_buffers_send < nb_particles && nb_particles){ if(size_buffers_send < nb_particles && nb_particles){
buffer_indexes_send.reset(new std::pair<partsize_t,partsize_t>[nb_particles]); size_buffers_send = nb_particles;
buffer_particles_positions_send.reset(new real_number[nb_particles*size_particle_positions]); buffer_indexes_send.reset(new std::pair<partsize_t,partsize_t>[size_buffers_send]);
buffer_particles_positions_send.reset(new real_number[size_buffers_send*size_particle_positions]);
if(buffers_size_particle_rhs_send < size_particle_rhs){
buffers_size_particle_rhs_send = size_particle_rhs;
}
for(int idx_rhs = 0 ; idx_rhs < nb_rhs ; ++idx_rhs){ for(int idx_rhs = 0 ; idx_rhs < nb_rhs ; ++idx_rhs){
buffer_particles_rhs_send[idx_rhs].reset(new real_number[nb_particles*size_particle_rhs]); buffer_particles_rhs_send[idx_rhs].reset(new real_number[size_buffers_send*buffers_size_particle_rhs_send]);
}
}
else if(buffers_size_particle_rhs_send < size_particle_rhs){
buffers_size_particle_rhs_send = size_particle_rhs;
for(int idx_rhs = 0 ; idx_rhs < nb_rhs ; ++idx_rhs){
buffer_particles_rhs_send[idx_rhs].reset(new real_number[size_buffers_send*buffers_size_particle_rhs_send]);
} }
size_buffers_send = nb_particles;
} }
for(partsize_t idx_part = 0 ; idx_part < nb_particles ; ++idx_part){ for(partsize_t idx_part = 0 ; idx_part < nb_particles ; ++idx_part){
...@@ -210,12 +226,22 @@ public: ...@@ -210,12 +226,22 @@ public:
assert(nb_to_receive == particles_chunk_current_size); assert(nb_to_receive == particles_chunk_current_size);
if(size_buffers_recv < nb_to_receive && nb_to_receive){ if(size_buffers_recv < nb_to_receive && nb_to_receive){
buffer_indexes_recv.reset(new partsize_t[nb_to_receive]); size_buffers_recv = nb_to_receive;
buffer_particles_positions_recv.reset(new real_number[nb_to_receive*size_particle_positions]); buffer_indexes_recv.reset(new partsize_t[size_buffers_recv]);
buffer_particles_positions_recv.reset(new real_number[size_buffers_recv*size_particle_positions]);
if(buffers_size_particle_rhs_recv < size_particle_rhs){
buffers_size_particle_rhs_recv = size_particle_rhs;
}
for(int idx_rhs = 0 ; idx_rhs < nb_rhs ; ++idx_rhs){ for(int idx_rhs = 0 ; idx_rhs < nb_rhs ; ++idx_rhs){
buffer_particles_rhs_recv[idx_rhs].reset(new real_number[nb_to_receive*size_particle_rhs]); buffer_particles_rhs_recv[idx_rhs].reset(new real_number[size_buffers_recv*buffers_size_particle_rhs_recv]);
}
}
else if(buffers_size_particle_rhs_recv < size_particle_rhs){
buffers_size_particle_rhs_recv = size_particle_rhs;
for(int idx_rhs = 0 ; idx_rhs < nb_rhs ; ++idx_rhs){
buffer_particles_rhs_recv[idx_rhs].reset(new real_number[size_buffers_recv*buffers_size_particle_rhs_recv]);
} }
size_buffers_recv = nb_to_receive;
} }
{ {
...@@ -235,12 +261,12 @@ public: ...@@ -235,12 +261,12 @@ public:
} }
if(size_buffers_send < nb_to_receive && nb_to_receive){ if(size_buffers_send < nb_to_receive && nb_to_receive){
buffer_indexes_send.reset(new std::pair<partsize_t,partsize_t>[nb_to_receive]); size_buffers_send = nb_to_receive;
buffer_particles_positions_send.reset(new real_number[nb_to_receive*size_particle_positions]); buffer_indexes_send.reset(new std::pair<partsize_t,partsize_t>[size_buffers_send]);
buffer_particles_positions_send.reset(new real_number[size_buffers_send*size_particle_positions]);
for(int idx_rhs = 0 ; idx_rhs < nb_rhs ; ++idx_rhs){ for(int idx_rhs = 0 ; idx_rhs < nb_rhs ; ++idx_rhs){
buffer_particles_rhs_send[idx_rhs].reset(new real_number[nb_to_receive*size_particle_rhs]); buffer_particles_rhs_send[idx_rhs].reset(new real_number[size_buffers_send*buffers_size_particle_rhs_send]);
} }
size_buffers_send = nb_to_receive;
} }
{ {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment