Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
96078433a83a65741eb55be98d391b5ab257fa0a
[simgrid.git] / src / smpi / include / smpi_group.hpp
1 /* Copyright (c) 2010-2019. The SimGrid Team.
2  * All rights reserved.                                                     */
3
4 /* This program is free software; you can redistribute it and/or modify it
5  * under the terms of the license (GNU LGPL) which comes with this package. */
6
7 #ifndef SMPI_GROUP_HPP_INCLUDED
8 #define SMPI_GROUP_HPP_INCLUDED
9
10 #include "smpi_f2c.hpp"
11 #include <smpi/smpi.h>
12 #include <map>
13 #include <vector>
14
15 namespace simgrid{
16 namespace smpi{
17
18 class Group : public F2C{
19   int size_ = 0;
20   /* This is actually a map from int to int. We could use std::map here, but looking up a value there costs O(log(n)).
21    * For a vector, this costs O(1). We hence go with the vector.
22    */
23   std::vector<s4u::Actor*> rank_to_actor_map_;
24   std::map<s4u::Actor*, int> actor_to_rank_map_;
25   std::vector<int> index_to_rank_map_;
26
27   int refcount_ = 1; /* refcount_: start > 0 so that this group never gets freed */
28 public:
29   Group() = default;
30   explicit Group(int size) : size_(size), rank_to_actor_map_(size, nullptr), index_to_rank_map_(size, MPI_UNDEFINED) {}
31   explicit Group(Group* origin);
32
33   void set_mapping(s4u::ActorPtr actor, int rank);
34   int rank(int index);
35   s4u::ActorPtr actor(int rank);
36   int rank(s4u::ActorPtr process);
37   void ref();
38   static void unref(MPI_Group group);
39   int size() { return size_; }
40   int compare(MPI_Group group2);
41   int incl(int n, const int* ranks, MPI_Group* newgroup);
42   int excl(int n, const int* ranks, MPI_Group* newgroup);
43   int group_union(MPI_Group group2, MPI_Group* newgroup);
44   int intersection(MPI_Group group2, MPI_Group* newgroup);
45   int difference(MPI_Group group2, MPI_Group* newgroup);
46   int range_incl(int n, int ranges[][3], MPI_Group* newgroup);
47   int range_excl(int n, int ranges[][3], MPI_Group* newgroup);
48
49   static Group* f2c(int id);
50 };
51 }
52 }
53
54 #endif