2024-05-13 16:43:53 +05:00
|
|
|
#ifndef NG_MPI_HPP_INCLUDED
|
|
|
|
#define NG_MPI_HPP_INCLUDED
|
|
|
|
|
|
|
|
#ifdef PARALLEL
|
|
|
|
|
|
|
|
#include <cstdint>
|
|
|
|
#include <filesystem>
|
|
|
|
#include <optional>
|
|
|
|
|
|
|
|
#include "ngcore_api.hpp"
|
|
|
|
|
|
|
|
#ifndef NG_MPI_WRAPPER
|
2024-05-28 15:43:27 +05:00
|
|
|
#define OMPI_SKIP_MPICXX
|
2024-05-13 16:43:53 +05:00
|
|
|
#include <mpi.h>
|
|
|
|
#endif // NG_MPI_WRAPPER
|
|
|
|
|
|
|
|
namespace ngcore {
|
|
|
|
|
2024-05-15 01:17:42 +05:00
|
|
|
NGCORE_API bool MPI_Loaded();
|
2024-05-13 16:43:53 +05:00
|
|
|
NGCORE_API void InitMPI(
|
|
|
|
std::optional<std::filesystem::path> mpi_lib_path = std::nullopt);
|
|
|
|
|
|
|
|
#ifdef NG_MPI_WRAPPER
|
|
|
|
inline void not_implemented() { throw std::runtime_error("Not implemented"); }
|
|
|
|
|
|
|
|
struct NG_MPI_Status {
|
|
|
|
uintptr_t data[4];
|
|
|
|
};
|
|
|
|
|
|
|
|
struct NG_MPI_Comm {
|
|
|
|
uintptr_t value;
|
|
|
|
NG_MPI_Comm() { value = 0; }
|
|
|
|
NG_MPI_Comm(uintptr_t value_) : value(value_) {}
|
|
|
|
NG_MPI_Comm(const NG_MPI_Comm &comm) : value(comm.value) {}
|
|
|
|
|
|
|
|
void operator=(int value_) { value = value_; }
|
|
|
|
void operator=(uintptr_t value_) { value = value_; }
|
|
|
|
bool operator==(const NG_MPI_Comm &comm) const { return value == comm.value; }
|
|
|
|
bool operator!=(const NG_MPI_Comm &comm) const { return value != comm.value; }
|
|
|
|
};
|
|
|
|
|
|
|
|
struct NG_MPI_Datatype {
|
|
|
|
uintptr_t value = 0;
|
|
|
|
NG_MPI_Datatype() = default;
|
|
|
|
NG_MPI_Datatype(uintptr_t value_) : value(value_) {}
|
|
|
|
operator bool() const { return value != 0; }
|
|
|
|
void operator=(NG_MPI_Datatype type) { value = type.value; }
|
|
|
|
void operator=(uintptr_t value_) { value = value_; }
|
|
|
|
void operator=(void *value_) { value = reinterpret_cast<uintptr_t>(value_); }
|
|
|
|
};
|
|
|
|
|
|
|
|
struct NG_MPI_Request {
|
|
|
|
uintptr_t value = 0;
|
|
|
|
NG_MPI_Request() = default;
|
|
|
|
NG_MPI_Request(uintptr_t value_) : value(value_) {}
|
|
|
|
void operator=(uintptr_t value_) { value = value_; }
|
2024-05-31 13:17:01 +05:00
|
|
|
void operator=(void *value_) { value = reinterpret_cast<uintptr_t>(value_); }
|
2024-05-13 16:43:53 +05:00
|
|
|
};
|
|
|
|
|
|
|
|
struct NG_MPI_Op {
|
|
|
|
uintptr_t value;
|
|
|
|
NG_MPI_Op(uintptr_t value_) : value(value_) {}
|
|
|
|
void operator=(uintptr_t value_) { value = value_; }
|
|
|
|
void operator=(void *value_) { value = reinterpret_cast<uintptr_t>(value_); }
|
|
|
|
};
|
|
|
|
|
|
|
|
struct NG_MPI_Group {
|
|
|
|
uintptr_t value = 0;
|
|
|
|
NG_MPI_Group(uintptr_t value_) : value(value_) {}
|
|
|
|
NG_MPI_Group() = default;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct NG_MPI_Aint {
|
|
|
|
intptr_t value = 0;
|
|
|
|
NG_MPI_Aint(intptr_t value_) : value(value_) {}
|
|
|
|
NG_MPI_Aint() = default;
|
|
|
|
};
|
|
|
|
|
2024-05-28 13:55:58 +05:00
|
|
|
#else // NG_MPI_WRAPPER
|
|
|
|
using NG_MPI_Comm = MPI_Comm;
|
2024-05-13 16:43:53 +05:00
|
|
|
using NG_MPI_Status = MPI_Status;
|
|
|
|
using NG_MPI_Datatype = MPI_Datatype;
|
|
|
|
using NG_MPI_Request = MPI_Request;
|
|
|
|
using NG_MPI_Op = MPI_Op;
|
|
|
|
using NG_MPI_Group = MPI_Group;
|
|
|
|
using NG_MPI_Aint = MPI_Aint;
|
2024-05-28 13:55:58 +05:00
|
|
|
#endif // NG_MPI_WRAPPER
|
2024-05-13 16:43:53 +05:00
|
|
|
|
|
|
|
#include "ng_mpi_generated_declarations.hpp"
|
|
|
|
|
|
|
|
} // namespace ngcore
|
|
|
|
|
|
|
|
#endif // PARALLEL
|
|
|
|
#endif // NG_MPI_HPP_INCLUDED
|