comm
Loading...
Searching...
No Matches
class_handle.h
1/*
2//@HEADER
3// *****************************************************************************
4//
5// class_handle.h
6// DARMA/comm => Communicator
7//
8// Copyright 2019-2024 National Technology & Engineering Solutions of Sandia, LLC
9// (NTESS). Under the terms of Contract DE-NA0003525 with NTESS, the U.S.
10// Government retains certain rights in this software.
11//
12// Redistribution and use in source and binary forms, with or without
13// modification, are permitted provided that the following conditions are met:
14//
15// * Redistributions of source code must retain the above copyright notice,
16// this list of conditions and the following disclaimer.
17//
18// * Redistributions in binary form, must reproduce the above copyright notice,
19// this list of conditions and the following disclaimer in the documentation
20// and/or other materials provided with the distribution.
21//
22// * Neither the name of the copyright holder nor the names of its
23// contributors may be used to endorse or promote products derived from this
24// software without specific prior written permission.
25//
26// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
27// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
30// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36// POSSIBILITY OF SUCH DAMAGE.
37//
38// Questions? Contact darma@sandia.gov
39//
40// *****************************************************************************
41//@HEADER
42*/
43
44#if !defined INCLUDED_COMM_COMM_CLASS_HANDLE_H
45#define INCLUDED_COMM_COMM_CLASS_HANDLE_H
46
47#include <mpi.h>
48
49#include <unordered_map>
50#include <vector>
51
52namespace comm {
53
54struct CommMPI;
55
56template <typename T>
57struct ClassHandle;
58
59template <typename T>
60struct ClassHandleRank {
61 ClassHandleRank(ClassHandle<T> in_handle, int in_rank);
62
63 template <auto fn, typename... Args>
64 void send(Args&&... args);
65
66 template <auto fn, typename... Args>
67 void sendTerm(Args&&... args);
68
69private:
70 ClassHandle<T> handle_;
71 int rank_ = -1;
72};
73
74template <typename T>
75struct ClassHandle {
76 ClassHandle() = default;
77 ClassHandle(int in_index, CommMPI* in_comm);
78 ClassHandle(ClassHandle const&) = default;
79 ClassHandle& operator=(ClassHandle const&) = default;
80
81 void unregister();
82 T* get();
83 ClassHandleRank<T> operator[](int rank);
84
85 template <auto fn, typename... Args>
86 void send(int dest, Args&&... args);
87
88 template <auto fn, typename... Args>
89 void sendTerm(int dest, Args&&... args);
90
91 template <typename U, typename V>
92 void reduce(int root, MPI_Datatype datatype, MPI_Op op, U sendbuf, V recvbuf, int count);
93
94 template <typename U>
95 void broadcast(int root, MPI_Datatype datatype, U buffer, int count);
96
97 template <typename U>
98 std::unordered_map<int, std::vector<U>> allgather(U const* sendbuf, int sendcount);
99
100 friend struct ClassHandleRank<T>;
101
102 int getIndex() const { return index_; }
103
104private:
105 int index_ = 0;
106 CommMPI* comm_;
107};
108
109} // namespace comm
110
111#endif /*INCLUDED_COMM_COMM_CLASS_HANDLE_H*/
Communication layer implemented in straight MPI code.
Definition comm_traits.h:52
Definition class_handle.h:60
Definition class_handle.h:75
MPI-based communication manager.
Definition comm_mpi.h:77