iterative-solver 0.0
DistrFlags.h
1#ifndef LINEARALGEBRA_SRC_MOLPRO_LINALG_ARRAY_UTIL_DISTRFLAGS_H
2#define LINEARALGEBRA_SRC_MOLPRO_LINALG_ARRAY_UTIL_DISTRFLAGS_H
3#include <memory>
4#include <mpi.h>
5
7
17protected:
18 class Proxy;
19 MPI_Comm m_comm = {};
20 MPI_Win m_win = MPI_WIN_NULL;
21 std::shared_ptr<int> m_counter =
22 nullptr;
23public:
24 DistrFlags() = default;
25 DistrFlags(const DistrFlags &source);
26 DistrFlags(DistrFlags &&source) noexcept;
27 DistrFlags &operator=(const DistrFlags &source);
28 DistrFlags &operator=(DistrFlags &&source) noexcept;
30
32 DistrFlags(MPI_Comm comm, int value = 0);
33
34 friend void swap(DistrFlags &x, DistrFlags &y);
35
37 bool empty() const;
38
41 Proxy access() const;
44 Proxy access(int rank) const;
45
46 MPI_Comm communicator() const { return m_comm; }
47
48protected:
56 class Proxy {
57 public:
69 Proxy(MPI_Comm comm, MPI_Win win, int rank, std::shared_ptr<int> counter);
70 ~Proxy();
72 int get() const;
73
75 int replace(int val);
76
78 int rank() const { return m_rank; }
79
80 protected:
81 MPI_Comm m_comm = {};
82 MPI_Win m_win = MPI_WIN_NULL;
83 int m_rank;
84 std::shared_ptr<int> m_counter;
85 };
86};
87} // namespace molpro::linalg::array::util
88
89#endif // LINEARALGEBRA_SRC_MOLPRO_LINALG_ARRAY_UTIL_DISTRFLAGS_H
Proxy for accessing the stored flags. The flag on a given rank is locked on construction and unlocked...
Definition: DistrFlags.h:56
MPI_Comm m_comm
mpi communicator
Definition: DistrFlags.h:81
Proxy(MPI_Comm comm, MPI_Win win, int rank, std::shared_ptr< int > counter)
Construct Proxy using contents of an active DistrFlags object.
Definition: DistrFlags.cpp:70
MPI_Win m_win
Definition: DistrFlags.h:82
std::shared_ptr< int > m_counter
counter of proxy objects created by overlying DistrFlags object.
Definition: DistrFlags.h:84
~Proxy()
Definition: DistrFlags.cpp:77
int rank() const
Which rank the proxy has access to.
Definition: DistrFlags.h:78
int m_rank
empty window handle
Definition: DistrFlags.h:83
int replace(int val)
replace value of flag
Definition: DistrFlags.cpp:90
int get() const
get value of the flag
Definition: DistrFlags.cpp:83
Distributed array of integer flags with one flag per process and a locking mechanism to ensure atomic...
Definition: DistrFlags.h:16
MPI_Win m_win
Definition: DistrFlags.h:20
Proxy access() const
Definition: DistrFlags.cpp:68
std::shared_ptr< int > m_counter
empty window handle
Definition: DistrFlags.h:21
friend void swap(DistrFlags &x, DistrFlags &y)
Definition: DistrFlags.cpp:53
MPI_Comm m_comm
mpi communicator
Definition: DistrFlags.h:19
bool empty() const
Whether distributed array was allocated.
Definition: DistrFlags.cpp:60
~DistrFlags()
Definition: DistrFlags.cpp:21
MPI_Comm communicator() const
Definition: DistrFlags.h:46
DistrFlags & operator=(const DistrFlags &source)
Definition: DistrFlags.cpp:36
Definition: ArrayHandler.h:23