Reference documentation for deal.II version 9.1.0-pre
task_info.h
1 // ---------------------------------------------------------------------
2 //
3 // Copyright (C) 2011 - 2018 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 
17 #ifndef dealii_matrix_free_task_info_h
18 #define dealii_matrix_free_task_info_h
19 
20 
21 #include <deal.II/base/exceptions.h>
22 #include <deal.II/base/index_set.h>
23 #include <deal.II/base/memory_consumption.h>
24 #include <deal.II/base/tensor.h>
25 #include <deal.II/base/thread_management.h>
26 #include <deal.II/base/utilities.h>
27 #include <deal.II/base/vectorization.h>
28 
29 #include <deal.II/lac/dynamic_sparsity_pattern.h>
30 
31 
32 DEAL_II_NAMESPACE_OPEN
33 
34 
35 
36 namespace internal
37 {
45  {
46  public:
47  virtual ~MFWorkerInterface()
48  {}
49 
51  virtual void
53 
55  virtual void
57 
59  virtual void
61 
63  virtual void
65 
68  virtual void
69  zero_dst_vector_range(const unsigned int range_index) = 0;
70 
73  virtual void
74  cell(const std::pair<unsigned int, unsigned int> &cell_range) = 0;
75 
78  virtual void
79  face(const std::pair<unsigned int, unsigned int> &face_range) = 0;
80 
83  virtual void
84  boundary(const std::pair<unsigned int, unsigned int> &face_range) = 0;
85  };
86 
87 
88 
89  namespace MatrixFreeFunctions
90  {
91  // forward declaration of internal data structure
92  template <typename Number>
93  struct ConstraintValues;
94 
102  struct TaskInfo
103  {
104  // enum for choice of how to build the task graph. Odd add versions with
105  // preblocking and even versions with postblocking. partition_partition
106  // and partition_color are deprecated but kept for backward
107  // compatibility.
108  enum TasksParallelScheme
109  {
110  none,
111  partition_partition,
112  partition_color,
113  color
114  };
115 
119  TaskInfo();
120 
125  void
126  clear();
127 
131  void
132  loop(MFWorkerInterface &worker) const;
133 
138  void
139  collect_boundary_cells(const unsigned int n_active_cells,
140  const unsigned int n_active_and_ghost_cells,
141  const unsigned int vectorization_length,
142  std::vector<unsigned int> &boundary_cells);
143 
180  void
181  create_blocks_serial(
182  const std::vector<unsigned int> &boundary_cells,
183  const std::vector<unsigned int> &cells_close_to_boundary,
184  const unsigned int dofs_per_cell,
185  const std::vector<unsigned int> &cell_vectorization_categories,
186  const bool cell_vectorization_categories_strict,
187  std::vector<unsigned int> & renumbering,
188  std::vector<unsigned char> & incompletely_filled_vectorization);
189 
207  void
208  initial_setup_blocks_tasks(
209  const std::vector<unsigned int> &boundary_cells,
210  std::vector<unsigned int> & renumbering,
211  std::vector<unsigned char> & incompletely_filled_vectorization);
212 
219  void
220  guess_block_size(const unsigned int dofs_per_cell);
221 
253  void
254  make_thread_graph_partition_color(
255  DynamicSparsityPattern & connectivity,
256  std::vector<unsigned int> & renumbering,
257  std::vector<unsigned char> &irregular_cells,
258  const bool hp_bool);
259 
292  void
293  make_thread_graph_partition_partition(
294  const std::vector<unsigned int> &cell_active_fe_index,
295  DynamicSparsityPattern & connectivity,
296  std::vector<unsigned int> & renumbering,
297  std::vector<unsigned char> & irregular_cells,
298  const bool hp_bool);
299 
323  void
324  make_thread_graph(const std::vector<unsigned int> &cell_active_fe_index,
325  DynamicSparsityPattern & connectivity,
326  std::vector<unsigned int> & renumbering,
327  std::vector<unsigned char> & irregular_cells,
328  const bool hp_bool);
329 
334  void
335  make_connectivity_cells_to_blocks(
336  const std::vector<unsigned char> &irregular_cells,
337  const DynamicSparsityPattern & connectivity_cells,
338  DynamicSparsityPattern & connectivity_blocks) const;
339 
344  void
345  make_coloring_within_partitions_pre_blocked(
346  const DynamicSparsityPattern & connectivity,
347  const unsigned int partition,
348  const std::vector<unsigned int> &cell_partition,
349  const std::vector<unsigned int> &partition_list,
350  const std::vector<unsigned int> &partition_size,
351  std::vector<unsigned int> & partition_color_list);
352 
357  void
358  make_partitioning_within_partitions_post_blocked(
359  const DynamicSparsityPattern & connectivity,
360  const std::vector<unsigned int> &cell_active_fe_index,
361  const unsigned int partition,
362  const unsigned int cluster_size,
363  const bool hp_bool,
364  const std::vector<unsigned int> &cell_partition,
365  const std::vector<unsigned int> &partition_list,
366  const std::vector<unsigned int> &partition_size,
367  std::vector<unsigned int> & partition_partition_list,
368  std::vector<unsigned char> & irregular_cells);
369 
390  void
391  make_partitioning(const DynamicSparsityPattern &connectivity,
392  const unsigned int cluster_size,
393  std::vector<unsigned int> & cell_partition,
394  std::vector<unsigned int> & partition_list,
395  std::vector<unsigned int> & partition_size,
396  unsigned int & partition) const;
397 
402  void
403  update_task_info(const unsigned int partition);
404 
408  void
409  create_flow_graph();
410 
414  std::size_t
415  memory_consumption() const;
416 
421  template <typename StreamType>
422  void
423  print_memory_statistics(StreamType &out, std::size_t data_length) const;
424 
429  unsigned int n_active_cells;
430 
435  unsigned int n_ghost_cells;
436 
440  unsigned int vectorization_length;
441 
445  unsigned int block_size;
446 
450  unsigned int n_blocks;
451 
455  TasksParallelScheme scheme;
456 
463  std::vector<unsigned int> partition_row_index;
464 
471  std::vector<unsigned int> cell_partition_data;
472 
480  std::vector<unsigned int> face_partition_data;
481 
489  std::vector<unsigned int> boundary_partition_data;
490 
499  std::vector<unsigned int> ghost_face_partition_data;
500 
510  std::vector<unsigned int> refinement_edge_face_partition_data;
511 
516  std::vector<unsigned int> partition_evens;
517 
522  std::vector<unsigned int> partition_odds;
523 
528  std::vector<unsigned int> partition_n_blocked_workers;
529 
534  std::vector<unsigned int> partition_n_workers;
535 
540  unsigned int evens;
541 
546  unsigned int odds;
547 
552  unsigned int n_blocked_workers;
553 
557  unsigned int n_workers;
558 
563  std::vector<unsigned char> task_at_mpi_boundary;
564 
568  MPI_Comm communicator;
569 
573  unsigned int my_pid;
574 
578  unsigned int n_procs;
579  };
580 
584  using SizeInfo DEAL_II_DEPRECATED = TaskInfo;
585 
586  } // end of namespace MatrixFreeFunctions
587 } // end of namespace internal
588 
589 DEAL_II_NAMESPACE_CLOSE
590 
591 #endif
std::vector< unsigned int > ghost_face_partition_data
Definition: task_info.h:499
void loop(ITERATOR begin, typename identity< ITERATOR >::type end, DOFINFO &dinfo, INFOBOX &info, const std::function< void(DOFINFO &, typename INFOBOX::CellInfo &)> &cell_worker, const std::function< void(DOFINFO &, typename INFOBOX::CellInfo &)> &boundary_worker, const std::function< void(DOFINFO &, DOFINFO &, typename INFOBOX::CellInfo &, typename INFOBOX::CellInfo &)> &face_worker, ASSEMBLER &assembler, const LoopControl &lctrl=LoopControl())
Definition: loop.h:443
virtual void cell(const std::pair< unsigned int, unsigned int > &cell_range)=0
std::vector< unsigned int > partition_row_index
Definition: task_info.h:463
std::vector< unsigned int > partition_n_workers
Definition: task_info.h:534
virtual void vector_update_ghosts_finish()=0
Finishes the communication for the update ghost values operation.
std::vector< unsigned int > cell_partition_data
Definition: task_info.h:471
std::vector< unsigned int > partition_n_blocked_workers
Definition: task_info.h:528
std::vector< unsigned int > refinement_edge_face_partition_data
Definition: task_info.h:510
std::vector< unsigned int > boundary_partition_data
Definition: task_info.h:489
virtual void zero_dst_vector_range(const unsigned int range_index)=0
virtual void boundary(const std::pair< unsigned int, unsigned int > &face_range)=0
std::vector< unsigned char > task_at_mpi_boundary
Definition: task_info.h:563
virtual void vector_update_ghosts_start()=0
Starts the communication for the update ghost values operation.
virtual void face(const std::pair< unsigned int, unsigned int > &face_range)=0
std::vector< unsigned int > face_partition_data
Definition: task_info.h:480
virtual void vector_compress_start()=0
Starts the communication for the vector compress operation.
std::vector< unsigned int > partition_odds
Definition: task_info.h:522
std::vector< unsigned int > partition_evens
Definition: task_info.h:516
virtual void vector_compress_finish()=0
Finishes the communication for the vector compress operation.