55 int elements_per_band,
56 int band_granularity = 1) {
58 partition.
counts.assign(number_of_ranks, 0);
60 int granularity = std::max(band_granularity, 1);
66 int number_of_units = (number_of_bands + granularity - 1) / granularity;
67 int base_units = number_of_units / number_of_ranks;
68 int remainder_units = number_of_units % number_of_ranks;
70 for (
int rank = 0; rank < number_of_ranks; rank++) {
71 int units_for_rank = base_units + (rank < remainder_units ? 1 : 0);
73 std::min(units_for_rank * granularity, std::max(number_of_bands - first_band, 0));
74 partition.
displacements[rank] = first_band * elements_per_band;
75 partition.
counts[rank] = bands_for_rank * elements_per_band;
76 if (rank == rank_index) {
80 first_band += bands_for_rank;
202 int total_count)
const = 0;
267 const int* )
const {}
virtual void broadcast_from_group_root(Real *, int) const
virtual void broadcast_across_bands(int *, int) const
Integer overload, for the counts that decide collective sizes.
virtual ComplexValue dot_product(int number_of_elements, const ComplexValue *vector_x, const ComplexValue *vector_y) const =0
virtual int band_distribution_rank_index() const
virtual int group_size() const =0
virtual void allgather_within_group(const Real *local_data, int local_count, Real *full_data, int total_count) const =0
virtual void add_scaled_vector(int number_of_elements, ComplexValue scaling_factor, const ComplexValue *vector_x, ComplexValue *vector_y) const =0
virtual void broadcast_across_bands(Real *, int) const
Real overload, for eigenvalues – the numbers convergence decisions are made from.
virtual ~ExecutionPolicy()=default
virtual void allgather_across_bands(ComplexValue *, const int *, const int *) const
virtual void broadcast_from_group_root(ComplexValue *, int) const
virtual void reduce_group_distributed_result(ComplexValue *, int) const
virtual int number_of_processes() const =0
virtual int group_rank_index() const =0
virtual int global_number_of_elements(int local_number_of_elements) const =0
virtual void broadcast_across_bands(ComplexValue *, int) const
virtual void reduce_within_group(Real *data, int number_of_elements) const =0
virtual int band_distribution_size() const
virtual bool is_root() const =0
virtual Real norm(int number_of_elements, const ComplexValue *vector_x) const =0
virtual void reduce_across_bands(Real *, int) const
virtual void reduce_within_group(ComplexValue *data, int number_of_elements) const =0
BandPartition partition_bands(int number_of_bands, int number_of_ranks, int rank_index, int elements_per_band, int band_granularity=1)
std::complex< double > Complex
std::vector< int > counts
int local_number_of_bands
std::vector< int > displacements