56#ifndef __FENIX_MPI_UTIL__
57#define __FENIX_MPI_UTIL__
63namespace fenix::tags {
69 DETECT_FAILURES_TAG = 1000,
75static_assert(FENIX_TAG_MAX < 1<<15);
79namespace fenix::util {
81inline std::string mpi_error_string(
int errcode) {
83 ret.resize(MPI_MAX_ERROR_STRING+1);
85 MPI_Error_string(errcode, &ret[0], &len);
90inline int comm_size(MPI_Comm c) {
92 MPI_Comm_size(c, &ret);
96inline int comm_rank(MPI_Comm c) {
98 MPI_Comm_rank(c, &ret);
102static inline int type_size(MPI_Datatype d) {
103 if (d == MPI_DATATYPE_NULL)
return 0;
105 MPI_Type_size(d, &size);
109static inline bool mpi_finalized() {
111 MPI_Finalized(&flag);
121 Status(
int r) : return_value(r) {}
122 auto operator=(
int r) {
127 operator bool()
const {
return return_value == MPI_SUCCESS; }
129 operator int()
const {
return return_value; }
130 bool operator==(
int r)
const {
return return_value == r; }
132 operator MPI_Status()
const {
return status; }
133 operator MPI_Status*() {
return &status; }
138 if constexpr (I == 0)
return std::move(return_value);
139 if constexpr (I == 1)
return std::move(status);
148struct tuple_size<fenix::util::Status> : std::integral_constant<size_t, 2> {};
151struct tuple_element<0, fenix::util::Status> {
155struct tuple_element<1, fenix::util::Status> {
156 using type = MPI_Status;
Definition mpi_util.hpp:115