mirror of
https://github.com/NGSolve/netgen.git
synced 2024-11-11 16:49:16 +05:00
MPI Wrapper fixes
This commit is contained in:
parent
11f53f2704
commit
1298a52fc0
@ -106,6 +106,7 @@ file(GENERATE OUTPUT netgen_config.hpp CONTENT
|
||||
#define NETGEN_USE_CHECK_RANGE $<BOOL:${CHECK_RANGE}>
|
||||
#define NETGEN_BUILD_STUB_FILES $<BOOL:${BUILD_STUB_FILES}>
|
||||
#define NETGEN_BUILD_FOR_CONDA $<BOOL:${BUILD_FOR_CONDA}>
|
||||
#define NETGEN_SHARED_LIBRARY_SUFFIX \"${CMAKE_SHARED_LIBRARY_SUFFIX}\"
|
||||
|
||||
#endif // NETGEN_CONFIG_HPP_INCLUDED___
|
||||
")
|
||||
|
@ -1,24 +1,42 @@
|
||||
functions = [
|
||||
("int", "MPI_Init", "int*", "char***"),
|
||||
("int", "MPI_Initialized", "int*"),
|
||||
("int", "MPI_Finalize"),
|
||||
("double", "MPI_Wtime"),
|
||||
("int", "MPI_Allgather", "void*", "int", "MPI_Datatype", "void*", "int", "MPI_Datatype", "MPI_Comm"),
|
||||
("int", "MPI_Allreduce", "void*", "void*", "int", "MPI_Datatype", "MPI_Op", "MPI_Comm"),
|
||||
("int", "MPI_Alltoall", "void*", "int", "MPI_Datatype", "void*", "int", "MPI_Datatype", "MPI_Comm"),
|
||||
("int", "MPI_Barrier", "MPI_Comm"),
|
||||
("int", "MPI_Bcast", "void*", "int", "MPI_Datatype", "int", "MPI_Comm"),
|
||||
("int", "MPI_Comm_create_group", "MPI_Comm", "MPI_Group", "int", "MPI_Comm*"),
|
||||
("int", "MPI_Comm_free", "MPI_Comm*"),
|
||||
("int", "MPI_Comm_group", "MPI_Comm", "MPI_Group*"),
|
||||
("int", "MPI_Comm_rank", "MPI_Comm", "int*"),
|
||||
("int", "MPI_Comm_size", "MPI_Comm", "int*"),
|
||||
("int", "MPI_Type_commit", "MPI_Datatype*"),
|
||||
("int", "MPI_Waitall", "int", "MPI_Request*", "MPI_Status*"),
|
||||
("int", "MPI_Waitany", "int", "MPI_Request*", "int*", "MPI_Status*"),
|
||||
("int", "MPI_Wait", "MPI_Request*", "MPI_Status*"),
|
||||
("int", "MPI_Send", "void*", "int", "MPI_Datatype", "int", "int", "MPI_Comm"),
|
||||
("int", "MPI_Finalize"),
|
||||
("int", "MPI_Gather", "void*", "int", "MPI_Datatype", "void*", "int", "MPI_Datatype", "int", "MPI_Comm"),
|
||||
("int", "MPI_Get_count", "MPI_Status*", "MPI_Datatype", "int*"),
|
||||
("int", "MPI_Get_processor_name", "char*", "int*"),
|
||||
("int", "MPI_Group_incl", "MPI_Group", "int", "int*", "MPI_Group*"),
|
||||
("int", "MPI_Init", "int*", "char***"),
|
||||
("int", "MPI_Initialized", "int*"),
|
||||
("int", "MPI_Irecv", "void*", "int", "MPI_Datatype", "int", "int", "MPI_Comm", "MPI_Request*"),
|
||||
("int", "MPI_Isend", "void*", "int", "MPI_Datatype", "int", "int", "MPI_Comm", "MPI_Request*"),
|
||||
("int", "MPI_Probe", "int", "int", "MPI_Comm", "MPI_Status*"),
|
||||
("int", "MPI_Recv", "void*", "int", "MPI_Datatype", "int", "int", "MPI_Comm", "MPI_Status*"),
|
||||
("int", "MPI_Get_count", "MPI_Status*", "MPI_Datatype", "int*"),
|
||||
("int", "MPI_Bcast", "void*", "int", "MPI_Datatype", "int", "MPI_Comm"),
|
||||
("int", "MPI_Comm_group", "MPI_Comm", "MPI_Group*"),
|
||||
("int", "MPI_Group_incl", "MPI_Group", "int", "int*", "MPI_Group*"),
|
||||
("int", "MPI_Comm_create_group", "MPI_Comm", "MPI_Group", "int", "MPI_Comm*"),
|
||||
("int", "MPI_Get_processor_name", "char*", "int*"),
|
||||
("int", "MPI_Reduce_local", "void*", "void*", "int", "MPI_Datatype", "MPI_Op"),
|
||||
("int", "MPI_Request_free", "MPI_Request*"),
|
||||
("int", "MPI_Scatter", "void*", "int", "MPI_Datatype", "void*", "int", "MPI_Datatype", "int", "MPI_Comm"),
|
||||
("int", "MPI_Send", "void*", "int", "MPI_Datatype", "int", "int", "MPI_Comm"),
|
||||
("int", "MPI_Type_commit", "MPI_Datatype*"),
|
||||
("int", "MPI_Type_contiguous", "int", "MPI_Datatype", "MPI_Datatype*"),
|
||||
("int", "MPI_Type_create_resized", "MPI_Datatype", "MPI_Aint", "MPI_Aint", "MPI_Datatype*"),
|
||||
("int", "MPI_Type_create_struct", "int", "int*", "MPI_Aint*", "MPI_Datatype*", "MPI_Datatype*"),
|
||||
("int", "MPI_Type_free", "MPI_Datatype*"),
|
||||
("int", "MPI_Type_get_extent", "MPI_Datatype", "MPI_Aint*", "MPI_Aint*"),
|
||||
("int", "MPI_Type_indexed", "int", "int*", "int*", "MPI_Datatype", "MPI_Datatype*"),
|
||||
("int", "MPI_Wait", "MPI_Request*", "MPI_Status*"),
|
||||
("int", "MPI_Waitall", "int", "MPI_Request*", "MPI_Status*"),
|
||||
("int", "MPI_Waitany", "int", "MPI_Request*", "int*", "MPI_Status*"),
|
||||
("int", "MPI_Reduce", "void*", "void*", "int", "MPI_Datatype", "MPI_Op", "int", "MPI_Comm"),
|
||||
("int", "MPI_Iprobe", "int", "int", "MPI_Comm", "int*", "MPI_Status*"),
|
||||
]
|
||||
|
||||
constants = [
|
||||
@ -31,8 +49,18 @@ constants = [
|
||||
("MPI_Datatype", "MPI_UINT64_T"),
|
||||
("MPI_Datatype", "MPI_DOUBLE"),
|
||||
("MPI_Datatype", "MPI_C_BOOL"),
|
||||
("MPI_Datatype", "MPI_DATATYPE_NULL"),
|
||||
("MPI_Datatype", "MPI_CXX_DOUBLE_COMPLEX"),
|
||||
("void*", "MPI_IN_PLACE"),
|
||||
("int", "MPI_MAX_PROCESSOR_NAME"),
|
||||
("int", "MPI_ANY_SOURCE"),
|
||||
("int", "MPI_ROOT"),
|
||||
("int", "MPI_PROC_NULL"),
|
||||
("int", "MPI_ANY_TAG"),
|
||||
("MPI_Op", "MPI_MAX"),
|
||||
("MPI_Op", "MPI_MIN"),
|
||||
("MPI_Op", "MPI_SUM"),
|
||||
("MPI_Op", "MPI_LOR"),
|
||||
]
|
||||
|
||||
def get_args(f):
|
||||
|
@ -3,10 +3,7 @@
|
||||
|
||||
#include <array>
|
||||
|
||||
#ifdef PARALLEL
|
||||
#define OMPI_SKIP_MPICXX
|
||||
// #include <mpi.h>
|
||||
#endif
|
||||
#include <complex>
|
||||
|
||||
#include "array.hpp"
|
||||
#include "table.hpp"
|
||||
@ -18,8 +15,6 @@
|
||||
namespace ngcore
|
||||
{
|
||||
|
||||
#ifdef PARALLEL
|
||||
|
||||
template <class T> struct MPI_typetrait { };
|
||||
|
||||
template <> struct MPI_typetrait<int> {
|
||||
@ -29,13 +24,13 @@ namespace ngcore
|
||||
static NG_MPI_Datatype MPIType () { return NG_MPI_SHORT; } };
|
||||
|
||||
template <> struct MPI_typetrait<char> {
|
||||
static NG_MPI_Datatype MPIType () { return NG_MPI_CHAR; } };
|
||||
static NG_MPI_Datatype MPIType () { return NG_MPI_CHAR; } };
|
||||
|
||||
template <> struct MPI_typetrait<signed char> {
|
||||
static NG_MPI_Datatype MPIType () { return NG_MPI_CHAR; } };
|
||||
static NG_MPI_Datatype MPIType () { return NG_MPI_CHAR; } };
|
||||
|
||||
template <> struct MPI_typetrait<unsigned char> {
|
||||
static NG_MPI_Datatype MPIType () { return NG_MPI_CHAR; } };
|
||||
static NG_MPI_Datatype MPIType () { return NG_MPI_CHAR; } };
|
||||
|
||||
template <> struct MPI_typetrait<size_t> {
|
||||
static NG_MPI_Datatype MPIType () { return NG_MPI_UINT64_T; } };
|
||||
@ -43,6 +38,9 @@ namespace ngcore
|
||||
template <> struct MPI_typetrait<double> {
|
||||
static NG_MPI_Datatype MPIType () { return NG_MPI_DOUBLE; } };
|
||||
|
||||
template <> struct MPI_typetrait<std::complex<double>> {
|
||||
static NG_MPI_Datatype MPIType () { return NG_MPI_CXX_DOUBLE_COMPLEX; } };
|
||||
|
||||
template <> struct MPI_typetrait<bool> {
|
||||
static NG_MPI_Datatype MPIType () { return NG_MPI_C_BOOL; } };
|
||||
|
||||
@ -50,7 +48,7 @@ namespace ngcore
|
||||
template<typename T, size_t S>
|
||||
struct MPI_typetrait<std::array<T,S>>
|
||||
{
|
||||
static NG_MPI_Datatype MPIType ()
|
||||
static NG_MPI_Datatype MPIType ()
|
||||
{
|
||||
static NG_MPI_Datatype NG_MPI_T = 0;
|
||||
if (!NG_MPI_T)
|
||||
@ -333,7 +331,7 @@ namespace ngcore
|
||||
template <typename T>
|
||||
void AllToAll (FlatArray<T> send, FlatArray<T> recv) const
|
||||
{
|
||||
NG_MPI_Alltoall (send.Data(), 1, GetMPIType<T>(),
|
||||
NG_MPI_Alltoall (send.Data(), 1, GetMPIType<T>(),
|
||||
recv.Data(), 1, GetMPIType<T>(), comm);
|
||||
}
|
||||
|
||||
@ -359,7 +357,7 @@ namespace ngcore
|
||||
{
|
||||
recv[0] = T(0);
|
||||
if (size == 1) return;
|
||||
NG_MPI_Gather (NG_MPI_IN_PLACE, 1, GetMPIType<T>(),
|
||||
NG_MPI_Gather (NG_MPI_IN_PLACE, 1, GetMPIType<T>(),
|
||||
recv.Data(), 1, GetMPIType<T>(), 0, comm);
|
||||
}
|
||||
|
||||
@ -367,7 +365,7 @@ namespace ngcore
|
||||
void Gather (T send) const
|
||||
{
|
||||
if (size == 1) return;
|
||||
NG_MPI_Gather (&send, 1, GetMPIType<T>(),
|
||||
NG_MPI_Gather (&send, 1, GetMPIType<T>(),
|
||||
NULL, 1, GetMPIType<T>(), 0, comm);
|
||||
}
|
||||
|
||||
@ -464,117 +462,6 @@ namespace ngcore
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#else // PARALLEL
|
||||
class NG_MPI_Comm {
|
||||
int nr;
|
||||
public:
|
||||
NG_MPI_Comm (int _nr = 0) : nr(_nr) { ; }
|
||||
operator int() const { return nr; }
|
||||
bool operator== (NG_MPI_Comm c2) const { return nr == c2.nr; }
|
||||
};
|
||||
static NG_MPI_Comm NG_MPI_COMM_WORLD = 12345, NG_MPI_COMM_NULL = 10000;
|
||||
|
||||
typedef int NG_MPI_Op;
|
||||
typedef int NG_MPI_Datatype;
|
||||
typedef int NG_MPI_Request;
|
||||
|
||||
enum { NG_MPI_SUM = 0, NG_MPI_MIN = 1, NG_MPI_MAX = 2, NG_MPI_LOR = 4711 };
|
||||
|
||||
inline void NG_MPI_Type_contiguous ( int, NG_MPI_Datatype, NG_MPI_Datatype*) { ; }
|
||||
inline void NG_MPI_Type_commit ( NG_MPI_Datatype * ) { ; }
|
||||
|
||||
template <class T> struct MPI_typetrait {
|
||||
static NG_MPI_Datatype MPIType () { return -1; }
|
||||
};
|
||||
template <class T, class T2=void>
|
||||
inline NG_MPI_Datatype GetMPIType () { return -1; }
|
||||
|
||||
class NgMPI_Comm
|
||||
{
|
||||
|
||||
public:
|
||||
NgMPI_Comm () { ; }
|
||||
NgMPI_Comm (NG_MPI_Comm _comm, bool owns = false) { ; }
|
||||
|
||||
size_t Rank() const { return 0; }
|
||||
size_t Size() const { return 1; }
|
||||
bool ValidCommunicator() const { return false; }
|
||||
void Barrier() const { ; }
|
||||
operator NG_MPI_Comm() const { return NG_MPI_Comm(); }
|
||||
|
||||
template<typename T>
|
||||
void Send( T & val, int dest, int tag) const { ; }
|
||||
|
||||
template<typename T>
|
||||
void Send(FlatArray<T> s, int dest, int tag) const { ; }
|
||||
|
||||
template<typename T>
|
||||
void Recv (T & val, int src, int tag) const { ; }
|
||||
|
||||
template <typename T>
|
||||
void Recv (FlatArray <T> s, int src, int tag) const { ; }
|
||||
|
||||
template <typename T>
|
||||
void Recv (Array <T> & s, int src, int tag) const { ; }
|
||||
|
||||
template<typename T>
|
||||
NG_MPI_Request ISend (T & val, int dest, int tag) const { return 0; }
|
||||
|
||||
template<typename T>
|
||||
NG_MPI_Request ISend (FlatArray<T> s, int dest, int tag) const { return 0; }
|
||||
|
||||
template<typename T>
|
||||
NG_MPI_Request IRecv (T & val, int dest, int tag) const { return 0; }
|
||||
|
||||
template<typename T>
|
||||
NG_MPI_Request IRecv (FlatArray<T> s, int src, int tag) const { return 0; }
|
||||
|
||||
template <typename T>
|
||||
T Reduce (T d, const NG_MPI_Op & op, int root = 0) const { return d; }
|
||||
|
||||
template <typename T>
|
||||
T AllReduce (T d, const NG_MPI_Op & op) const { return d; }
|
||||
|
||||
template <typename T>
|
||||
void AllReduce (FlatArray<T> d, const NG_MPI_Op & op) const { ; }
|
||||
|
||||
template <typename T>
|
||||
void Bcast (T & s, int root = 0) const { ; }
|
||||
|
||||
template <class T>
|
||||
void Bcast (Array<T> & d, int root = 0) { ; }
|
||||
|
||||
template <typename T>
|
||||
void AllGather (T val, FlatArray<T> recv) const
|
||||
{
|
||||
recv[0] = val;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
void ExchangeTable (DynamicTable<T> & send_data,
|
||||
DynamicTable<T> & recv_data, int tag) { ; }
|
||||
|
||||
|
||||
NgMPI_Comm SubCommunicator (FlatArray<int> procs) const
|
||||
{ return *this; }
|
||||
};
|
||||
|
||||
inline void MyMPI_WaitAll (FlatArray<NG_MPI_Request> requests) { ; }
|
||||
inline int MyMPI_WaitAny (FlatArray<NG_MPI_Request> requests) { return 0; }
|
||||
|
||||
class MyMPI
|
||||
{
|
||||
public:
|
||||
MyMPI(int argc, char ** argv) { ; }
|
||||
};
|
||||
|
||||
|
||||
#endif // PARALLEL
|
||||
|
||||
} // namespace ngcore
|
||||
|
||||
#endif // NGCORE_MPIWRAPPER_HPP
|
||||
|
@ -8,74 +8,94 @@
|
||||
|
||||
namespace ngcore {
|
||||
|
||||
// template <typename T>
|
||||
// uintptr_t mpi2ng(T t) {
|
||||
// if constexpr (std::is_pointer_v<T>)
|
||||
// return reinterpret_cast<uintptr_t>(t);
|
||||
// else
|
||||
// return static_cast<uintptr_t>(t);
|
||||
// }
|
||||
|
||||
static_assert(sizeof(MPI_Status) <= sizeof(NG_MPI_Status), "Size mismatch");
|
||||
static_assert(alignof(MPI_Status) <= alignof(NG_MPI_Status), "Size mismatch");
|
||||
|
||||
int mpi2ng(int v) { return v; }
|
||||
void* mpi2ng(void*p) { return p; }
|
||||
int mpi2ng(int value) { return value; }
|
||||
void* mpi2ng(void* ptr) { return ptr; }
|
||||
|
||||
// TODO: When we are dealing with arrays of multiple MPI_Status, we need to copy them together in continuous memory
|
||||
NG_MPI_Status* mpi2ng(MPI_Status*p) { return reinterpret_cast<NG_MPI_Status*>(p); }
|
||||
// TODO: When we are dealing with arrays of multiple MPI_Statuses, we need to
|
||||
// copy them together in continuous memory
|
||||
NG_MPI_Status* mpi2ng(MPI_Status* status) {
|
||||
return reinterpret_cast<NG_MPI_Status*>(status);
|
||||
}
|
||||
|
||||
NG_MPI_Comm mpi2ng(MPI_Comm c) { return reinterpret_cast<uintptr_t>(c); }
|
||||
#ifndef MPICH
|
||||
NG_MPI_Comm mpi2ng(MPI_Comm comm) { return reinterpret_cast<uintptr_t>(comm); }
|
||||
#endif
|
||||
|
||||
template <typename T>
|
||||
T cast_ng2mpi(uintptr_t t) {
|
||||
T cast_ng2mpi(uintptr_t obj) {
|
||||
if constexpr (std::is_pointer_v<T>)
|
||||
return reinterpret_cast<T>(t);
|
||||
return reinterpret_cast<T>(obj);
|
||||
else
|
||||
return static_cast<T>(t);
|
||||
return static_cast<T>(obj);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
T cast_ng2mpi(uintptr_t* t) {
|
||||
T cast_ng2mpi(uintptr_t* ptr) {
|
||||
if constexpr (std::is_pointer_v<T>)
|
||||
return reinterpret_cast<T>(t);
|
||||
return reinterpret_cast<T>(ptr);
|
||||
else
|
||||
return static_cast<T>(t);
|
||||
return static_cast<T>(ptr);
|
||||
}
|
||||
|
||||
MPI_Comm ng2mpi(NG_MPI_Comm c) {
|
||||
static_assert(sizeof(MPI_Comm) <= sizeof(c.value), "Size mismatch");
|
||||
MPI_Comm ng2mpi(NG_MPI_Comm comm) {
|
||||
static_assert(sizeof(MPI_Comm) <= sizeof(comm.value), "Size mismatch");
|
||||
static_assert(alignof(MPI_Comm) <= alignof(NG_MPI_Comm), "Size mismatch");
|
||||
return cast_ng2mpi<MPI_Comm>(c.value);
|
||||
return cast_ng2mpi<MPI_Comm>(comm.value);
|
||||
}
|
||||
|
||||
MPI_Group ng2mpi(NG_MPI_Group c) {
|
||||
static_assert(sizeof(MPI_Group) <= sizeof(c.value), "Size mismatch");
|
||||
MPI_Group ng2mpi(NG_MPI_Group group) {
|
||||
static_assert(sizeof(MPI_Group) <= sizeof(group.value), "Size mismatch");
|
||||
static_assert(alignof(MPI_Group) <= alignof(NG_MPI_Group), "Size mismatch");
|
||||
return cast_ng2mpi<MPI_Group>(c.value);
|
||||
return cast_ng2mpi<MPI_Group>(group.value);
|
||||
}
|
||||
|
||||
MPI_Comm* ng2mpi(NG_MPI_Comm* c) { return cast_ng2mpi<MPI_Comm*>(&c->value); }
|
||||
MPI_Group* ng2mpi(NG_MPI_Group* c) { return cast_ng2mpi<MPI_Group*>(&c->value); }
|
||||
MPI_Datatype* ng2mpi(NG_MPI_Datatype* c) { return cast_ng2mpi<MPI_Datatype*>(&c->value); }
|
||||
MPI_Request* ng2mpi(NG_MPI_Request* c) { return cast_ng2mpi<MPI_Request*>(&c->value); }
|
||||
MPI_Status* ng2mpi(NG_MPI_Status* c) { return reinterpret_cast<MPI_Status*>(c); }
|
||||
|
||||
MPI_Datatype ng2mpi(NG_MPI_Datatype c) {
|
||||
static_assert(sizeof(MPI_Datatype) <= sizeof(c.value), "Size mismatch");
|
||||
return cast_ng2mpi<MPI_Datatype>(c.value);
|
||||
MPI_Comm* ng2mpi(NG_MPI_Comm* comm) {
|
||||
return cast_ng2mpi<MPI_Comm*>(&comm->value);
|
||||
}
|
||||
MPI_Group* ng2mpi(NG_MPI_Group* group) {
|
||||
return cast_ng2mpi<MPI_Group*>(&group->value);
|
||||
}
|
||||
MPI_Datatype* ng2mpi(NG_MPI_Datatype* type) {
|
||||
return cast_ng2mpi<MPI_Datatype*>(&type->value);
|
||||
}
|
||||
MPI_Request* ng2mpi(NG_MPI_Request* request) {
|
||||
return cast_ng2mpi<MPI_Request*>(&request->value);
|
||||
}
|
||||
MPI_Status* ng2mpi(NG_MPI_Status* status) {
|
||||
return reinterpret_cast<MPI_Status*>(status);
|
||||
}
|
||||
MPI_Aint* ng2mpi(NG_MPI_Aint* aint) {
|
||||
return reinterpret_cast<MPI_Aint*>(aint);
|
||||
}
|
||||
|
||||
MPI_Request ng2mpi(NG_MPI_Request c) {
|
||||
static_assert(sizeof(MPI_Request) <= sizeof(c.value), "Size mismatch");
|
||||
return cast_ng2mpi<MPI_Request>(c.value);
|
||||
MPI_Datatype ng2mpi(NG_MPI_Datatype type) {
|
||||
static_assert(sizeof(MPI_Datatype) <= sizeof(type.value), "Size mismatch");
|
||||
return cast_ng2mpi<MPI_Datatype>(type.value);
|
||||
}
|
||||
|
||||
void* ng2mpi(void* c) { return c; }
|
||||
char* ng2mpi(char* c) { return c; }
|
||||
char*** ng2mpi(char*** c) { return c; }
|
||||
int* ng2mpi(int* c) { return c; }
|
||||
int ng2mpi(int c) { return c; }
|
||||
MPI_Request ng2mpi(NG_MPI_Request request) {
|
||||
static_assert(sizeof(MPI_Request) <= sizeof(request.value), "Size mismatch");
|
||||
return cast_ng2mpi<MPI_Request>(request.value);
|
||||
}
|
||||
|
||||
MPI_Op ng2mpi(NG_MPI_Op op) {
|
||||
static_assert(sizeof(MPI_Op) <= sizeof(op.value), "Size mismatch");
|
||||
return cast_ng2mpi<MPI_Op>(op.value);
|
||||
}
|
||||
|
||||
MPI_Aint ng2mpi(NG_MPI_Aint aint) {
|
||||
static_assert(sizeof(MPI_Aint) <= sizeof(aint.value), "Size mismatch");
|
||||
return cast_ng2mpi<MPI_Aint>(aint.value);
|
||||
}
|
||||
|
||||
void* ng2mpi(void* ptr) { return ptr; }
|
||||
char* ng2mpi(char* ptr) { return ptr; }
|
||||
char*** ng2mpi(char*** ptr) { return ptr; }
|
||||
int* ng2mpi(int* ptr) { return ptr; }
|
||||
int ng2mpi(int value) { return value; }
|
||||
|
||||
} // namespace ngcore
|
||||
|
||||
|
@ -2,14 +2,17 @@
|
||||
#define NG_MPI_HPP_INCLUDED
|
||||
|
||||
#include <cstdint>
|
||||
#include <stdexcept>
|
||||
#include <filesystem>
|
||||
#include <string>
|
||||
|
||||
#include "ngcore_api.hpp"
|
||||
|
||||
namespace ngcore {
|
||||
|
||||
NGCORE_API void InitMPI();
|
||||
NGCORE_API void InitMPI(
|
||||
std::filesystem::path mpi_lib_path = std::string("libmpi") +
|
||||
NETGEN_SHARED_LIBRARY_SUFFIX,
|
||||
std::filesystem::path ng_libs_dir = "");
|
||||
NGCORE_API extern std::string mpi_library_version;
|
||||
|
||||
inline void not_implemented() { throw std::runtime_error("Not implemented"); }
|
||||
@ -20,39 +23,51 @@ struct NG_MPI_Status {
|
||||
|
||||
struct NG_MPI_Comm {
|
||||
uintptr_t value;
|
||||
NG_MPI_Comm() { value = 0;}
|
||||
NG_MPI_Comm(uintptr_t v) : value(v) {}
|
||||
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 =(uintptr_t v) { value = v; }
|
||||
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;
|
||||
NG_MPI_Datatype(uintptr_t v) : value(v) {}
|
||||
uintptr_t value = 0;
|
||||
NG_MPI_Datatype() = default;
|
||||
NG_MPI_Datatype(uintptr_t value_) : value(value_) {}
|
||||
operator bool() const { return value != 0; }
|
||||
void operator =(uintptr_t v) { value = v; }
|
||||
void operator =(void * v) { value = reinterpret_cast<uintptr_t>(v); }
|
||||
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(uintptr_t v) : value(v) {}
|
||||
NG_MPI_Request() = default;
|
||||
void operator =(uintptr_t v) { value = v; }
|
||||
NG_MPI_Request(uintptr_t value_) : value(value_) {}
|
||||
void operator=(uintptr_t value_) { value = value_; }
|
||||
};
|
||||
|
||||
struct NG_MPI_Op {
|
||||
uintptr_t value;
|
||||
NG_MPI_Op(uintptr_t v) : value(v) {}
|
||||
void operator =(uintptr_t v) { value = v; }
|
||||
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 v) : value(v) {}
|
||||
NG_MPI_Group(uintptr_t value_) : value(value_) {}
|
||||
NG_MPI_Group() = default;
|
||||
};
|
||||
|
||||
struct NG_MPI_Aint {
|
||||
uintptr_t value = 0;
|
||||
NG_MPI_Aint(uintptr_t value_) : value(value_) {}
|
||||
NG_MPI_Aint() = default;
|
||||
};
|
||||
|
||||
#include "ng_mpi_generated_declarations.hpp"
|
||||
|
||||
|
@ -1,23 +1,41 @@
|
||||
NGCORE_API extern int (*NG_MPI_Init)(int*, char***);
|
||||
NGCORE_API extern int (*NG_MPI_Initialized)(int*);
|
||||
NGCORE_API extern int (*NG_MPI_Finalize)();
|
||||
NGCORE_API extern double (*NG_MPI_Wtime)();
|
||||
NGCORE_API extern int (*NG_MPI_Allgather)(void*, int, NG_MPI_Datatype, void*, int, NG_MPI_Datatype, NG_MPI_Comm);
|
||||
NGCORE_API extern int (*NG_MPI_Allreduce)(void*, void*, int, NG_MPI_Datatype, NG_MPI_Op, NG_MPI_Comm);
|
||||
NGCORE_API extern int (*NG_MPI_Alltoall)(void*, int, NG_MPI_Datatype, void*, int, NG_MPI_Datatype, NG_MPI_Comm);
|
||||
NGCORE_API extern int (*NG_MPI_Barrier)(NG_MPI_Comm);
|
||||
NGCORE_API extern int (*NG_MPI_Bcast)(void*, int, NG_MPI_Datatype, int, NG_MPI_Comm);
|
||||
NGCORE_API extern int (*NG_MPI_Comm_create_group)(NG_MPI_Comm, NG_MPI_Group, int, NG_MPI_Comm*);
|
||||
NGCORE_API extern int (*NG_MPI_Comm_free)(NG_MPI_Comm*);
|
||||
NGCORE_API extern int (*NG_MPI_Comm_group)(NG_MPI_Comm, NG_MPI_Group*);
|
||||
NGCORE_API extern int (*NG_MPI_Comm_rank)(NG_MPI_Comm, int*);
|
||||
NGCORE_API extern int (*NG_MPI_Comm_size)(NG_MPI_Comm, int*);
|
||||
NGCORE_API extern int (*NG_MPI_Type_commit)(NG_MPI_Datatype*);
|
||||
NGCORE_API extern int (*NG_MPI_Waitall)(int, NG_MPI_Request*, NG_MPI_Status*);
|
||||
NGCORE_API extern int (*NG_MPI_Waitany)(int, NG_MPI_Request*, int*, NG_MPI_Status*);
|
||||
NGCORE_API extern int (*NG_MPI_Wait)(NG_MPI_Request*, NG_MPI_Status*);
|
||||
NGCORE_API extern int (*NG_MPI_Send)(void*, int, NG_MPI_Datatype, int, int, NG_MPI_Comm);
|
||||
NGCORE_API extern int (*NG_MPI_Finalize)();
|
||||
NGCORE_API extern int (*NG_MPI_Gather)(void*, int, NG_MPI_Datatype, void*, int, NG_MPI_Datatype, int, NG_MPI_Comm);
|
||||
NGCORE_API extern int (*NG_MPI_Get_count)(NG_MPI_Status*, NG_MPI_Datatype, int*);
|
||||
NGCORE_API extern int (*NG_MPI_Get_processor_name)(char*, int*);
|
||||
NGCORE_API extern int (*NG_MPI_Group_incl)(NG_MPI_Group, int, int*, NG_MPI_Group*);
|
||||
NGCORE_API extern int (*NG_MPI_Init)(int*, char***);
|
||||
NGCORE_API extern int (*NG_MPI_Initialized)(int*);
|
||||
NGCORE_API extern int (*NG_MPI_Irecv)(void*, int, NG_MPI_Datatype, int, int, NG_MPI_Comm, NG_MPI_Request*);
|
||||
NGCORE_API extern int (*NG_MPI_Isend)(void*, int, NG_MPI_Datatype, int, int, NG_MPI_Comm, NG_MPI_Request*);
|
||||
NGCORE_API extern int (*NG_MPI_Probe)(int, int, NG_MPI_Comm, NG_MPI_Status*);
|
||||
NGCORE_API extern int (*NG_MPI_Recv)(void*, int, NG_MPI_Datatype, int, int, NG_MPI_Comm, NG_MPI_Status*);
|
||||
NGCORE_API extern int (*NG_MPI_Get_count)(NG_MPI_Status*, NG_MPI_Datatype, int*);
|
||||
NGCORE_API extern int (*NG_MPI_Bcast)(void*, int, NG_MPI_Datatype, int, NG_MPI_Comm);
|
||||
NGCORE_API extern int (*NG_MPI_Comm_group)(NG_MPI_Comm, NG_MPI_Group*);
|
||||
NGCORE_API extern int (*NG_MPI_Group_incl)(NG_MPI_Group, int, int*, NG_MPI_Group*);
|
||||
NGCORE_API extern int (*NG_MPI_Comm_create_group)(NG_MPI_Comm, NG_MPI_Group, int, NG_MPI_Comm*);
|
||||
NGCORE_API extern int (*NG_MPI_Get_processor_name)(char*, int*);
|
||||
NGCORE_API extern int (*NG_MPI_Reduce_local)(void*, void*, int, NG_MPI_Datatype, NG_MPI_Op);
|
||||
NGCORE_API extern int (*NG_MPI_Request_free)(NG_MPI_Request*);
|
||||
NGCORE_API extern int (*NG_MPI_Scatter)(void*, int, NG_MPI_Datatype, void*, int, NG_MPI_Datatype, int, NG_MPI_Comm);
|
||||
NGCORE_API extern int (*NG_MPI_Send)(void*, int, NG_MPI_Datatype, int, int, NG_MPI_Comm);
|
||||
NGCORE_API extern int (*NG_MPI_Type_commit)(NG_MPI_Datatype*);
|
||||
NGCORE_API extern int (*NG_MPI_Type_contiguous)(int, NG_MPI_Datatype, NG_MPI_Datatype*);
|
||||
NGCORE_API extern int (*NG_MPI_Type_create_resized)(NG_MPI_Datatype, NG_MPI_Aint, NG_MPI_Aint, NG_MPI_Datatype*);
|
||||
NGCORE_API extern int (*NG_MPI_Type_create_struct)(int, int*, NG_MPI_Aint*, NG_MPI_Datatype*, NG_MPI_Datatype*);
|
||||
NGCORE_API extern int (*NG_MPI_Type_free)(NG_MPI_Datatype*);
|
||||
NGCORE_API extern int (*NG_MPI_Type_get_extent)(NG_MPI_Datatype, NG_MPI_Aint*, NG_MPI_Aint*);
|
||||
NGCORE_API extern int (*NG_MPI_Type_indexed)(int, int*, int*, NG_MPI_Datatype, NG_MPI_Datatype*);
|
||||
NGCORE_API extern int (*NG_MPI_Wait)(NG_MPI_Request*, NG_MPI_Status*);
|
||||
NGCORE_API extern int (*NG_MPI_Waitall)(int, NG_MPI_Request*, NG_MPI_Status*);
|
||||
NGCORE_API extern int (*NG_MPI_Waitany)(int, NG_MPI_Request*, int*, NG_MPI_Status*);
|
||||
NGCORE_API extern int (*NG_MPI_Reduce)(void*, void*, int, NG_MPI_Datatype, NG_MPI_Op, int, NG_MPI_Comm);
|
||||
NGCORE_API extern int (*NG_MPI_Iprobe)(int, int, NG_MPI_Comm, int*, NG_MPI_Status*);
|
||||
NGCORE_API extern NG_MPI_Comm NG_MPI_COMM_WORLD;
|
||||
NGCORE_API extern NG_MPI_Status* NG_MPI_STATUS_IGNORE;
|
||||
NGCORE_API extern NG_MPI_Status* NG_MPI_STATUSES_IGNORE;
|
||||
@ -27,5 +45,15 @@ NGCORE_API extern NG_MPI_Datatype NG_MPI_CHAR;
|
||||
NGCORE_API extern NG_MPI_Datatype NG_MPI_UINT64_T;
|
||||
NGCORE_API extern NG_MPI_Datatype NG_MPI_DOUBLE;
|
||||
NGCORE_API extern NG_MPI_Datatype NG_MPI_C_BOOL;
|
||||
NGCORE_API extern NG_MPI_Datatype NG_MPI_DATATYPE_NULL;
|
||||
NGCORE_API extern NG_MPI_Datatype NG_MPI_CXX_DOUBLE_COMPLEX;
|
||||
NGCORE_API extern void* NG_MPI_IN_PLACE;
|
||||
NGCORE_API extern int NG_MPI_MAX_PROCESSOR_NAME;
|
||||
NGCORE_API extern int NG_MPI_ANY_SOURCE;
|
||||
NGCORE_API extern int NG_MPI_ROOT;
|
||||
NGCORE_API extern int NG_MPI_PROC_NULL;
|
||||
NGCORE_API extern int NG_MPI_ANY_TAG;
|
||||
NGCORE_API extern NG_MPI_Op NG_MPI_MAX;
|
||||
NGCORE_API extern NG_MPI_Op NG_MPI_MIN;
|
||||
NGCORE_API extern NG_MPI_Op NG_MPI_SUM;
|
||||
NGCORE_API extern NG_MPI_Op NG_MPI_LOR;
|
||||
|
@ -1,23 +1,41 @@
|
||||
decltype(NG_MPI_Init) NG_MPI_Init = [](int*, char***)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Initialized) NG_MPI_Initialized = [](int*)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Finalize) NG_MPI_Finalize = []()->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Wtime) NG_MPI_Wtime = []()->double { throw no_mpi(); };
|
||||
decltype(NG_MPI_Allgather) NG_MPI_Allgather = [](void*, int, NG_MPI_Datatype, void*, int, NG_MPI_Datatype, NG_MPI_Comm)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Allreduce) NG_MPI_Allreduce = [](void*, void*, int, NG_MPI_Datatype, NG_MPI_Op, NG_MPI_Comm)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Alltoall) NG_MPI_Alltoall = [](void*, int, NG_MPI_Datatype, void*, int, NG_MPI_Datatype, NG_MPI_Comm)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Barrier) NG_MPI_Barrier = [](NG_MPI_Comm)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Bcast) NG_MPI_Bcast = [](void*, int, NG_MPI_Datatype, int, NG_MPI_Comm)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Comm_create_group) NG_MPI_Comm_create_group = [](NG_MPI_Comm, NG_MPI_Group, int, NG_MPI_Comm*)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Comm_free) NG_MPI_Comm_free = [](NG_MPI_Comm*)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Comm_group) NG_MPI_Comm_group = [](NG_MPI_Comm, NG_MPI_Group*)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Comm_rank) NG_MPI_Comm_rank = [](NG_MPI_Comm, int*)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Comm_size) NG_MPI_Comm_size = [](NG_MPI_Comm, int*)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Type_commit) NG_MPI_Type_commit = [](NG_MPI_Datatype*)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Waitall) NG_MPI_Waitall = [](int, NG_MPI_Request*, NG_MPI_Status*)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Waitany) NG_MPI_Waitany = [](int, NG_MPI_Request*, int*, NG_MPI_Status*)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Wait) NG_MPI_Wait = [](NG_MPI_Request*, NG_MPI_Status*)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Send) NG_MPI_Send = [](void*, int, NG_MPI_Datatype, int, int, NG_MPI_Comm)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Finalize) NG_MPI_Finalize = []()->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Gather) NG_MPI_Gather = [](void*, int, NG_MPI_Datatype, void*, int, NG_MPI_Datatype, int, NG_MPI_Comm)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Get_count) NG_MPI_Get_count = [](NG_MPI_Status*, NG_MPI_Datatype, int*)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Get_processor_name) NG_MPI_Get_processor_name = [](char*, int*)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Group_incl) NG_MPI_Group_incl = [](NG_MPI_Group, int, int*, NG_MPI_Group*)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Init) NG_MPI_Init = [](int*, char***)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Initialized) NG_MPI_Initialized = [](int*)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Irecv) NG_MPI_Irecv = [](void*, int, NG_MPI_Datatype, int, int, NG_MPI_Comm, NG_MPI_Request*)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Isend) NG_MPI_Isend = [](void*, int, NG_MPI_Datatype, int, int, NG_MPI_Comm, NG_MPI_Request*)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Probe) NG_MPI_Probe = [](int, int, NG_MPI_Comm, NG_MPI_Status*)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Recv) NG_MPI_Recv = [](void*, int, NG_MPI_Datatype, int, int, NG_MPI_Comm, NG_MPI_Status*)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Get_count) NG_MPI_Get_count = [](NG_MPI_Status*, NG_MPI_Datatype, int*)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Bcast) NG_MPI_Bcast = [](void*, int, NG_MPI_Datatype, int, NG_MPI_Comm)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Comm_group) NG_MPI_Comm_group = [](NG_MPI_Comm, NG_MPI_Group*)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Group_incl) NG_MPI_Group_incl = [](NG_MPI_Group, int, int*, NG_MPI_Group*)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Comm_create_group) NG_MPI_Comm_create_group = [](NG_MPI_Comm, NG_MPI_Group, int, NG_MPI_Comm*)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Get_processor_name) NG_MPI_Get_processor_name = [](char*, int*)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Reduce_local) NG_MPI_Reduce_local = [](void*, void*, int, NG_MPI_Datatype, NG_MPI_Op)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Request_free) NG_MPI_Request_free = [](NG_MPI_Request*)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Scatter) NG_MPI_Scatter = [](void*, int, NG_MPI_Datatype, void*, int, NG_MPI_Datatype, int, NG_MPI_Comm)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Send) NG_MPI_Send = [](void*, int, NG_MPI_Datatype, int, int, NG_MPI_Comm)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Type_commit) NG_MPI_Type_commit = [](NG_MPI_Datatype*)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Type_contiguous) NG_MPI_Type_contiguous = [](int, NG_MPI_Datatype, NG_MPI_Datatype*)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Type_create_resized) NG_MPI_Type_create_resized = [](NG_MPI_Datatype, NG_MPI_Aint, NG_MPI_Aint, NG_MPI_Datatype*)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Type_create_struct) NG_MPI_Type_create_struct = [](int, int*, NG_MPI_Aint*, NG_MPI_Datatype*, NG_MPI_Datatype*)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Type_free) NG_MPI_Type_free = [](NG_MPI_Datatype*)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Type_get_extent) NG_MPI_Type_get_extent = [](NG_MPI_Datatype, NG_MPI_Aint*, NG_MPI_Aint*)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Type_indexed) NG_MPI_Type_indexed = [](int, int*, int*, NG_MPI_Datatype, NG_MPI_Datatype*)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Wait) NG_MPI_Wait = [](NG_MPI_Request*, NG_MPI_Status*)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Waitall) NG_MPI_Waitall = [](int, NG_MPI_Request*, NG_MPI_Status*)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Waitany) NG_MPI_Waitany = [](int, NG_MPI_Request*, int*, NG_MPI_Status*)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Reduce) NG_MPI_Reduce = [](void*, void*, int, NG_MPI_Datatype, NG_MPI_Op, int, NG_MPI_Comm)->int { throw no_mpi(); };
|
||||
decltype(NG_MPI_Iprobe) NG_MPI_Iprobe = [](int, int, NG_MPI_Comm, int*, NG_MPI_Status*)->int { throw no_mpi(); };
|
||||
NG_MPI_Comm NG_MPI_COMM_WORLD = 0;
|
||||
NG_MPI_Status* NG_MPI_STATUS_IGNORE = 0;
|
||||
NG_MPI_Status* NG_MPI_STATUSES_IGNORE = 0;
|
||||
@ -27,5 +45,15 @@ NG_MPI_Datatype NG_MPI_CHAR = 0;
|
||||
NG_MPI_Datatype NG_MPI_UINT64_T = 0;
|
||||
NG_MPI_Datatype NG_MPI_DOUBLE = 0;
|
||||
NG_MPI_Datatype NG_MPI_C_BOOL = 0;
|
||||
NG_MPI_Datatype NG_MPI_DATATYPE_NULL = 0;
|
||||
NG_MPI_Datatype NG_MPI_CXX_DOUBLE_COMPLEX = 0;
|
||||
void* NG_MPI_IN_PLACE = 0;
|
||||
int NG_MPI_MAX_PROCESSOR_NAME = 0;
|
||||
int NG_MPI_ANY_SOURCE = 0;
|
||||
int NG_MPI_ROOT = 0;
|
||||
int NG_MPI_PROC_NULL = 0;
|
||||
int NG_MPI_ANY_TAG = 0;
|
||||
NG_MPI_Op NG_MPI_MAX = 0;
|
||||
NG_MPI_Op NG_MPI_MIN = 0;
|
||||
NG_MPI_Op NG_MPI_SUM = 0;
|
||||
NG_MPI_Op NG_MPI_LOR = 0;
|
||||
|
@ -1,23 +1,41 @@
|
||||
NG_MPI_Init = [](int* arg0, char*** arg1)->int { return MPI_Init( ng2mpi(arg0), ng2mpi(arg1)); };
|
||||
NG_MPI_Initialized = [](int* arg0)->int { return MPI_Initialized( ng2mpi(arg0)); };
|
||||
NG_MPI_Finalize = []()->int { return MPI_Finalize(); };
|
||||
NG_MPI_Wtime = []()->double { return MPI_Wtime(); };
|
||||
NG_MPI_Allgather = [](void* arg0, int arg1, NG_MPI_Datatype arg2, void* arg3, int arg4, NG_MPI_Datatype arg5, NG_MPI_Comm arg6)->int { return MPI_Allgather( ng2mpi(arg0), ng2mpi(arg1), ng2mpi(arg2), ng2mpi(arg3), ng2mpi(arg4), ng2mpi(arg5), ng2mpi(arg6)); };
|
||||
NG_MPI_Allreduce = [](void* arg0, void* arg1, int arg2, NG_MPI_Datatype arg3, NG_MPI_Op arg4, NG_MPI_Comm arg5)->int { return MPI_Allreduce( ng2mpi(arg0), ng2mpi(arg1), ng2mpi(arg2), ng2mpi(arg3), ng2mpi(arg4), ng2mpi(arg5)); };
|
||||
NG_MPI_Alltoall = [](void* arg0, int arg1, NG_MPI_Datatype arg2, void* arg3, int arg4, NG_MPI_Datatype arg5, NG_MPI_Comm arg6)->int { return MPI_Alltoall( ng2mpi(arg0), ng2mpi(arg1), ng2mpi(arg2), ng2mpi(arg3), ng2mpi(arg4), ng2mpi(arg5), ng2mpi(arg6)); };
|
||||
NG_MPI_Barrier = [](NG_MPI_Comm arg0)->int { return MPI_Barrier( ng2mpi(arg0)); };
|
||||
NG_MPI_Bcast = [](void* arg0, int arg1, NG_MPI_Datatype arg2, int arg3, NG_MPI_Comm arg4)->int { return MPI_Bcast( ng2mpi(arg0), ng2mpi(arg1), ng2mpi(arg2), ng2mpi(arg3), ng2mpi(arg4)); };
|
||||
NG_MPI_Comm_create_group = [](NG_MPI_Comm arg0, NG_MPI_Group arg1, int arg2, NG_MPI_Comm* arg3)->int { return MPI_Comm_create_group( ng2mpi(arg0), ng2mpi(arg1), ng2mpi(arg2), ng2mpi(arg3)); };
|
||||
NG_MPI_Comm_free = [](NG_MPI_Comm* arg0)->int { return MPI_Comm_free( ng2mpi(arg0)); };
|
||||
NG_MPI_Comm_group = [](NG_MPI_Comm arg0, NG_MPI_Group* arg1)->int { return MPI_Comm_group( ng2mpi(arg0), ng2mpi(arg1)); };
|
||||
NG_MPI_Comm_rank = [](NG_MPI_Comm arg0, int* arg1)->int { return MPI_Comm_rank( ng2mpi(arg0), ng2mpi(arg1)); };
|
||||
NG_MPI_Comm_size = [](NG_MPI_Comm arg0, int* arg1)->int { return MPI_Comm_size( ng2mpi(arg0), ng2mpi(arg1)); };
|
||||
NG_MPI_Type_commit = [](NG_MPI_Datatype* arg0)->int { return MPI_Type_commit( ng2mpi(arg0)); };
|
||||
NG_MPI_Waitall = [](int arg0, NG_MPI_Request* arg1, NG_MPI_Status* arg2)->int { return MPI_Waitall( ng2mpi(arg0), ng2mpi(arg1), ng2mpi(arg2)); };
|
||||
NG_MPI_Waitany = [](int arg0, NG_MPI_Request* arg1, int* arg2, NG_MPI_Status* arg3)->int { return MPI_Waitany( ng2mpi(arg0), ng2mpi(arg1), ng2mpi(arg2), ng2mpi(arg3)); };
|
||||
NG_MPI_Wait = [](NG_MPI_Request* arg0, NG_MPI_Status* arg1)->int { return MPI_Wait( ng2mpi(arg0), ng2mpi(arg1)); };
|
||||
NG_MPI_Send = [](void* arg0, int arg1, NG_MPI_Datatype arg2, int arg3, int arg4, NG_MPI_Comm arg5)->int { return MPI_Send( ng2mpi(arg0), ng2mpi(arg1), ng2mpi(arg2), ng2mpi(arg3), ng2mpi(arg4), ng2mpi(arg5)); };
|
||||
NG_MPI_Finalize = []()->int { return MPI_Finalize(); };
|
||||
NG_MPI_Gather = [](void* arg0, int arg1, NG_MPI_Datatype arg2, void* arg3, int arg4, NG_MPI_Datatype arg5, int arg6, NG_MPI_Comm arg7)->int { return MPI_Gather( ng2mpi(arg0), ng2mpi(arg1), ng2mpi(arg2), ng2mpi(arg3), ng2mpi(arg4), ng2mpi(arg5), ng2mpi(arg6), ng2mpi(arg7)); };
|
||||
NG_MPI_Get_count = [](NG_MPI_Status* arg0, NG_MPI_Datatype arg1, int* arg2)->int { return MPI_Get_count( ng2mpi(arg0), ng2mpi(arg1), ng2mpi(arg2)); };
|
||||
NG_MPI_Get_processor_name = [](char* arg0, int* arg1)->int { return MPI_Get_processor_name( ng2mpi(arg0), ng2mpi(arg1)); };
|
||||
NG_MPI_Group_incl = [](NG_MPI_Group arg0, int arg1, int* arg2, NG_MPI_Group* arg3)->int { return MPI_Group_incl( ng2mpi(arg0), ng2mpi(arg1), ng2mpi(arg2), ng2mpi(arg3)); };
|
||||
NG_MPI_Init = [](int* arg0, char*** arg1)->int { return MPI_Init( ng2mpi(arg0), ng2mpi(arg1)); };
|
||||
NG_MPI_Initialized = [](int* arg0)->int { return MPI_Initialized( ng2mpi(arg0)); };
|
||||
NG_MPI_Irecv = [](void* arg0, int arg1, NG_MPI_Datatype arg2, int arg3, int arg4, NG_MPI_Comm arg5, NG_MPI_Request* arg6)->int { return MPI_Irecv( ng2mpi(arg0), ng2mpi(arg1), ng2mpi(arg2), ng2mpi(arg3), ng2mpi(arg4), ng2mpi(arg5), ng2mpi(arg6)); };
|
||||
NG_MPI_Isend = [](void* arg0, int arg1, NG_MPI_Datatype arg2, int arg3, int arg4, NG_MPI_Comm arg5, NG_MPI_Request* arg6)->int { return MPI_Isend( ng2mpi(arg0), ng2mpi(arg1), ng2mpi(arg2), ng2mpi(arg3), ng2mpi(arg4), ng2mpi(arg5), ng2mpi(arg6)); };
|
||||
NG_MPI_Probe = [](int arg0, int arg1, NG_MPI_Comm arg2, NG_MPI_Status* arg3)->int { return MPI_Probe( ng2mpi(arg0), ng2mpi(arg1), ng2mpi(arg2), ng2mpi(arg3)); };
|
||||
NG_MPI_Recv = [](void* arg0, int arg1, NG_MPI_Datatype arg2, int arg3, int arg4, NG_MPI_Comm arg5, NG_MPI_Status* arg6)->int { return MPI_Recv( ng2mpi(arg0), ng2mpi(arg1), ng2mpi(arg2), ng2mpi(arg3), ng2mpi(arg4), ng2mpi(arg5), ng2mpi(arg6)); };
|
||||
NG_MPI_Get_count = [](NG_MPI_Status* arg0, NG_MPI_Datatype arg1, int* arg2)->int { return MPI_Get_count( ng2mpi(arg0), ng2mpi(arg1), ng2mpi(arg2)); };
|
||||
NG_MPI_Bcast = [](void* arg0, int arg1, NG_MPI_Datatype arg2, int arg3, NG_MPI_Comm arg4)->int { return MPI_Bcast( ng2mpi(arg0), ng2mpi(arg1), ng2mpi(arg2), ng2mpi(arg3), ng2mpi(arg4)); };
|
||||
NG_MPI_Comm_group = [](NG_MPI_Comm arg0, NG_MPI_Group* arg1)->int { return MPI_Comm_group( ng2mpi(arg0), ng2mpi(arg1)); };
|
||||
NG_MPI_Group_incl = [](NG_MPI_Group arg0, int arg1, int* arg2, NG_MPI_Group* arg3)->int { return MPI_Group_incl( ng2mpi(arg0), ng2mpi(arg1), ng2mpi(arg2), ng2mpi(arg3)); };
|
||||
NG_MPI_Comm_create_group = [](NG_MPI_Comm arg0, NG_MPI_Group arg1, int arg2, NG_MPI_Comm* arg3)->int { return MPI_Comm_create_group( ng2mpi(arg0), ng2mpi(arg1), ng2mpi(arg2), ng2mpi(arg3)); };
|
||||
NG_MPI_Get_processor_name = [](char* arg0, int* arg1)->int { return MPI_Get_processor_name( ng2mpi(arg0), ng2mpi(arg1)); };
|
||||
NG_MPI_Reduce_local = [](void* arg0, void* arg1, int arg2, NG_MPI_Datatype arg3, NG_MPI_Op arg4)->int { return MPI_Reduce_local( ng2mpi(arg0), ng2mpi(arg1), ng2mpi(arg2), ng2mpi(arg3), ng2mpi(arg4)); };
|
||||
NG_MPI_Request_free = [](NG_MPI_Request* arg0)->int { return MPI_Request_free( ng2mpi(arg0)); };
|
||||
NG_MPI_Scatter = [](void* arg0, int arg1, NG_MPI_Datatype arg2, void* arg3, int arg4, NG_MPI_Datatype arg5, int arg6, NG_MPI_Comm arg7)->int { return MPI_Scatter( ng2mpi(arg0), ng2mpi(arg1), ng2mpi(arg2), ng2mpi(arg3), ng2mpi(arg4), ng2mpi(arg5), ng2mpi(arg6), ng2mpi(arg7)); };
|
||||
NG_MPI_Send = [](void* arg0, int arg1, NG_MPI_Datatype arg2, int arg3, int arg4, NG_MPI_Comm arg5)->int { return MPI_Send( ng2mpi(arg0), ng2mpi(arg1), ng2mpi(arg2), ng2mpi(arg3), ng2mpi(arg4), ng2mpi(arg5)); };
|
||||
NG_MPI_Type_commit = [](NG_MPI_Datatype* arg0)->int { return MPI_Type_commit( ng2mpi(arg0)); };
|
||||
NG_MPI_Type_contiguous = [](int arg0, NG_MPI_Datatype arg1, NG_MPI_Datatype* arg2)->int { return MPI_Type_contiguous( ng2mpi(arg0), ng2mpi(arg1), ng2mpi(arg2)); };
|
||||
NG_MPI_Type_create_resized = [](NG_MPI_Datatype arg0, NG_MPI_Aint arg1, NG_MPI_Aint arg2, NG_MPI_Datatype* arg3)->int { return MPI_Type_create_resized( ng2mpi(arg0), ng2mpi(arg1), ng2mpi(arg2), ng2mpi(arg3)); };
|
||||
NG_MPI_Type_create_struct = [](int arg0, int* arg1, NG_MPI_Aint* arg2, NG_MPI_Datatype* arg3, NG_MPI_Datatype* arg4)->int { return MPI_Type_create_struct( ng2mpi(arg0), ng2mpi(arg1), ng2mpi(arg2), ng2mpi(arg3), ng2mpi(arg4)); };
|
||||
NG_MPI_Type_free = [](NG_MPI_Datatype* arg0)->int { return MPI_Type_free( ng2mpi(arg0)); };
|
||||
NG_MPI_Type_get_extent = [](NG_MPI_Datatype arg0, NG_MPI_Aint* arg1, NG_MPI_Aint* arg2)->int { return MPI_Type_get_extent( ng2mpi(arg0), ng2mpi(arg1), ng2mpi(arg2)); };
|
||||
NG_MPI_Type_indexed = [](int arg0, int* arg1, int* arg2, NG_MPI_Datatype arg3, NG_MPI_Datatype* arg4)->int { return MPI_Type_indexed( ng2mpi(arg0), ng2mpi(arg1), ng2mpi(arg2), ng2mpi(arg3), ng2mpi(arg4)); };
|
||||
NG_MPI_Wait = [](NG_MPI_Request* arg0, NG_MPI_Status* arg1)->int { return MPI_Wait( ng2mpi(arg0), ng2mpi(arg1)); };
|
||||
NG_MPI_Waitall = [](int arg0, NG_MPI_Request* arg1, NG_MPI_Status* arg2)->int { return MPI_Waitall( ng2mpi(arg0), ng2mpi(arg1), ng2mpi(arg2)); };
|
||||
NG_MPI_Waitany = [](int arg0, NG_MPI_Request* arg1, int* arg2, NG_MPI_Status* arg3)->int { return MPI_Waitany( ng2mpi(arg0), ng2mpi(arg1), ng2mpi(arg2), ng2mpi(arg3)); };
|
||||
NG_MPI_Reduce = [](void* arg0, void* arg1, int arg2, NG_MPI_Datatype arg3, NG_MPI_Op arg4, int arg5, NG_MPI_Comm arg6)->int { return MPI_Reduce( ng2mpi(arg0), ng2mpi(arg1), ng2mpi(arg2), ng2mpi(arg3), ng2mpi(arg4), ng2mpi(arg5), ng2mpi(arg6)); };
|
||||
NG_MPI_Iprobe = [](int arg0, int arg1, NG_MPI_Comm arg2, int* arg3, NG_MPI_Status* arg4)->int { return MPI_Iprobe( ng2mpi(arg0), ng2mpi(arg1), ng2mpi(arg2), ng2mpi(arg3), ng2mpi(arg4)); };
|
||||
NG_MPI_COMM_WORLD = mpi2ng(MPI_COMM_WORLD);
|
||||
NG_MPI_STATUS_IGNORE = mpi2ng(MPI_STATUS_IGNORE);
|
||||
NG_MPI_STATUSES_IGNORE = mpi2ng(MPI_STATUSES_IGNORE);
|
||||
@ -27,5 +45,15 @@ NG_MPI_CHAR = mpi2ng(MPI_CHAR);
|
||||
NG_MPI_UINT64_T = mpi2ng(MPI_UINT64_T);
|
||||
NG_MPI_DOUBLE = mpi2ng(MPI_DOUBLE);
|
||||
NG_MPI_C_BOOL = mpi2ng(MPI_C_BOOL);
|
||||
NG_MPI_DATATYPE_NULL = mpi2ng(MPI_DATATYPE_NULL);
|
||||
NG_MPI_CXX_DOUBLE_COMPLEX = mpi2ng(MPI_CXX_DOUBLE_COMPLEX);
|
||||
NG_MPI_IN_PLACE = mpi2ng(MPI_IN_PLACE);
|
||||
NG_MPI_MAX_PROCESSOR_NAME = mpi2ng(MPI_MAX_PROCESSOR_NAME);
|
||||
NG_MPI_ANY_SOURCE = mpi2ng(MPI_ANY_SOURCE);
|
||||
NG_MPI_ROOT = mpi2ng(MPI_ROOT);
|
||||
NG_MPI_PROC_NULL = mpi2ng(MPI_PROC_NULL);
|
||||
NG_MPI_ANY_TAG = mpi2ng(MPI_ANY_TAG);
|
||||
NG_MPI_MAX = mpi2ng(MPI_MAX);
|
||||
NG_MPI_MIN = mpi2ng(MPI_MIN);
|
||||
NG_MPI_SUM = mpi2ng(MPI_SUM);
|
||||
NG_MPI_LOR = mpi2ng(MPI_LOR);
|
||||
|
@ -2,8 +2,10 @@
|
||||
|
||||
#include <iostream>
|
||||
#include <stdexcept>
|
||||
#include <filesystem>
|
||||
|
||||
#include "ng_mpi.hpp"
|
||||
#include "ngstream.hpp"
|
||||
#include "utils.hpp"
|
||||
|
||||
using std::cout;
|
||||
@ -13,9 +15,9 @@ namespace ngcore {
|
||||
|
||||
static std::unique_ptr<SharedLibrary> mpi_lib, ng_mpi_lib;
|
||||
|
||||
void InitMPI() {
|
||||
void InitMPI(std::filesystem::path mpi_lib_path, std::filesystem::path ng_libs_dir) {
|
||||
if (ng_mpi_lib) return;
|
||||
cout << "InitMPI" << endl;
|
||||
cout << IM(3) << "InitMPI" << endl;
|
||||
|
||||
typedef void (*get_version_handle)(char *, int *);
|
||||
typedef int (*init_handle)(int *, char ***);
|
||||
@ -27,12 +29,13 @@ void InitMPI() {
|
||||
get_version_handle get_version;
|
||||
try {
|
||||
mpi_init = GetSymbol<init_handle>("MPI_Init");
|
||||
cout << "MPI already loaded " << mpi_init << endl;
|
||||
cout << IM(3) << "MPI already loaded " << mpi_init << endl;
|
||||
mpi_initialized = GetSymbol<mpi_initialized_handle>("MPI_Initialized");
|
||||
get_version = GetSymbol<get_version_handle>("MPI_Get_library_version");
|
||||
} catch (std::runtime_error &e) {
|
||||
cout << "MPI not loaded" << endl;
|
||||
mpi_lib = std::make_unique<SharedLibrary>("libmpi.so", std::nullopt, true);
|
||||
cout << IM(3) << "MPI not loaded" << endl;
|
||||
mpi_lib = std::make_unique<SharedLibrary>("/usr/lib/libmpi.so",
|
||||
std::nullopt, true);
|
||||
mpi_init = mpi_lib->GetSymbol<init_handle>("MPI_Init");
|
||||
mpi_initialized =
|
||||
mpi_lib->GetSymbol<mpi_initialized_handle>("MPI_Initialized");
|
||||
@ -43,7 +46,7 @@ void InitMPI() {
|
||||
int flag = 0;
|
||||
mpi_initialized(&flag);
|
||||
if (!flag) {
|
||||
cout << "Calling MPI_Init" << endl;
|
||||
cout << IM(3) << "Calling MPI_Init" << endl;
|
||||
mpi_init(nullptr, nullptr);
|
||||
}
|
||||
|
||||
@ -51,38 +54,34 @@ void InitMPI() {
|
||||
int resultlen = 0;
|
||||
get_version(version_string, &resultlen);
|
||||
mpi_library_version = version_string;
|
||||
cout << "MPI version: " << version_string << endl;
|
||||
cout << IM(3) << "MPI version: " << version_string << endl;
|
||||
|
||||
std::string libname = "";
|
||||
if (mpi_library_version.substr(0, 8) == "Open MPI") {
|
||||
cout << "Have Open MPI" << endl;
|
||||
cout << IM(3) << "Have Open MPI" << endl;
|
||||
libname = "/opt/netgen/lib/libng_openmpi.so";
|
||||
} else if (mpi_library_version.substr(0, 5) == "MPICH") {
|
||||
cout << "Have MPICH" << endl;
|
||||
cout << IM(3) << "Have MPICH" << endl;
|
||||
libname = "/opt/netgen/lib/libng_mpich.so";
|
||||
} else
|
||||
cout << "Unknown MPI" << endl;
|
||||
cout << IM(3) << "Unknown MPI" << endl;
|
||||
|
||||
if (libname.size()) {
|
||||
cout << "loading " << libname << endl;
|
||||
cout << "NG_MPI_INT before " << NG_MPI_INT.value << endl;
|
||||
cout << IM(3) << "loading " << libname << endl;
|
||||
cout << IM(3) << "NG_MPI_INT before " << NG_MPI_INT.value << endl;
|
||||
ng_mpi_lib = std::make_unique<SharedLibrary>(libname);
|
||||
auto ng_init = ng_mpi_lib->GetSymbol<ng_init_handle>("ng_init_mpi");
|
||||
cout << "have ng_init " << ng_init << endl;
|
||||
cout << IM(3) << "have ng_init " << ng_init << endl;
|
||||
ng_init();
|
||||
cout << "NG_MPI_INT after " << NG_MPI_INT.value << endl;
|
||||
cout << IM(3) << "NG_MPI_INT after " << NG_MPI_INT.value << endl;
|
||||
|
||||
int size, rank;
|
||||
NG_MPI_Comm_size(NG_MPI_COMM_WORLD, &size);
|
||||
NG_MPI_Comm_rank(NG_MPI_COMM_WORLD, &rank);
|
||||
cout << IM(3) << "Hello from " << rank << " of " << size << endl;
|
||||
}
|
||||
}
|
||||
|
||||
// NG_MPI_Comm NG_MPI_COMM_WORLD = 0;
|
||||
|
||||
// NG_MPI_Datatype NG_MPI_INT = 0;
|
||||
// NG_MPI_Datatype NG_MPI_SHORT = 0;
|
||||
// NG_MPI_Datatype NG_MPI_CHAR = 0;
|
||||
// NG_MPI_Datatype NG_MPI_UINT64_T = 0;
|
||||
// NG_MPI_Datatype NG_MPI_DOUBLE = 0;
|
||||
// NG_MPI_Datatype NG_MPI_C_BOOL = 0;
|
||||
|
||||
static std::runtime_error no_mpi() {
|
||||
return std::runtime_error("MPI not enabled");
|
||||
}
|
||||
|
@ -10,7 +10,7 @@
|
||||
#include "hashtable.hpp"
|
||||
#include "localheap.hpp"
|
||||
#include "logging.hpp"
|
||||
#include "mpi_wrapper.hpp"
|
||||
// #include "mpi_wrapper.hpp"
|
||||
#include "profiler.hpp"
|
||||
#include "signal.hpp"
|
||||
#include "simd.hpp"
|
||||
|
@ -1,6 +1,8 @@
|
||||
#ifndef NETGEN_CORE_NGCORE_API_HPP
|
||||
#define NETGEN_CORE_NGCORE_API_HPP
|
||||
|
||||
#include "netgen_config.hpp"
|
||||
|
||||
#ifdef WIN32
|
||||
|
||||
// This function or variable may be unsafe. Consider using _ftime64_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
|
||||
|
@ -361,12 +361,7 @@ namespace ngcore
|
||||
{
|
||||
std::filesystem::path lib_name;
|
||||
std::optional<std::filesystem::path> directory_to_delete = std::nullopt;
|
||||
|
||||
// #ifdef WIN32
|
||||
// HINSTANCE lib = nullptr;
|
||||
// #else // WIN32
|
||||
void *lib = nullptr;
|
||||
// #endif // WIN32
|
||||
|
||||
public:
|
||||
SharedLibrary() = default;
|
||||
@ -383,7 +378,7 @@ namespace ngcore
|
||||
return reinterpret_cast<TFunc>(GetRawSymbol(func_name));
|
||||
}
|
||||
|
||||
void Load( const std::filesystem::path & lib_name_, bool global);
|
||||
void Load( const std::filesystem::path & lib_name_, bool global = true);
|
||||
void Unload();
|
||||
void* GetRawSymbol( std::string func_name );
|
||||
};
|
||||
|
@ -1,54 +0,0 @@
|
||||
/**************************************************************************/
|
||||
/* File: mpi_interface.cpp */
|
||||
/* Author: Joachim Schoeberl */
|
||||
/* Date: 04. Apr. 97 */
|
||||
/**************************************************************************/
|
||||
|
||||
#ifdef OLD
|
||||
#include <mystdlib.h>
|
||||
#include <myadt.hpp>
|
||||
|
||||
|
||||
namespace netgen
|
||||
{
|
||||
|
||||
|
||||
#ifdef PARALLEL
|
||||
|
||||
void MyMPI_SendCmd (const char * cmd)
|
||||
{
|
||||
int ntasks;
|
||||
MPI_Comm_size(MPI_COMM_WORLD, &ntasks);
|
||||
|
||||
if(ntasks==1)
|
||||
return;
|
||||
|
||||
for (int dest = 1; dest < ntasks; dest++)
|
||||
MPI_Send( (void*)cmd, (strlen(cmd)+1), MPI_CHAR, dest, MPI_TAG_CMD, MPI_COMM_WORLD);
|
||||
}
|
||||
|
||||
string MyMPI_RecvCmd ()
|
||||
{
|
||||
MPI_Status status;
|
||||
int flag;
|
||||
int size_of_msg = -1;
|
||||
|
||||
MPI_Probe(0, MPI_TAG_CMD, MPI_COMM_WORLD, &status);
|
||||
MPI_Get_count(&status, MPI_CHAR, &size_of_msg);
|
||||
|
||||
//char* buf = (char*)malloc(size_of_msg*sizeof(char));
|
||||
char buf[100000]; //1MB should be enough...
|
||||
|
||||
MPI_Recv( &buf, size_of_msg, MPI_CHAR, 0, MPI_TAG_CMD, MPI_COMM_WORLD, &status);
|
||||
|
||||
return string(buf);
|
||||
}
|
||||
|
||||
// #else
|
||||
// MPI_Comm MPI_COMM_WORLD, MPI_COMM_NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endif
|
@ -1,336 +0,0 @@
|
||||
braucht keiner mehr
|
||||
|
||||
|
||||
#ifdef XXXXXX
|
||||
|
||||
#ifndef FILE_PARALLEL
|
||||
#define FILE_PARALLEL
|
||||
|
||||
|
||||
#ifdef VTRACE
|
||||
#include "vt_user.h"
|
||||
#else
|
||||
#define VT_USER_START(n)
|
||||
#define VT_USER_END(n)
|
||||
#define VT_TRACER(n)
|
||||
#endif
|
||||
|
||||
|
||||
namespace netgen
|
||||
{
|
||||
|
||||
#ifdef OLD
|
||||
#ifdef PARALLEL
|
||||
template <class T>
|
||||
inline MPI_Datatype MyGetMPIType ( )
|
||||
{ cerr << "ERROR in GetMPIType() -- no type found" << endl;return 0; }
|
||||
template <>
|
||||
inline MPI_Datatype MyGetMPIType<int> ( )
|
||||
{ return MPI_INT; }
|
||||
template <>
|
||||
inline MPI_Datatype MyGetMPIType<double> ( )
|
||||
{ return MPI_DOUBLE; }
|
||||
template <>
|
||||
inline MPI_Datatype MyGetMPIType<char> ( )
|
||||
{ return MPI_CHAR; }
|
||||
template<>
|
||||
inline MPI_Datatype MyGetMPIType<size_t> ( )
|
||||
{ return MPI_UINT64_T; }
|
||||
#else
|
||||
typedef int MPI_Datatype;
|
||||
template <class T> inline MPI_Datatype MyGetMPIType ( ) { return 0; }
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
enum { MPI_TAG_CMD = 110 };
|
||||
enum { MPI_TAG_MESH = 210 };
|
||||
enum { MPI_TAG_VIS = 310 };
|
||||
|
||||
#ifdef PARALLEL
|
||||
|
||||
[[deprecated("mympi_send int, use comm.Send instead")]]
|
||||
inline void MyMPI_Send (int i, int dest, int tag, MPI_Comm comm)
|
||||
{
|
||||
int hi = i;
|
||||
MPI_Send( &hi, 1, MPI_INT, dest, tag, comm);
|
||||
}
|
||||
|
||||
[[deprecated("mympi_revc int, use comm.Recv instead")]]
|
||||
inline void MyMPI_Recv (int & i, int src, int tag, MPI_Comm comm)
|
||||
{
|
||||
MPI_Status status;
|
||||
MPI_Recv( &i, 1, MPI_INT, src, tag, comm, &status);
|
||||
}
|
||||
|
||||
[[deprecated("mympi_send string, use comm.Send instead")]]
|
||||
inline void MyMPI_Send (const string & s, int dest, int tag, MPI_Comm comm)
|
||||
{
|
||||
MPI_Send( const_cast<char*> (s.c_str()), s.length(), MPI_CHAR, dest, tag, comm);
|
||||
}
|
||||
|
||||
[[deprecated("mympi_revc string, use comm.Recv instead")]]
|
||||
inline void MyMPI_Recv (string & s, int src, int tag, MPI_Comm comm)
|
||||
{
|
||||
MPI_Status status;
|
||||
int len;
|
||||
MPI_Probe (src, tag, MPI_COMM_WORLD, &status);
|
||||
MPI_Get_count (&status, MPI_CHAR, &len);
|
||||
s.assign (len, ' ');
|
||||
MPI_Recv( &s[0], len, MPI_CHAR, src, tag, comm, &status);
|
||||
}
|
||||
|
||||
|
||||
|
||||
template <class T, int BASE>
|
||||
[[deprecated("mympi_send ngflatarray, use comm.send instead")]]
|
||||
inline void MyMPI_Send (NgFlatArray<T, BASE> s, int dest, int tag, MPI_Comm comm)
|
||||
{
|
||||
MPI_Send( &s.First(), s.Size(), GetMPIType<T>(), dest, tag, comm);
|
||||
}
|
||||
|
||||
template <class T, int BASE>
|
||||
[[deprecated("mympi_recv ngflatarray, use comm.Recv instead")]]
|
||||
inline void MyMPI_Recv ( NgFlatArray<T, BASE> s, int src, int tag, MPI_Comm comm)
|
||||
{
|
||||
MPI_Status status;
|
||||
MPI_Recv( &s.First(), s.Size(), GetMPIType<T>(), src, tag, comm, &status);
|
||||
}
|
||||
|
||||
template <class T, int BASE>
|
||||
[[deprecated("use ngcore - Array instead")]]
|
||||
inline void MyMPI_Recv ( NgArray <T, BASE> & s, int src, int tag, MPI_Comm comm)
|
||||
{
|
||||
MPI_Status status;
|
||||
int len;
|
||||
MPI_Probe (src, tag, comm, &status);
|
||||
MPI_Get_count (&status, GetMPIType<T>(), &len);
|
||||
|
||||
s.SetSize (len);
|
||||
MPI_Recv( &s.First(), len, GetMPIType<T>(), src, tag, comm, &status);
|
||||
}
|
||||
|
||||
template <class T, int BASE>
|
||||
[[deprecated("use ngcore - Array instead")]]
|
||||
inline int MyMPI_Recv ( NgArray <T, BASE> & s, int tag, MPI_Comm comm)
|
||||
{
|
||||
MPI_Status status;
|
||||
int len;
|
||||
MPI_Probe (MPI_ANY_SOURCE, tag, comm, &status);
|
||||
|
||||
int src = status.MPI_SOURCE;
|
||||
|
||||
MPI_Get_count (&status, GetMPIType<T>(), &len);
|
||||
|
||||
s.SetSize (len);
|
||||
MPI_Recv( &s.First(), len, GetMPIType<T>(), src, tag, comm, &status);
|
||||
|
||||
return src;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
template <class T, int BASE>
|
||||
inline void MyMPI_ISend (NgFlatArray<T, BASE> s, int dest, int tag, MPI_Request & request)
|
||||
{
|
||||
MPI_Isend( &s.First(), s.Size(), MyGetMPIType<T>(), dest, tag, MPI_COMM_WORLD, & request);
|
||||
}
|
||||
|
||||
|
||||
template <class T, int BASE>
|
||||
inline void MyMPI_IRecv (NgFlatArray<T, BASE> s, int dest, int tag, MPI_Request & request)
|
||||
{
|
||||
MPI_Irecv( &s.First(), s.Size(), MyGetMPIType<T>(), dest, tag, MPI_COMM_WORLD, & request);
|
||||
}
|
||||
*/
|
||||
|
||||
template <class T, int BASE>
|
||||
[[deprecated("mympi_isend ngflatarray, use comm.send instead")]]
|
||||
[[deprecated("use ngcore - Array instead")]]
|
||||
inline MPI_Request MyMPI_ISend (NgFlatArray<T, BASE> s, int dest, int tag, MPI_Comm comm)
|
||||
{
|
||||
MPI_Request request;
|
||||
MPI_Isend( &s.First(), s.Size(), GetMPIType<T>(), dest, tag, comm, &request);
|
||||
return request;
|
||||
}
|
||||
|
||||
template <class T, int BASE>
|
||||
[[deprecated("mympi_irecv ngflatarray, use comm.recv instead")]]
|
||||
inline MPI_Request MyMPI_IRecv (NgFlatArray<T, BASE> s, int dest, int tag, MPI_Comm comm)
|
||||
{
|
||||
MPI_Request request;
|
||||
MPI_Irecv( &s.First(), s.Size(), GetMPIType<T>(), dest, tag, comm, &request);
|
||||
return request;
|
||||
}
|
||||
|
||||
/*
|
||||
template <class T, int BASE>
|
||||
inline void MyMPI_ISend (NgFlatArray<T, BASE> s, int dest, int tag)
|
||||
{
|
||||
MPI_Request request;
|
||||
MPI_Isend( &s.First(), s.Size(), MyGetMPIType<T>(), dest, tag, MPI_COMM_WORLD, &request);
|
||||
MPI_Request_free (&request);
|
||||
}
|
||||
|
||||
|
||||
template <class T, int BASE>
|
||||
inline void MyMPI_IRecv (NgFlatArray<T, BASE> s, int dest, int tag)
|
||||
{
|
||||
MPI_Request request;
|
||||
MPI_Irecv( &s.First(), s.Size(), MyGetMPIType<T>(), dest, tag, MPI_COMM_WORLD, &request);
|
||||
MPI_Request_free (&request);
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*
|
||||
send a table entry to each of the processes in the group ...
|
||||
receive-table entries will be set
|
||||
*/
|
||||
|
||||
template <typename T>
|
||||
[[deprecated("do we need that ? ")]]
|
||||
inline void MyMPI_ExchangeTable (TABLE<T> & send_data,
|
||||
TABLE<T> & recv_data, int tag,
|
||||
const NgMPI_Comm & comm)
|
||||
{
|
||||
int rank = comm.Rank();
|
||||
int ntasks = comm.Size();
|
||||
|
||||
Array<int> send_sizes(ntasks);
|
||||
Array<int> recv_sizes(ntasks);
|
||||
for (int i = 0; i < ntasks; i++)
|
||||
send_sizes[i] = send_data[i].Size();
|
||||
|
||||
comm.AllToAll (send_sizes, recv_sizes);
|
||||
|
||||
for (int i = 0; i < ntasks; i++)
|
||||
recv_data.SetEntrySize (i, recv_sizes[i], sizeof(T));
|
||||
|
||||
Array<MPI_Request> requests;
|
||||
for (int dest = 0; dest < ntasks; dest++)
|
||||
if (dest != rank && send_data[dest].Size())
|
||||
requests.Append (comm.ISend (FlatArray<T>(send_data[dest]), dest, tag));
|
||||
|
||||
for (int dest = 0; dest < ntasks; dest++)
|
||||
if (dest != rank && recv_data[dest].Size())
|
||||
requests.Append (comm.IRecv (FlatArray<T>(recv_data[dest]), dest, tag));
|
||||
|
||||
MyMPI_WaitAll (requests);
|
||||
}
|
||||
|
||||
|
||||
template <typename T>
|
||||
[[deprecated("do we need that ? ")]]
|
||||
inline void MyMPI_ExchangeTable (DynamicTable<T> & send_data,
|
||||
DynamicTable<T> & recv_data, int tag,
|
||||
const NgMPI_Comm & comm)
|
||||
{
|
||||
int rank = comm.Rank();
|
||||
int ntasks = comm.Size();
|
||||
|
||||
Array<int> send_sizes(ntasks);
|
||||
Array<int> recv_sizes(ntasks);
|
||||
for (int i = 0; i < ntasks; i++)
|
||||
send_sizes[i] = send_data[i].Size();
|
||||
|
||||
comm.AllToAll (send_sizes, recv_sizes);
|
||||
|
||||
// for (int i = 0; i < ntasks; i++)
|
||||
// recv_data.SetEntrySize (i, recv_sizes[i], sizeof(T));
|
||||
recv_data = DynamicTable<T> (recv_sizes, true);
|
||||
|
||||
Array<MPI_Request> requests;
|
||||
for (int dest = 0; dest < ntasks; dest++)
|
||||
if (dest != rank && send_data[dest].Size())
|
||||
requests.Append (comm.ISend (FlatArray<T>(send_data[dest]), dest, tag));
|
||||
|
||||
for (int dest = 0; dest < ntasks; dest++)
|
||||
if (dest != rank && recv_data[dest].Size())
|
||||
requests.Append (comm.IRecv (FlatArray<T>(recv_data[dest]), dest, tag));
|
||||
|
||||
MyMPI_WaitAll (requests);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
[[deprecated("do we still send commands?")]]
|
||||
DLL_HEADER void MyMPI_SendCmd (const char * cmd);
|
||||
[[deprecated("do we still send commands?")]]
|
||||
extern string MyMPI_RecvCmd ();
|
||||
|
||||
|
||||
template <class T>
|
||||
[[deprecated("use comm.BCast instead")]]
|
||||
inline void MyMPI_Bcast (T & s, MPI_Comm comm)
|
||||
{
|
||||
MPI_Bcast (&s, 1, GetMPIType<T>(), 0, comm);
|
||||
}
|
||||
|
||||
template <class T>
|
||||
[[deprecated("use comm.BCast instead")]]
|
||||
inline void MyMPI_Bcast (NgArray<T, 0> & s, NgMPI_Comm comm)
|
||||
{
|
||||
int size = s.Size();
|
||||
// MyMPI_Bcast (size, comm);
|
||||
comm.Bcast(size);
|
||||
// if (MyMPI_GetId(comm) != 0) s.SetSize (size);
|
||||
if (comm.Rank() != 0) s.SetSize (size);
|
||||
MPI_Bcast (&s[0], size, GetMPIType<T>(), 0, comm);
|
||||
}
|
||||
|
||||
template <class T>
|
||||
[[deprecated("use comm.BCast instead")]]
|
||||
inline void MyMPI_Bcast (NgArray<T, 0> & s, int root, MPI_Comm comm)
|
||||
{
|
||||
int id;
|
||||
MPI_Comm_rank(comm, &id);
|
||||
|
||||
int size = s.Size();
|
||||
MPI_Bcast (&size, 1, MPI_INT, root, comm);
|
||||
if (id != root) s.SetSize (size);
|
||||
if ( !size ) return;
|
||||
MPI_Bcast (&s[0], size, GetMPIType<T>(), root, comm);
|
||||
}
|
||||
|
||||
template <class T, class T2>
|
||||
[[deprecated("mympi_allgather deprecated, use comm.allgather")]]
|
||||
inline void MyMPI_Allgather (const T & send, NgFlatArray<T2> recv, MPI_Comm comm)
|
||||
{
|
||||
MPI_Allgather( const_cast<T*> (&send), 1, GetMPIType<T>(), &recv[0], 1, GetMPIType<T2>(), comm);
|
||||
}
|
||||
|
||||
template <class T, class T2>
|
||||
[[deprecated("mympi_alltoall deprecated, use comm.alltoall")]]
|
||||
inline void MyMPI_Alltoall (NgFlatArray<T> send, NgFlatArray<T2> recv, MPI_Comm comm)
|
||||
{
|
||||
MPI_Alltoall( &send[0], 1, GetMPIType<T>(), &recv[0], 1, GetMPIType<T2>(), comm);
|
||||
}
|
||||
|
||||
|
||||
#else
|
||||
template <typename T>
|
||||
[[deprecated("do we need that ? ")]]
|
||||
inline void MyMPI_ExchangeTable (TABLE<T> & send_data,
|
||||
TABLE<T> & recv_data, int tag,
|
||||
const NgMPI_Comm & comm)
|
||||
{
|
||||
;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
[[deprecated("do we need that ? ")]]
|
||||
inline void MyMPI_ExchangeTable (DynamicTable<T> & send_data,
|
||||
DynamicTable<T> & recv_data, int tag,
|
||||
const NgMPI_Comm & comm)
|
||||
{ ; }
|
||||
#endif // PARALLEL
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#endif
|
@ -9,6 +9,7 @@
|
||||
/**************************************************************************/
|
||||
|
||||
#include "mydefs.hpp"
|
||||
#include <core/mpi_wrapper.hpp>
|
||||
|
||||
/*
|
||||
C++ interface to Netgen
|
||||
|
@ -561,7 +561,7 @@ namespace netgen
|
||||
|
||||
auto comm = mesh.GetCommunicator();
|
||||
#ifdef PARALLEL
|
||||
enum { MPI_TAG_CURVE = MPI_TAG_MESH+20 };
|
||||
enum { NG_MPI_TAG_CURVE = NG_MPI_TAG_MESH+20 };
|
||||
const ParallelMeshTopology & partop = mesh.GetParallelTopology ();
|
||||
#endif
|
||||
int ntasks = comm.Size();
|
||||
@ -654,8 +654,8 @@ namespace netgen
|
||||
}
|
||||
|
||||
if (ntasks > 1)
|
||||
// MyMPI_ExchangeTable (send_orders, recv_orders, MPI_TAG_CURVE, comm);
|
||||
comm.ExchangeTable (send_orders, recv_orders, MPI_TAG_CURVE);
|
||||
// MyMPI_ExchangeTable (send_orders, recv_orders, NG_MPI_TAG_CURVE, comm);
|
||||
comm.ExchangeTable (send_orders, recv_orders, NG_MPI_TAG_CURVE);
|
||||
|
||||
if (ntasks > 1 && working)
|
||||
{
|
||||
@ -770,8 +770,8 @@ namespace netgen
|
||||
}
|
||||
}
|
||||
|
||||
// MyMPI_ExchangeTable (senddata, recvdata, MPI_TAG_CURVE, comm);
|
||||
comm.ExchangeTable (senddata, recvdata, MPI_TAG_CURVE);
|
||||
// MyMPI_ExchangeTable (senddata, recvdata, NG_MPI_TAG_CURVE, comm);
|
||||
comm.ExchangeTable (senddata, recvdata, NG_MPI_TAG_CURVE);
|
||||
|
||||
NgArray<int> cnt(ntasks);
|
||||
cnt = 0;
|
||||
@ -976,8 +976,8 @@ namespace netgen
|
||||
}
|
||||
}
|
||||
|
||||
// MyMPI_ExchangeTable (senddata, recvdata, MPI_TAG_CURVE, comm);
|
||||
comm.ExchangeTable (senddata, recvdata, MPI_TAG_CURVE);
|
||||
// MyMPI_ExchangeTable (senddata, recvdata, NG_MPI_TAG_CURVE, comm);
|
||||
comm.ExchangeTable (senddata, recvdata, NG_MPI_TAG_CURVE);
|
||||
|
||||
NgArray<int> cnt(ntasks);
|
||||
cnt = 0;
|
||||
@ -1166,8 +1166,8 @@ namespace netgen
|
||||
}
|
||||
|
||||
if (ntasks > 1)
|
||||
// MyMPI_ExchangeTable (send_surfnr, recv_surfnr, MPI_TAG_CURVE, comm);
|
||||
comm.ExchangeTable (send_surfnr, recv_surfnr, MPI_TAG_CURVE);
|
||||
// MyMPI_ExchangeTable (send_surfnr, recv_surfnr, NG_MPI_TAG_CURVE, comm);
|
||||
comm.ExchangeTable (send_surfnr, recv_surfnr, NG_MPI_TAG_CURVE);
|
||||
|
||||
if (ntasks > 1 && working)
|
||||
{
|
||||
|
@ -1710,7 +1710,7 @@ namespace netgen
|
||||
maxglob = max(globnum[pi], maxglob);
|
||||
}
|
||||
|
||||
maxglob = comm.AllReduce (maxglob, MPI_MAX);
|
||||
maxglob = comm.AllReduce (maxglob, NG_MPI_MAX);
|
||||
int numglob = maxglob+1-PointIndex::BASE;
|
||||
if (comm.Rank() > 0)
|
||||
{
|
||||
|
@ -25,7 +25,7 @@ namespace netgen
|
||||
class NetgenGeometry;
|
||||
using namespace std;
|
||||
|
||||
static constexpr int MPI_TAG_MESH = 210;
|
||||
static constexpr int NG_MPI_TAG_MESH = 210;
|
||||
|
||||
|
||||
enum resthtype { RESTRICTH_FACE, RESTRICTH_EDGE,
|
||||
|
@ -18,125 +18,125 @@ namespace netgen
|
||||
|
||||
|
||||
#ifdef PARALLEL
|
||||
MPI_Datatype MeshPoint :: MyGetMPIType ( )
|
||||
NG_MPI_Datatype MeshPoint :: MyGetMPIType ( )
|
||||
{
|
||||
static MPI_Datatype type = MPI_DATATYPE_NULL;
|
||||
static MPI_Datatype htype = MPI_DATATYPE_NULL;
|
||||
if (type == MPI_DATATYPE_NULL)
|
||||
static NG_MPI_Datatype type = NG_MPI_DATATYPE_NULL;
|
||||
static NG_MPI_Datatype htype = NG_MPI_DATATYPE_NULL;
|
||||
if (type == NG_MPI_DATATYPE_NULL)
|
||||
{
|
||||
MeshPoint hp;
|
||||
int blocklen[] = { 3, 1, 1 };
|
||||
MPI_Aint displ[] = { (char*)&hp.x[0] - (char*)&hp,
|
||||
NG_MPI_Aint displ[] = { (char*)&hp.x[0] - (char*)&hp,
|
||||
(char*)&hp.layer - (char*)&hp,
|
||||
(char*)&hp.singular - (char*)&hp };
|
||||
MPI_Datatype types[] = { MPI_DOUBLE, MPI_INT, MPI_DOUBLE };
|
||||
NG_MPI_Datatype types[] = { NG_MPI_DOUBLE, NG_MPI_INT, NG_MPI_DOUBLE };
|
||||
// *testout << "displ = " << displ[0] << ", " << displ[1] << ", " << displ[2] << endl;
|
||||
// *testout << "sizeof = " << sizeof (MeshPoint) << endl;
|
||||
MPI_Type_create_struct (3, blocklen, displ, types, &htype);
|
||||
MPI_Type_commit ( &htype );
|
||||
MPI_Aint lb, ext;
|
||||
MPI_Type_get_extent (htype, &lb, &ext);
|
||||
NG_MPI_Type_create_struct (3, blocklen, displ, types, &htype);
|
||||
NG_MPI_Type_commit ( &htype );
|
||||
NG_MPI_Aint lb, ext;
|
||||
NG_MPI_Type_get_extent (htype, &lb, &ext);
|
||||
// *testout << "lb = " << lb << endl;
|
||||
// *testout << "ext = " << ext << endl;
|
||||
ext = sizeof (MeshPoint);
|
||||
MPI_Type_create_resized (htype, lb, ext, &type);
|
||||
MPI_Type_commit ( &type );
|
||||
NG_MPI_Type_create_resized (htype, lb, ext, &type);
|
||||
NG_MPI_Type_commit ( &type );
|
||||
|
||||
}
|
||||
return type;
|
||||
}
|
||||
|
||||
|
||||
MPI_Datatype Element2d :: MyGetMPIType ( )
|
||||
NG_MPI_Datatype Element2d :: MyGetMPIType ( )
|
||||
{
|
||||
static MPI_Datatype type = MPI_DATATYPE_NULL;
|
||||
static MPI_Datatype htype = MPI_DATATYPE_NULL;
|
||||
if (type == MPI_DATATYPE_NULL)
|
||||
static NG_MPI_Datatype type = NG_MPI_DATATYPE_NULL;
|
||||
static NG_MPI_Datatype htype = NG_MPI_DATATYPE_NULL;
|
||||
if (type == NG_MPI_DATATYPE_NULL)
|
||||
{
|
||||
Element2d hel;
|
||||
int blocklen[] = { ELEMENT2D_MAXPOINTS, 1, 1, 1 };
|
||||
MPI_Aint displ[] =
|
||||
NG_MPI_Aint displ[] =
|
||||
{ (char*)&hel.pnum[0] - (char*)&hel,
|
||||
(char*)&hel.index - (char*)&hel,
|
||||
(char*)&hel.typ - (char*)&hel,
|
||||
(char*)&hel.np - (char*)&hel
|
||||
};
|
||||
MPI_Datatype types[] = { GetMPIType<PointIndex>(), GetMPIType(hel.index),
|
||||
NG_MPI_Datatype types[] = { GetMPIType<PointIndex>(), GetMPIType(hel.index),
|
||||
GetMPIType(hel.typ), GetMPIType(hel.np) };
|
||||
// *testout << "displ = " << displ[0] << ", " << displ[1] << ", " << displ[2] << endl;
|
||||
// *testout << "sizeof = " << sizeof (MeshPoint) << endl;
|
||||
MPI_Type_create_struct (4, blocklen, displ, types, &htype);
|
||||
MPI_Type_commit ( &htype );
|
||||
MPI_Aint lb, ext;
|
||||
MPI_Type_get_extent (htype, &lb, &ext);
|
||||
NG_MPI_Type_create_struct (4, blocklen, displ, types, &htype);
|
||||
NG_MPI_Type_commit ( &htype );
|
||||
NG_MPI_Aint lb, ext;
|
||||
NG_MPI_Type_get_extent (htype, &lb, &ext);
|
||||
// *testout << "lb = " << lb << endl;
|
||||
// *testout << "ext = " << ext << endl;
|
||||
ext = sizeof (Element2d);
|
||||
MPI_Type_create_resized (htype, lb, ext, &type);
|
||||
MPI_Type_commit ( &type );
|
||||
NG_MPI_Type_create_resized (htype, lb, ext, &type);
|
||||
NG_MPI_Type_commit ( &type );
|
||||
}
|
||||
return type;
|
||||
}
|
||||
|
||||
MPI_Datatype Element :: MyGetMPIType ( )
|
||||
NG_MPI_Datatype Element :: MyGetMPIType ( )
|
||||
{
|
||||
static MPI_Datatype type = MPI_DATATYPE_NULL;
|
||||
static MPI_Datatype htype = MPI_DATATYPE_NULL;
|
||||
if (type == MPI_DATATYPE_NULL)
|
||||
static NG_MPI_Datatype type = NG_MPI_DATATYPE_NULL;
|
||||
static NG_MPI_Datatype htype = NG_MPI_DATATYPE_NULL;
|
||||
if (type == NG_MPI_DATATYPE_NULL)
|
||||
{
|
||||
Element hel;
|
||||
int blocklen[] = { ELEMENT_MAXPOINTS, 1, 1, 1 };
|
||||
MPI_Aint displ[] =
|
||||
NG_MPI_Aint displ[] =
|
||||
{ (char*)&hel.pnum[0] - (char*)&hel,
|
||||
(char*)&hel.index - (char*)&hel,
|
||||
(char*)&hel.typ - (char*)&hel,
|
||||
(char*)&hel.np - (char*)&hel
|
||||
};
|
||||
MPI_Datatype types[] = { GetMPIType<PointIndex>(), GetMPIType(hel.index),
|
||||
NG_MPI_Datatype types[] = { GetMPIType<PointIndex>(), GetMPIType(hel.index),
|
||||
GetMPIType(hel.typ), GetMPIType(hel.np) };
|
||||
// *testout << "displ = " << displ[0] << ", " << displ[1] << ", " << displ[2] << endl;
|
||||
// *testout << "sizeof = " << sizeof (MeshPoint) << endl;
|
||||
MPI_Type_create_struct (4, blocklen, displ, types, &htype);
|
||||
MPI_Type_commit ( &htype );
|
||||
MPI_Aint lb, ext;
|
||||
MPI_Type_get_extent (htype, &lb, &ext);
|
||||
NG_MPI_Type_create_struct (4, blocklen, displ, types, &htype);
|
||||
NG_MPI_Type_commit ( &htype );
|
||||
NG_MPI_Aint lb, ext;
|
||||
NG_MPI_Type_get_extent (htype, &lb, &ext);
|
||||
// *testout << "lb = " << lb << endl;
|
||||
// *testout << "ext = " << ext << endl;
|
||||
ext = sizeof (Element);
|
||||
MPI_Type_create_resized (htype, lb, ext, &type);
|
||||
MPI_Type_commit ( &type );
|
||||
NG_MPI_Type_create_resized (htype, lb, ext, &type);
|
||||
NG_MPI_Type_commit ( &type );
|
||||
}
|
||||
return type;
|
||||
}
|
||||
|
||||
MPI_Datatype Segment :: MyGetMPIType ( )
|
||||
NG_MPI_Datatype Segment :: MyGetMPIType ( )
|
||||
{
|
||||
static MPI_Datatype type = MPI_DATATYPE_NULL;
|
||||
static MPI_Datatype htype = MPI_DATATYPE_NULL;
|
||||
if (type == MPI_DATATYPE_NULL)
|
||||
static NG_MPI_Datatype type = NG_MPI_DATATYPE_NULL;
|
||||
static NG_MPI_Datatype htype = NG_MPI_DATATYPE_NULL;
|
||||
if (type == NG_MPI_DATATYPE_NULL)
|
||||
{
|
||||
Segment hel;
|
||||
int blocklen[] = { 3, 1, 1, 1 };
|
||||
MPI_Aint displ[] =
|
||||
NG_MPI_Aint displ[] =
|
||||
{ (char*)&hel.pnums[0] - (char*)&hel,
|
||||
(char*)&hel.edgenr - (char*)&hel,
|
||||
(char*)&hel.cd2i - (char*)&hel,
|
||||
(char*)&hel.si - (char*)&hel
|
||||
};
|
||||
MPI_Datatype types[] = {
|
||||
NG_MPI_Datatype types[] = {
|
||||
GetMPIType<PointIndex>(), GetMPIType(hel.edgenr), GetMPIType(hel.cd2i), GetMPIType(hel.si)
|
||||
};
|
||||
// *testout << "displ = " << displ[0] << ", " << displ[1] << ", " << displ[2] << endl;
|
||||
// *testout << "sizeof = " << sizeof (MeshPoint) << endl;
|
||||
MPI_Type_create_struct (4, blocklen, displ, types, &htype);
|
||||
MPI_Type_commit ( &htype );
|
||||
MPI_Aint lb, ext;
|
||||
MPI_Type_get_extent (htype, &lb, &ext);
|
||||
NG_MPI_Type_create_struct (4, blocklen, displ, types, &htype);
|
||||
NG_MPI_Type_commit ( &htype );
|
||||
NG_MPI_Aint lb, ext;
|
||||
NG_MPI_Type_get_extent (htype, &lb, &ext);
|
||||
// *testout << "lb = " << lb << endl;
|
||||
// *testout << "ext = " << ext << endl;
|
||||
ext = sizeof (Segment);
|
||||
MPI_Type_create_resized (htype, lb, ext, &type);
|
||||
MPI_Type_commit ( &type );
|
||||
NG_MPI_Type_create_resized (htype, lb, ext, &type);
|
||||
NG_MPI_Type_commit ( &type );
|
||||
}
|
||||
return type;
|
||||
}
|
||||
|
@ -10,6 +10,7 @@
|
||||
|
||||
#include <mydefs.hpp>
|
||||
#include <general/template.hpp>
|
||||
#include <core/mpi_wrapper.hpp>
|
||||
#include <gprim/geom3d.hpp>
|
||||
#include <linalg.hpp>
|
||||
|
||||
@ -372,7 +373,7 @@ namespace netgen
|
||||
bool IsSingular() const { return (singular != 0.0); }
|
||||
|
||||
#ifdef PARALLEL
|
||||
static MPI_Datatype MyGetMPIType ( );
|
||||
static NG_MPI_Datatype MyGetMPIType ( );
|
||||
#endif
|
||||
|
||||
void DoArchive (Archive & ar)
|
||||
@ -583,7 +584,7 @@ namespace netgen
|
||||
}
|
||||
|
||||
#ifdef PARALLEL
|
||||
static MPI_Datatype MyGetMPIType();
|
||||
static NG_MPI_Datatype MyGetMPIType();
|
||||
#endif
|
||||
|
||||
|
||||
@ -886,7 +887,7 @@ namespace netgen
|
||||
}
|
||||
|
||||
#ifdef PARALLEL
|
||||
static MPI_Datatype MyGetMPIType();
|
||||
static NG_MPI_Datatype MyGetMPIType();
|
||||
#endif
|
||||
|
||||
///
|
||||
@ -1138,7 +1139,7 @@ namespace netgen
|
||||
|
||||
void DoArchive (Archive & ar);
|
||||
#ifdef PARALLEL
|
||||
static MPI_Datatype MyGetMPIType();
|
||||
static NG_MPI_Datatype MyGetMPIType();
|
||||
#endif
|
||||
|
||||
};
|
||||
@ -1642,25 +1643,25 @@ namespace netgen
|
||||
namespace ngcore
|
||||
{
|
||||
template <> struct MPI_typetrait<netgen::PointIndex> {
|
||||
static MPI_Datatype MPIType () { return MPI_INT; }
|
||||
static NG_MPI_Datatype MPIType () { return NG_MPI_INT; }
|
||||
};
|
||||
|
||||
template <> struct MPI_typetrait<netgen::ELEMENT_TYPE> {
|
||||
static MPI_Datatype MPIType () { return MPI_CHAR; }
|
||||
static NG_MPI_Datatype MPIType () { return NG_MPI_CHAR; }
|
||||
};
|
||||
|
||||
template <> struct MPI_typetrait<netgen::MeshPoint> {
|
||||
static MPI_Datatype MPIType () { return netgen::MeshPoint::MyGetMPIType(); }
|
||||
static NG_MPI_Datatype MPIType () { return netgen::MeshPoint::MyGetMPIType(); }
|
||||
};
|
||||
|
||||
template <> struct MPI_typetrait<netgen::Element> {
|
||||
static MPI_Datatype MPIType () { return netgen::Element::MyGetMPIType(); }
|
||||
static NG_MPI_Datatype MPIType () { return netgen::Element::MyGetMPIType(); }
|
||||
};
|
||||
template <> struct MPI_typetrait<netgen::Element2d> {
|
||||
static MPI_Datatype MPIType () { return netgen::Element2d::MyGetMPIType(); }
|
||||
static NG_MPI_Datatype MPIType () { return netgen::Element2d::MyGetMPIType(); }
|
||||
};
|
||||
template <> struct MPI_typetrait<netgen::Segment> {
|
||||
static MPI_Datatype MPIType () { return netgen::Segment::MyGetMPIType(); }
|
||||
static NG_MPI_Datatype MPIType () { return netgen::Segment::MyGetMPIType(); }
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -53,15 +53,15 @@ namespace ngcore
|
||||
}; // class SurfPointPackage
|
||||
|
||||
template<> struct MPI_typetrait<SurfPointPackage> {
|
||||
static MPI_Datatype MPIType () {
|
||||
static MPI_Datatype MPI_T = 0;
|
||||
static NG_MPI_Datatype MPIType () {
|
||||
static NG_MPI_Datatype MPI_T = 0;
|
||||
if (!MPI_T)
|
||||
{
|
||||
int block_len[2] = { 2, 2 };
|
||||
MPI_Aint displs[3] = { 0, 2*sizeof(int) };
|
||||
MPI_Datatype types[2] = { MPI_INT, MPI_DOUBLE };
|
||||
MPI_Type_create_struct(2, block_len, displs, types, &MPI_T);
|
||||
MPI_Type_commit(&MPI_T);
|
||||
NG_MPI_Aint displs[3] = { 0, 2*sizeof(int) };
|
||||
NG_MPI_Datatype types[2] = { NG_MPI_INT, NG_MPI_DOUBLE };
|
||||
NG_MPI_Type_create_struct(2, block_len, displs, types, &MPI_T);
|
||||
NG_MPI_Type_commit(&MPI_T);
|
||||
}
|
||||
return MPI_T;
|
||||
}
|
||||
@ -119,15 +119,15 @@ namespace ngcore
|
||||
}; // class SelPackage
|
||||
|
||||
template<> struct MPI_typetrait<SelPackage> {
|
||||
static MPI_Datatype MPIType () {
|
||||
static MPI_Datatype MPI_T = 0;
|
||||
static NG_MPI_Datatype MPIType () {
|
||||
static NG_MPI_Datatype MPI_T = 0;
|
||||
if (!MPI_T)
|
||||
{
|
||||
int block_len[2] = { 3, ELEMENT2D_MAXPOINTS };
|
||||
MPI_Aint displs[3] = { 0, 3*sizeof(int) };
|
||||
MPI_Datatype types[2] = { MPI_INT, GetMPIType<SurfPointPackage>() };
|
||||
MPI_Type_create_struct(2, block_len, displs, types, &MPI_T);
|
||||
MPI_Type_commit(&MPI_T);
|
||||
NG_MPI_Aint displs[3] = { 0, 3*sizeof(int) };
|
||||
NG_MPI_Datatype types[2] = { NG_MPI_INT, GetMPIType<SurfPointPackage>() };
|
||||
NG_MPI_Type_create_struct(2, block_len, displs, types, &MPI_T);
|
||||
NG_MPI_Type_commit(&MPI_T);
|
||||
}
|
||||
return MPI_T;
|
||||
}
|
||||
@ -145,15 +145,15 @@ namespace ngcore
|
||||
}; // class PointElPackage
|
||||
|
||||
template<> struct MPI_typetrait<PointElPackage> {
|
||||
static MPI_Datatype MPIType () {
|
||||
static MPI_Datatype MPI_T = 0;
|
||||
static NG_MPI_Datatype MPIType () {
|
||||
static NG_MPI_Datatype MPI_T = 0;
|
||||
if (!MPI_T)
|
||||
{
|
||||
int block_len[2] = { 1, 1 };
|
||||
MPI_Aint displs[3] = { 0, sizeof(netgen::PointIndex) };
|
||||
MPI_Datatype types[2] = { GetMPIType<netgen::PointIndex>(), MPI_INT };
|
||||
MPI_Type_create_struct(2, block_len, displs, types, &MPI_T);
|
||||
MPI_Type_commit(&MPI_T);
|
||||
NG_MPI_Aint displs[3] = { 0, sizeof(netgen::PointIndex) };
|
||||
NG_MPI_Datatype types[2] = { GetMPIType<netgen::PointIndex>(), NG_MPI_INT };
|
||||
NG_MPI_Type_create_struct(2, block_len, displs, types, &MPI_T);
|
||||
NG_MPI_Type_commit(&MPI_T);
|
||||
}
|
||||
return MPI_T;
|
||||
}
|
||||
@ -222,7 +222,7 @@ namespace netgen
|
||||
int dim = GetDimension();
|
||||
comm.Bcast(dim);
|
||||
|
||||
Array<MPI_Request> sendrequests(8*(ntasks-1));
|
||||
Array<NG_MPI_Request> sendrequests(8*(ntasks-1));
|
||||
sendrequests.SetSize0();
|
||||
|
||||
// If the topology is not already updated, we do not need to
|
||||
@ -452,27 +452,27 @@ namespace netgen
|
||||
tbuildvertex.Stop();
|
||||
PrintMessage ( 3, "Sending Vertices - vertices");
|
||||
|
||||
Array<MPI_Datatype> point_types(ntasks-1);
|
||||
Array<NG_MPI_Datatype> point_types(ntasks-1);
|
||||
for (int dest = 1; dest < ntasks; dest++)
|
||||
{
|
||||
NgFlatArray<PointIndex> verts = verts_of_proc[dest];
|
||||
// sendrequests.Append (MyMPI_ISend (verts, dest, MPI_TAG_MESH+1, comm));
|
||||
sendrequests.Append (comm.ISend (FlatArray<PointIndex>(verts), dest, MPI_TAG_MESH+1));
|
||||
// sendrequests.Append (MyMPI_ISend (verts, dest, NG_MPI_TAG_MESH+1, comm));
|
||||
sendrequests.Append (comm.ISend (FlatArray<PointIndex>(verts), dest, NG_MPI_TAG_MESH+1));
|
||||
|
||||
MPI_Datatype mptype = MeshPoint::MyGetMPIType();
|
||||
NG_MPI_Datatype mptype = MeshPoint::MyGetMPIType();
|
||||
|
||||
int numv = verts.Size();
|
||||
|
||||
NgArray<int> blocklen (numv);
|
||||
blocklen = 1;
|
||||
|
||||
MPI_Type_indexed (numv, (numv == 0) ? nullptr : &blocklen[0],
|
||||
NG_MPI_Type_indexed (numv, (numv == 0) ? nullptr : &blocklen[0],
|
||||
(numv == 0) ? nullptr : reinterpret_cast<int*> (&verts[0]),
|
||||
mptype, &point_types[dest-1]);
|
||||
MPI_Type_commit (&point_types[dest-1]);
|
||||
NG_MPI_Type_commit (&point_types[dest-1]);
|
||||
|
||||
MPI_Request request;
|
||||
MPI_Isend( points.Data(), 1, point_types[dest-1], dest, MPI_TAG_MESH+1, comm, &request);
|
||||
NG_MPI_Request request;
|
||||
NG_MPI_Isend( points.Data(), 1, point_types[dest-1], dest, NG_MPI_TAG_MESH+1, comm, &request);
|
||||
sendrequests.Append (request);
|
||||
}
|
||||
|
||||
@ -533,10 +533,10 @@ namespace netgen
|
||||
}
|
||||
}
|
||||
}
|
||||
Array<MPI_Request> req_per;
|
||||
Array<NG_MPI_Request> req_per;
|
||||
for(int dest = 1; dest < ntasks; dest++)
|
||||
// req_per.Append(MyMPI_ISend(pp_data[dest], dest, MPI_TAG_MESH+1, comm));
|
||||
req_per.Append(comm.ISend(FlatArray<int>(pp_data[dest]), dest, MPI_TAG_MESH+1));
|
||||
// req_per.Append(MyMPI_ISend(pp_data[dest], dest, NG_MPI_TAG_MESH+1, comm));
|
||||
req_per.Append(comm.ISend(FlatArray<int>(pp_data[dest]), dest, NG_MPI_TAG_MESH+1));
|
||||
MyMPI_WaitAll(req_per);
|
||||
|
||||
PrintMessage ( 3, "Sending Vertices - distprocs");
|
||||
@ -570,7 +570,7 @@ namespace netgen
|
||||
tbuilddistpnums.Stop();
|
||||
|
||||
for ( int dest = 1; dest < ntasks; dest ++ )
|
||||
sendrequests.Append (comm.ISend (distpnums[dest], dest, MPI_TAG_MESH+1));
|
||||
sendrequests.Append (comm.ISend (distpnums[dest], dest, NG_MPI_TAG_MESH+1));
|
||||
|
||||
|
||||
|
||||
@ -604,7 +604,7 @@ namespace netgen
|
||||
tbuildelementtable.Stop();
|
||||
|
||||
for (int dest = 1; dest < ntasks; dest ++ )
|
||||
sendrequests.Append (comm.ISend (elementarrays[dest], dest, MPI_TAG_MESH+2));
|
||||
sendrequests.Append (comm.ISend (elementarrays[dest], dest, NG_MPI_TAG_MESH+2));
|
||||
|
||||
|
||||
PrintMessage ( 3, "Sending Face Descriptors" );
|
||||
@ -621,7 +621,7 @@ namespace netgen
|
||||
|
||||
}
|
||||
for (int dest = 1; dest < ntasks; dest++)
|
||||
sendrequests.Append (comm.ISend (fddata, dest, MPI_TAG_MESH+3));
|
||||
sendrequests.Append (comm.ISend (fddata, dest, NG_MPI_TAG_MESH+3));
|
||||
|
||||
/** Surface Elements **/
|
||||
|
||||
@ -697,7 +697,7 @@ namespace netgen
|
||||
});
|
||||
// distribute sel data
|
||||
for (int dest = 1; dest < ntasks; dest++)
|
||||
sendrequests.Append (comm.ISend(selbuf[dest], dest, MPI_TAG_MESH+4));
|
||||
sendrequests.Append (comm.ISend(selbuf[dest], dest, NG_MPI_TAG_MESH+4));
|
||||
|
||||
|
||||
/** Segments **/
|
||||
@ -849,7 +849,7 @@ namespace netgen
|
||||
});
|
||||
// distribute segment data
|
||||
for (int dest = 1; dest < ntasks; dest++)
|
||||
sendrequests.Append (comm.ISend(segm_buf[dest], dest, MPI_TAG_MESH+5));
|
||||
sendrequests.Append (comm.ISend(segm_buf[dest], dest, NG_MPI_TAG_MESH+5));
|
||||
|
||||
/** Point-Elements **/
|
||||
PrintMessage ( 3, "Point-Elements ...");
|
||||
@ -870,7 +870,7 @@ namespace netgen
|
||||
iterate_zdes([&](const auto & pack, auto dest) { zde_buf.Add(dest, pack); });
|
||||
|
||||
for (int dest = 1; dest < ntasks; dest++)
|
||||
{ sendrequests.Append (comm.ISend(zde_buf[dest], dest, MPI_TAG_MESH+6)); }
|
||||
{ sendrequests.Append (comm.ISend(zde_buf[dest], dest, NG_MPI_TAG_MESH+6)); }
|
||||
|
||||
PrintMessage ( 3, "now wait ...");
|
||||
|
||||
@ -878,7 +878,7 @@ namespace netgen
|
||||
|
||||
// clean up MPI-datatypes we allocated earlier
|
||||
for (auto t : point_types)
|
||||
{ MPI_Type_free(&t); }
|
||||
{ NG_MPI_Type_free(&t); }
|
||||
|
||||
paralleltop -> SetNV_Loc2Glob (0);
|
||||
paralleltop -> SetNV (0);
|
||||
@ -895,8 +895,8 @@ namespace netgen
|
||||
nnames[3] = GetNCD3Names();
|
||||
int tot_nn = nnames[0] + nnames[1] + nnames[2] + nnames[3];
|
||||
for( int k = 1; k < ntasks; k++)
|
||||
sendrequests[k] = comm.ISend(nnames, k, MPI_TAG_MESH+7);
|
||||
// (void) MPI_Isend(nnames, 4, MPI_INT, k, MPI_TAG_MESH+6, comm, &sendrequests[k]);
|
||||
sendrequests[k] = comm.ISend(nnames, k, NG_MPI_TAG_MESH+7);
|
||||
// (void) NG_MPI_Isend(nnames, 4, NG_MPI_INT, k, NG_MPI_TAG_MESH+6, comm, &sendrequests[k]);
|
||||
auto iterate_names = [&](auto func) {
|
||||
for (int k = 0; k < nnames[0]; k++) func(materials[k]);
|
||||
for (int k = 0; k < nnames[1]; k++) func(bcnames[k]);
|
||||
@ -908,7 +908,7 @@ namespace netgen
|
||||
tot_nn = 0;
|
||||
iterate_names([&](auto ptr) { name_sizes[tot_nn++] = (ptr==NULL) ? 0 : ptr->size(); });
|
||||
for( int k = 1; k < ntasks; k++)
|
||||
(void) MPI_Isend(&name_sizes[0], tot_nn, MPI_INT, k, MPI_TAG_MESH+7, comm, &sendrequests[ntasks+k]);
|
||||
(void) NG_MPI_Isend(&name_sizes[0], tot_nn, NG_MPI_INT, k, NG_MPI_TAG_MESH+7, comm, &sendrequests[ntasks+k]);
|
||||
// names
|
||||
int strs = 0;
|
||||
iterate_names([&](auto ptr) { strs += (ptr==NULL) ? 0 : ptr->size(); });
|
||||
@ -920,7 +920,7 @@ namespace netgen
|
||||
for (int j=0; j < name.size(); j++) compiled_names[strs++] = name[j];
|
||||
});
|
||||
for( int k = 1; k < ntasks; k++)
|
||||
(void) MPI_Isend(&(compiled_names[0]), strs, MPI_CHAR, k, MPI_TAG_MESH+7, comm, &sendrequests[2*ntasks+k]);
|
||||
(void) NG_MPI_Isend(&(compiled_names[0]), strs, NG_MPI_CHAR, k, NG_MPI_TAG_MESH+7, comm, &sendrequests[2*ntasks+k]);
|
||||
|
||||
PrintMessage ( 3, "wait for names");
|
||||
|
||||
@ -1006,7 +1006,7 @@ namespace netgen
|
||||
timer_pts.Start();
|
||||
|
||||
Array<int> verts;
|
||||
comm.Recv (verts, 0, MPI_TAG_MESH+1);
|
||||
comm.Recv (verts, 0, NG_MPI_TAG_MESH+1);
|
||||
|
||||
int numvert = verts.Size();
|
||||
paralleltop -> SetNV (numvert);
|
||||
@ -1026,12 +1026,12 @@ namespace netgen
|
||||
for (int i = 0; i < numvert; i++)
|
||||
AddPoint (netgen::Point<3> (0,0,0));
|
||||
|
||||
MPI_Datatype mptype = MeshPoint::MyGetMPIType();
|
||||
MPI_Status status;
|
||||
MPI_Recv( points.Data(), numvert, mptype, 0, MPI_TAG_MESH+1, comm, &status);
|
||||
NG_MPI_Datatype mptype = MeshPoint::MyGetMPIType();
|
||||
NG_MPI_Status status;
|
||||
NG_MPI_Recv( points.Data(), numvert, mptype, 0, NG_MPI_TAG_MESH+1, comm, &status);
|
||||
|
||||
Array<int> pp_data;
|
||||
comm.Recv(pp_data, 0, MPI_TAG_MESH+1);
|
||||
comm.Recv(pp_data, 0, NG_MPI_TAG_MESH+1);
|
||||
|
||||
int maxidentnr = pp_data[0];
|
||||
auto & idents = GetIdentifications();
|
||||
@ -1052,7 +1052,7 @@ namespace netgen
|
||||
}
|
||||
|
||||
Array<int> dist_pnums;
|
||||
comm.Recv (dist_pnums, 0, MPI_TAG_MESH+1);
|
||||
comm.Recv (dist_pnums, 0, NG_MPI_TAG_MESH+1);
|
||||
|
||||
for (int hi = 0; hi < dist_pnums.Size(); hi += 3)
|
||||
paralleltop ->
|
||||
@ -1067,7 +1067,7 @@ namespace netgen
|
||||
RegionTimer reg(timer_els);
|
||||
|
||||
Array<int> elarray;
|
||||
comm.Recv (elarray, 0, MPI_TAG_MESH+2);
|
||||
comm.Recv (elarray, 0, NG_MPI_TAG_MESH+2);
|
||||
|
||||
for (int ind = 0, elnum = 1; ind < elarray.Size(); elnum++)
|
||||
{
|
||||
@ -1086,7 +1086,7 @@ namespace netgen
|
||||
|
||||
{
|
||||
Array<double> fddata;
|
||||
comm.Recv (fddata, 0, MPI_TAG_MESH+3);
|
||||
comm.Recv (fddata, 0, NG_MPI_TAG_MESH+3);
|
||||
for (int i = 0; i < fddata.Size(); i += 6)
|
||||
{
|
||||
int faceind = AddFaceDescriptor
|
||||
@ -1101,7 +1101,7 @@ namespace netgen
|
||||
RegionTimer reg(timer_sels);
|
||||
Array<SelPackage> selbuf;
|
||||
|
||||
comm.Recv ( selbuf, 0, MPI_TAG_MESH+4);
|
||||
comm.Recv ( selbuf, 0, NG_MPI_TAG_MESH+4);
|
||||
|
||||
int nlocsel = selbuf.Size();
|
||||
paralleltop -> SetNSE ( nlocsel );
|
||||
@ -1124,9 +1124,9 @@ namespace netgen
|
||||
|
||||
{
|
||||
// NgArray<double> segmbuf;
|
||||
// MyMPI_Recv ( segmbuf, 0, MPI_TAG_MESH+5, comm);
|
||||
// MyMPI_Recv ( segmbuf, 0, NG_MPI_TAG_MESH+5, comm);
|
||||
Array<double> segmbuf;
|
||||
comm.Recv (segmbuf, 0, MPI_TAG_MESH+5);
|
||||
comm.Recv (segmbuf, 0, NG_MPI_TAG_MESH+5);
|
||||
|
||||
Segment seg;
|
||||
int globsegi;
|
||||
@ -1170,7 +1170,7 @@ namespace netgen
|
||||
|
||||
{ /** 0d-Elements **/
|
||||
Array<PointElPackage> zdes;
|
||||
comm.Recv ( zdes, 0, MPI_TAG_MESH+6);
|
||||
comm.Recv ( zdes, 0, NG_MPI_TAG_MESH+6);
|
||||
pointelements.SetSize(zdes.Size());
|
||||
for (auto k : Range(pointelements)) {
|
||||
auto & el = pointelements[k];
|
||||
@ -1183,8 +1183,8 @@ namespace netgen
|
||||
paralleltop -> EnumeratePointsGlobally();
|
||||
/** Recv bc-names **/
|
||||
ArrayMem<int,4> nnames{0,0,0,0};
|
||||
// MPI_Recv(nnames, 4, MPI_INT, 0, MPI_TAG_MESH+6, comm, MPI_STATUS_IGNORE);
|
||||
comm.Recv(nnames, 0, MPI_TAG_MESH+7);
|
||||
// NG_MPI_Recv(nnames, 4, NG_MPI_INT, 0, NG_MPI_TAG_MESH+6, comm, NG_MPI_STATUS_IGNORE);
|
||||
comm.Recv(nnames, 0, NG_MPI_TAG_MESH+7);
|
||||
// cout << "nnames = " << FlatArray(nnames) << endl;
|
||||
materials.SetSize(nnames[0]);
|
||||
bcnames.SetSize(nnames[1]);
|
||||
@ -1193,12 +1193,12 @@ namespace netgen
|
||||
|
||||
int tot_nn = nnames[0] + nnames[1] + nnames[2] + nnames[3];
|
||||
NgArray<int> name_sizes(tot_nn);
|
||||
MPI_Recv(&name_sizes[0], tot_nn, MPI_INT, 0, MPI_TAG_MESH+7, comm, MPI_STATUS_IGNORE);
|
||||
NG_MPI_Recv(&name_sizes[0], tot_nn, NG_MPI_INT, 0, NG_MPI_TAG_MESH+7, comm, NG_MPI_STATUS_IGNORE);
|
||||
int tot_size = 0;
|
||||
for (int k = 0; k < tot_nn; k++) tot_size += name_sizes[k];
|
||||
|
||||
NgArray<char> compiled_names(tot_size);
|
||||
MPI_Recv(&(compiled_names[0]), tot_size, MPI_CHAR, 0, MPI_TAG_MESH+7, comm, MPI_STATUS_IGNORE);
|
||||
NG_MPI_Recv(&(compiled_names[0]), tot_size, NG_MPI_CHAR, 0, NG_MPI_TAG_MESH+7, comm, NG_MPI_STATUS_IGNORE);
|
||||
|
||||
tot_nn = tot_size = 0;
|
||||
auto write_names = [&] (auto & array) {
|
||||
|
@ -94,8 +94,8 @@ namespace netgen
|
||||
|
||||
Array<int> first_master_point(comm.Size());
|
||||
comm.AllGather (num_master_points, first_master_point);
|
||||
auto max_oldv = comm.AllReduce (Max (glob_vert.Range(0, oldnv)), MPI_MAX);
|
||||
if (comm.AllReduce (oldnv, MPI_SUM) == 0)
|
||||
auto max_oldv = comm.AllReduce (Max (glob_vert.Range(0, oldnv)), NG_MPI_MAX);
|
||||
if (comm.AllReduce (oldnv, NG_MPI_SUM) == 0)
|
||||
max_oldv = PointIndex::BASE-1;
|
||||
|
||||
size_t num_glob_points = max_oldv+1;
|
||||
@ -138,7 +138,7 @@ namespace netgen
|
||||
for (auto p : dps)
|
||||
send_data[p][nsend[p]++] = L2G(pi);
|
||||
|
||||
Array<MPI_Request> requests;
|
||||
Array<NG_MPI_Request> requests;
|
||||
for (int i = 0; i < comm.Size(); i++)
|
||||
{
|
||||
if (nsend[i])
|
||||
@ -342,10 +342,10 @@ namespace netgen
|
||||
sendarray.Append (topology.GetSurfaceElementFace (el));
|
||||
}
|
||||
|
||||
Array<MPI_Request> sendrequests;
|
||||
Array<NG_MPI_Request> sendrequests;
|
||||
for (int dest = 1; dest < ntasks; dest++)
|
||||
// sendrequests.Append (MyMPI_ISend (*sendarrays[dest], dest, MPI_TAG_MESH+10, comm));
|
||||
sendrequests.Append (comm.ISend (FlatArray<int>(*sendarrays[dest]), dest, MPI_TAG_MESH+10));
|
||||
// sendrequests.Append (MyMPI_ISend (*sendarrays[dest], dest, NG_MPI_TAG_MESH+10, comm));
|
||||
sendrequests.Append (comm.ISend (FlatArray<int>(*sendarrays[dest]), dest, NG_MPI_TAG_MESH+10));
|
||||
MyMPI_WaitAll (sendrequests);
|
||||
|
||||
for (int dest = 1; dest < ntasks; dest++)
|
||||
@ -356,9 +356,9 @@ namespace netgen
|
||||
|
||||
{
|
||||
// NgArray<int> recvarray;
|
||||
// MyMPI_Recv (recvarray, 0, MPI_TAG_MESH+10, comm);
|
||||
// MyMPI_Recv (recvarray, 0, NG_MPI_TAG_MESH+10, comm);
|
||||
Array<int> recvarray;
|
||||
comm.Recv (recvarray, 0, MPI_TAG_MESH+10); // MyMPI_Recv (recvarray, 0, MPI_TAG_MESH+10, comm);
|
||||
comm.Recv (recvarray, 0, NG_MPI_TAG_MESH+10); // MyMPI_Recv (recvarray, 0, NG_MPI_TAG_MESH+10, comm);
|
||||
|
||||
int ii = 0;
|
||||
|
||||
@ -413,7 +413,7 @@ namespace netgen
|
||||
|
||||
Array<int> cnt_send(ntasks);
|
||||
|
||||
int maxsize = comm.AllReduce (mesh.mlbetweennodes.Size(), MPI_MAX);
|
||||
int maxsize = comm.AllReduce (mesh.mlbetweennodes.Size(), NG_MPI_MAX);
|
||||
// update new vertices after mesh-refinement
|
||||
if (maxsize > 0)
|
||||
{
|
||||
@ -500,8 +500,8 @@ namespace netgen
|
||||
}
|
||||
|
||||
DynamicTable<int> recv_verts(ntasks);
|
||||
// MyMPI_ExchangeTable (send_verts, recv_verts, MPI_TAG_MESH+9, comm);
|
||||
comm.ExchangeTable (send_verts, recv_verts, MPI_TAG_MESH+9);
|
||||
// MyMPI_ExchangeTable (send_verts, recv_verts, NG_MPI_TAG_MESH+9, comm);
|
||||
comm.ExchangeTable (send_verts, recv_verts, NG_MPI_TAG_MESH+9);
|
||||
|
||||
for (int dest = 0; dest < ntasks; dest++)
|
||||
if (dest != id)
|
||||
@ -533,7 +533,7 @@ namespace netgen
|
||||
}
|
||||
}
|
||||
|
||||
changed = comm.AllReduce (changed, MPI_LOR);
|
||||
changed = comm.AllReduce (changed, NG_MPI_LOR);
|
||||
}
|
||||
}
|
||||
|
||||
@ -558,8 +558,8 @@ namespace netgen
|
||||
for (int dist : GetDistantProcs(pi))
|
||||
dest2vert.Add (dist, pi);
|
||||
|
||||
// MPI_Group_free(&MPI_LocalGroup);
|
||||
// MPI_Comm_free(&MPI_LocalComm);
|
||||
// NG_MPI_Group_free(&NG_MPI_LocalGroup);
|
||||
// NG_MPI_Comm_free(&NG_MPI_LocalComm);
|
||||
}
|
||||
|
||||
|
||||
@ -696,8 +696,8 @@ namespace netgen
|
||||
// cout << "UpdateCoarseGrid - edges mpi-exchange" << endl;
|
||||
// TABLE<int> recv_edges(ntasks);
|
||||
DynamicTable<int> recv_edges(ntasks);
|
||||
// MyMPI_ExchangeTable (send_edges, recv_edges, MPI_TAG_MESH+9, comm);
|
||||
comm.ExchangeTable (send_edges, recv_edges, MPI_TAG_MESH+9);
|
||||
// MyMPI_ExchangeTable (send_edges, recv_edges, NG_MPI_TAG_MESH+9, comm);
|
||||
comm.ExchangeTable (send_edges, recv_edges, NG_MPI_TAG_MESH+9);
|
||||
// cout << "UpdateCoarseGrid - edges mpi-exchange done" << endl;
|
||||
|
||||
for (int dest = 0; dest < ntasks; dest++)
|
||||
@ -806,8 +806,8 @@ namespace netgen
|
||||
// cout << "UpdateCoarseGrid - faces mpi-exchange" << endl;
|
||||
// TABLE<int> recv_faces(ntasks);
|
||||
DynamicTable<int> recv_faces(ntasks);
|
||||
// MyMPI_ExchangeTable (send_faces, recv_faces, MPI_TAG_MESH+9, comm);
|
||||
comm.ExchangeTable (send_faces, recv_faces, MPI_TAG_MESH+9);
|
||||
// MyMPI_ExchangeTable (send_faces, recv_faces, NG_MPI_TAG_MESH+9, comm);
|
||||
comm.ExchangeTable (send_faces, recv_faces, NG_MPI_TAG_MESH+9);
|
||||
// cout << "UpdateCoarseGrid - faces mpi-exchange done" << endl;
|
||||
|
||||
for (int dest = 0; dest < ntasks; dest++)
|
||||
@ -839,8 +839,8 @@ namespace netgen
|
||||
// EnumeratePointsGlobally();
|
||||
is_updated = true;
|
||||
|
||||
// MPI_Group_free(&MPI_LocalGroup);
|
||||
// MPI_Comm_free(&MPI_LocalComm);
|
||||
// NG_MPI_Group_free(&NG_MPI_LocalGroup);
|
||||
// NG_MPI_Comm_free(&NG_MPI_LocalComm);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -23,7 +23,7 @@ public:
|
||||
~ClearSolutionClass() { Ng_ClearSolutionData(); }
|
||||
};
|
||||
|
||||
|
||||
#undef NG_MPI4PY
|
||||
#ifdef NG_MPI4PY
|
||||
#include <mpi4py.h>
|
||||
|
||||
@ -132,6 +132,7 @@ DLL_HEADER void ExportNetgenMeshing(py::module &m)
|
||||
py::implicitly_convertible<int, Identifications::ID_TYPE>();
|
||||
|
||||
py::class_<NgMPI_Comm> (m, "MPI_Comm")
|
||||
.def(py::init([] () { return NgMPI_Comm(NG_MPI_COMM_WORLD); }))
|
||||
#ifdef NG_MPI4PY
|
||||
.def(py::init([] (mpi4py_comm comm)
|
||||
{
|
||||
@ -144,19 +145,19 @@ DLL_HEADER void ExportNetgenMeshing(py::module &m)
|
||||
.def("Barrier", &NgMPI_Comm::Barrier)
|
||||
|
||||
#ifdef PARALLEL
|
||||
.def("WTime", [](NgMPI_Comm & c) { return MPI_Wtime(); })
|
||||
.def("WTime", [](NgMPI_Comm & c) { return NG_MPI_Wtime(); })
|
||||
#else
|
||||
.def("WTime", [](NgMPI_Comm & c) { return -1.0; })
|
||||
#endif
|
||||
.def("Sum", [](NgMPI_Comm & c, double x) { return c.AllReduce(x, MPI_SUM); })
|
||||
.def("Min", [](NgMPI_Comm & c, double x) { return c.AllReduce(x, MPI_MIN); })
|
||||
.def("Max", [](NgMPI_Comm & c, double x) { return c.AllReduce(x, MPI_MAX); })
|
||||
.def("Sum", [](NgMPI_Comm & c, int x) { return c.AllReduce(x, MPI_SUM); })
|
||||
.def("Min", [](NgMPI_Comm & c, int x) { return c.AllReduce(x, MPI_MIN); })
|
||||
.def("Max", [](NgMPI_Comm & c, int x) { return c.AllReduce(x, MPI_MAX); })
|
||||
.def("Sum", [](NgMPI_Comm & c, size_t x) { return c.AllReduce(x, MPI_SUM); })
|
||||
.def("Min", [](NgMPI_Comm & c, size_t x) { return c.AllReduce(x, MPI_MIN); })
|
||||
.def("Max", [](NgMPI_Comm & c, size_t x) { return c.AllReduce(x, MPI_MAX); })
|
||||
.def("Sum", [](NgMPI_Comm & c, double x) { return c.AllReduce(x, NG_MPI_SUM); })
|
||||
.def("Min", [](NgMPI_Comm & c, double x) { return c.AllReduce(x, NG_MPI_MIN); })
|
||||
.def("Max", [](NgMPI_Comm & c, double x) { return c.AllReduce(x, NG_MPI_MAX); })
|
||||
.def("Sum", [](NgMPI_Comm & c, int x) { return c.AllReduce(x, NG_MPI_SUM); })
|
||||
.def("Min", [](NgMPI_Comm & c, int x) { return c.AllReduce(x, NG_MPI_MIN); })
|
||||
.def("Max", [](NgMPI_Comm & c, int x) { return c.AllReduce(x, NG_MPI_MAX); })
|
||||
.def("Sum", [](NgMPI_Comm & c, size_t x) { return c.AllReduce(x, NG_MPI_SUM); })
|
||||
.def("Min", [](NgMPI_Comm & c, size_t x) { return c.AllReduce(x, NG_MPI_MIN); })
|
||||
.def("Max", [](NgMPI_Comm & c, size_t x) { return c.AllReduce(x, NG_MPI_MAX); })
|
||||
.def("SubComm", [](NgMPI_Comm & c, std::vector<int> proc_list) {
|
||||
Array<int> procs(proc_list.size());
|
||||
for (int i = 0; i < procs.Size(); i++)
|
||||
|
Loading…
Reference in New Issue
Block a user