Reference documentation for deal.II version GIT c415589cf0 2022-08-14 18:50:02+00:00
\(\newcommand{\dealvcentcolon}{\mathrel{\mathop{:}}}\) \(\newcommand{\dealcoloneq}{\dealvcentcolon\mathrel{\mkern-1.2mu}=}\) \(\newcommand{\jump}[1]{\left[\!\left[ #1 \right]\!\right]}\) \(\newcommand{\average}[1]{\left\{\!\left\{ #1 \right\}\!\right\}}\)
mpi_compute_index_owner_internal.h
Go to the documentation of this file.
1 // ---------------------------------------------------------------------
2 //
3 // Copyright (C) 2019 - 2022 by the deal.II authors
4 //
5 // This file is part of the deal.II library.
6 //
7 // The deal.II library is free software; you can use it, redistribute
8 // it, and/or modify it under the terms of the GNU Lesser General
9 // Public License as published by the Free Software Foundation; either
10 // version 2.1 of the License, or (at your option) any later version.
11 // The full text of the license can be found in the file LICENSE.md at
12 // the top level directory of deal.II.
13 //
14 // ---------------------------------------------------------------------
15 
16 #ifndef dealii_base_mpi_compute_index_owner_internal_h
17 #define dealii_base_mpi_compute_index_owner_internal_h
18 
19 #include <deal.II/base/config.h>
20 
21 #include <deal.II/base/mpi.h>
23 
25 
26 namespace Utilities
27 {
28  namespace MPI
29  {
30  namespace internal
31  {
36  namespace ComputeIndexOwner
37  {
39  {
40  public:
41  using index_type = unsigned int;
44 
45  FlexibleIndexStorage(const bool use_vector = true);
46 
47  void
48  reinit(const bool use_vector,
49  const bool index_range_contiguous,
50  const std::size_t size);
51 
52  void
53  fill(const std::size_t start,
54  const std::size_t end,
55  const index_type &value);
56 
57  index_type &
58  operator[](const std::size_t index);
59 
61  operator[](const std::size_t index) const;
62 
63  bool
64  entry_has_been_set(const std::size_t index) const;
65 
66  private:
67  bool use_vector;
68  std::size_t size;
69  std::vector<index_type> data;
70  std::map<std::size_t, index_type> data_map;
71  };
72 
82  std::vector<
83  std::pair<types::global_dof_index, types::global_dof_index>>,
84  std::vector<unsigned int>>
85  {
86  public:
91  const std::map<unsigned int,
92  std::vector<std::pair<types::global_dof_index,
94  & buffers,
96  const std::pair<types::global_dof_index, types::global_dof_index>
97  & local_range,
98  std::vector<unsigned int> &actually_owning_rank_list);
99 
104  virtual std::vector<unsigned int>
105  compute_targets() override;
106 
111  virtual void
112  create_request(const unsigned int other_rank,
113  std::vector<std::pair<types::global_dof_index,
115  &send_buffer) override;
116 
121  virtual void
123  const unsigned int other_rank,
124  const std::vector<std::pair<types::global_dof_index,
125  types::global_dof_index>> &buffer_recv,
126  std::vector<unsigned int> &request_buffer) override;
127 
128  private:
129  const std::map<unsigned int,
130  std::vector<std::pair<types::global_dof_index,
133 
135 
136  const std::pair<types::global_dof_index, types::global_dof_index>
138 
139  std::vector<unsigned int> &actually_owning_rank_list;
140  };
141 
142 
143 
149  struct Dictionary
150  {
172  static constexpr unsigned int range_minimum_grain_size = 64;
173 
180  static constexpr unsigned int sparsity_factor = 4;
181 
189 
194  std::vector<unsigned int> actually_owning_rank_list;
195 
203 
209  std::pair<types::global_dof_index, types::global_dof_index>
211 
218 
223 
229 
235  unsigned int stride_small_size;
236 
242  void
243  reinit(const IndexSet &owned_indices, const MPI_Comm &comm);
244 
250  unsigned int
252 
258  get_index_offset(const unsigned int rank);
259 
265  unsigned int
266  get_owning_rank_index(const unsigned int rank_in_owned_indices,
267  const unsigned int guess = 0);
268 
269  private:
274  void
275  partition(const IndexSet &owned_indices, const MPI_Comm &comm);
276  };
277 
278 
279 
288  std::vector<
289  std::pair<types::global_dof_index, types::global_dof_index>>,
290  std::vector<unsigned int>>
291  {
292  public:
298  const MPI_Comm &comm,
299  std::vector<unsigned int> &owning_ranks,
300  const bool track_index_requests = false);
301 
306 
312 
316  const MPI_Comm comm;
317 
321  const unsigned int my_rank;
322 
327  const unsigned int n_procs;
328 
335 
341  std::vector<unsigned int> &owning_ranks;
342 
352  std::vector<std::vector<
353  std::pair<unsigned int,
354  std::vector<std::pair<unsigned int, unsigned int>>>>>
356 
361 
366  std::map<unsigned int, std::vector<types::global_dof_index>>
368 
373  std::map<unsigned int, std::vector<unsigned int>> recv_indices;
374 
382  virtual void
384  const unsigned int other_rank,
385  const std::vector<std::pair<types::global_dof_index,
386  types::global_dof_index>> &buffer_recv,
387  std::vector<unsigned int> &request_buffer) override;
388 
393  virtual std::vector<unsigned int>
394  compute_targets() override;
395 
400  virtual void
401  create_request(const unsigned int other_rank,
402  std::vector<std::pair<types::global_dof_index,
404  &send_buffer) override;
405 
410  virtual void
411  read_answer(const unsigned int other_rank,
412  const std::vector<unsigned int> &recv_buffer) override;
413 
423  std::map<unsigned int, IndexSet>
424  get_requesters();
425 
426  private:
440  void
442  unsigned int & owner_index,
443  const unsigned int rank_of_request);
444  };
445 
446  /* ------------------------- inline functions ----------------------- */
447 
448  inline unsigned int
450  {
451  // note: this formula is also explicitly used in
452  // get_index_offset(), so keep the two in sync
453  return (i / dofs_per_process) * stride_small_size;
454  }
455 
456 
458  Dictionary::get_index_offset(const unsigned int rank)
459  {
460  return std::min(dofs_per_process *
461  static_cast<types::global_dof_index>(
462  (rank + stride_small_size - 1) /
464  size);
465  }
466 
467 
468 
469  inline unsigned int
471  const unsigned int rank_in_owned_indices,
472  const unsigned int guess)
473  {
475  if (actually_owning_rank_list[guess] == rank_in_owned_indices)
476  return guess;
477  else
478  {
481  rank_in_owned_indices);
483  Assert(*it == rank_in_owned_indices, ExcInternalError());
484  return it - actually_owning_rank_list.begin();
485  }
486  }
487 
488 
489  } // namespace ComputeIndexOwner
490  } // namespace internal
491  } // namespace MPI
492 } // namespace Utilities
493 
495 
496 #endif
virtual void read_answer(const unsigned int other_rank, const std::vector< unsigned int > &recv_buffer) override
std::vector< std::vector< std::pair< unsigned int, std::vector< std::pair< unsigned int, unsigned int > > > > > requesters
void append_index_origin(const types::global_dof_index index, unsigned int &owner_index, const unsigned int rank_of_request)
virtual void answer_request(const unsigned int other_rank, const std::vector< std::pair< types::global_dof_index, types::global_dof_index >> &buffer_recv, std::vector< unsigned int > &request_buffer) override
virtual void create_request(const unsigned int other_rank, std::vector< std::pair< types::global_dof_index, types::global_dof_index >> &send_buffer) override
std::map< unsigned int, std::vector< types::global_dof_index > > indices_to_look_up_by_dict_rank
ConsensusAlgorithmsPayload(const IndexSet &owned_indices, const IndexSet &indices_to_look_up, const MPI_Comm &comm, std::vector< unsigned int > &owning_ranks, const bool track_index_requests=false)
const std::map< unsigned int, std::vector< std::pair< types::global_dof_index, types::global_dof_index > > > & buffers
DictionaryPayLoad(const std::map< unsigned int, std::vector< std::pair< types::global_dof_index, types::global_dof_index >>> &buffers, FlexibleIndexStorage &actually_owning_ranks, const std::pair< types::global_dof_index, types::global_dof_index > &local_range, std::vector< unsigned int > &actually_owning_rank_list)
virtual void answer_request(const unsigned int other_rank, const std::vector< std::pair< types::global_dof_index, types::global_dof_index >> &buffer_recv, std::vector< unsigned int > &request_buffer) override
const std::pair< types::global_dof_index, types::global_dof_index > & local_range
virtual void create_request(const unsigned int other_rank, std::vector< std::pair< types::global_dof_index, types::global_dof_index >> &send_buffer) override
void reinit(const bool use_vector, const bool index_range_contiguous, const std::size_t size)
void fill(const std::size_t start, const std::size_t end, const index_type &value)
#define DEAL_II_NAMESPACE_OPEN
Definition: config.h:442
#define DEAL_II_NAMESPACE_CLOSE
Definition: config.h:443
static ::ExceptionBase & ExcInternalError()
#define Assert(cond, exc)
Definition: exceptions.h:1473
#define AssertIndexRange(index, range)
Definition: exceptions.h:1732
VectorType::value_type * end(VectorType &V)
Iterator lower_bound(Iterator first, Iterator last, const T &val)
Definition: utilities.h:1153
static const unsigned int invalid_unsigned_int
Definition: types.h:201
unsigned int global_dof_index
Definition: types.h:76
void reinit(const IndexSet &owned_indices, const MPI_Comm &comm)
unsigned int dof_to_dict_rank(const types::global_dof_index i)
types::global_dof_index get_index_offset(const unsigned int rank)
std::pair< types::global_dof_index, types::global_dof_index > local_range
void partition(const IndexSet &owned_indices, const MPI_Comm &comm)
unsigned int get_owning_rank_index(const unsigned int rank_in_owned_indices, const unsigned int guess=0)
const MPI_Comm & comm