XGCa
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
task_group.hpp
Go to the documentation of this file.
1 #ifndef TASK_GROUP_HPP
2 #define TASK_GROUP_HPP
3 #ifdef USE_MPI
4 #include "my_mpi.hpp"
5 #endif
6 
14 class TaskGroup{
15 #ifdef USE_MPI
16  MPI_Comm comm;
17 #endif
18  int my_rank;
19  int n_ranks;
20 
21  public:
22 
27 
28 #ifdef USE_MPI
29 
34  TaskGroup(MPI_Comm comm_in)
35  : comm(comm_in)
36  {
37  MPI_Comm_size( comm, &n_ranks );
38  MPI_Comm_rank( comm, &my_rank );
39  }
40 #endif
41 
47  int get_my_rank(){
48  return my_rank;
49  }
50 
57  int get_n_local_tasks(int n_tasks){
58  return ((n_tasks + n_ranks - my_rank - 1)/n_ranks);
59  }
60 
67  int get_max_n_local_tasks(int n_tasks){
68  return ((n_tasks + n_ranks - 1)/n_ranks);
69  }
70 
78  template<typename F>
79  void execute_task(int ntasks, F func){
80  for(int itask=0; itask<ntasks; itask++){
81  int assigned_rank = itask%n_ranks;
82  if(my_rank==assigned_rank){
83  int i_local_task = itask/n_ranks;
84  func(itask, i_local_task);
85  }
86  }
87  }
88 
89 #ifdef USE_MPI
90 
97  template<typename F>
98  void communicate(int ntasks, F func){
99  for(int itask=0; itask<ntasks; itask++){
100  int i_local_task = itask/n_ranks;
101  int assigned_rank = itask%n_ranks;
102  bool is_assigned_rank = (my_rank==assigned_rank);
103  func(itask, i_local_task, assigned_rank, is_assigned_rank, comm);
104  }
105  }
106 #endif
107 };
108 
109 #endif
int my_rank
The rank of the current process within the MPI communicator.
Definition: task_group.hpp:18
A class that manages the distribution and execution of tasks in parallel using the MPI library...
Definition: task_group.hpp:14
int get_max_n_local_tasks(int n_tasks)
Calculate the maximum number of tasks assigned to any process.
Definition: task_group.hpp:67
int n_ranks
The total number of processes within the MPI communicator.
Definition: task_group.hpp:19
TaskGroup()
Default constructor for the TaskGroup class.
Definition: task_group.hpp:26
void execute_task(int ntasks, F func)
Execute the given task function for each assigned task.
Definition: task_group.hpp:79
int get_n_local_tasks(int n_tasks)
Calculate the number of tasks assigned to the current process.
Definition: task_group.hpp:57
int get_my_rank()
Get the rank of the current process within the MPI communicator.
Definition: task_group.hpp:47