44#if !defined INCLUDED_COMM_COMM_CLASS_HANDLE_IMPL_H
45#define INCLUDED_COMM_COMM_CLASS_HANDLE_IMPL_H
47#include "class_handle.h"
48#include "comm/comm/MPI/comm_mpi.h"
53ClassHandleRank<T>::ClassHandleRank(
ClassHandle<T> in_handle,
int in_rank)
59template <
auto fn,
typename... Args>
60void ClassHandleRank<T>::send(Args&&... args) {
61 handle_.template send<fn>(rank_, std::forward<Args>(args)...);
65template <
auto fn,
typename... Args>
66void ClassHandleRank<T>::sendTerm(Args&&... args) {
67 handle_.template sendTerm<fn>(rank_, std::forward<Args>(args)...);
71ClassHandle<T>::ClassHandle(
int in_index, CommMPI* in_comm)
77void ClassHandle<T>::unregister() {
78 comm_->unregisterInstanceCollective(index_);
82T* ClassHandle<T>::get() {
83 return reinterpret_cast<T*
>(comm_->getInstanceCollective(index_));
87ClassHandleRank<T> ClassHandle<T>::operator[](
int rank) {
88 return ClassHandleRank<T>{*
this, rank};
92template <
auto fn,
typename... Args>
93void ClassHandle<T>::send(
int dest, Args&&... args) {
94 comm_->template send<fn>(dest, *
this, std::forward<Args>(args)...);
98template <
auto fn,
typename... Args>
99void ClassHandle<T>::sendTerm(
int dest, Args&&... args) {
100 comm_->template sendImpl<fn>(dest, index_,
true, std::forward<Args>(args)...);
104template <
typename U,
typename V>
105void ClassHandle<T>::reduce(
int root, MPI_Datatype datatype, MPI_Op op, U sendbuf, V recvbuf,
int count) {
106 comm_->reduce(root, datatype, op, sendbuf, recvbuf, count);
111void ClassHandle<T>::broadcast(
int root, MPI_Datatype datatype, U buffer,
int count) {
112 comm_->broadcast(root, datatype, buffer, count);
117std::unordered_map<int, std::vector<U>> ClassHandle<T>::allgather(U
const* sendbuf,
int sendcount) {
118 return comm_->allgather(sendbuf, sendcount);
Communication layer implemented in straight MPI code.
Definition comm_traits.h:52
Definition class_handle.h:75