18 typedef std::map<std::type_info const*, MPI_Op, type_info_compare> stored_map_type;
25 MPI_Finalized(&is_finalized);
29 for (stored_map_type::iterator it=map.begin(); it != map.end(); ++it)
31 MPI_Op_free(&(it->second));
39 MPI_Op
get(
const std::type_info* t)
41 stored_map_type::iterator pos = map.find(t);
48 void set(
const std::type_info* t, MPI_Op datatype)
51 if (map.find(t) != map.end()) map.erase(t);
52 map.insert(std::make_pair(t, datatype));
67 template <
typename Op,
typename T,
typename Enable =
void>
70 static void funcmpi(
void * invec,
void * inoutvec,
int * len, MPI_Datatype *datatype)
73 T * pinvec =
static_cast<T*
>(invec);
74 T * pinoutvec =
static_cast<T*
>(inoutvec);
75 for (
int i = 0; i < *len; i++)
77 pinoutvec[i] = myop(pinvec[i], pinoutvec[i]);
82 std::type_info
const* t = &
typeid(Op);
85 if (foundop == MPI_OP_NULL)
87 MPI_Op_create(
funcmpi,
false, &foundop);
90 MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
92 std::cout <<
"Creating a new MPI Op for " << t->name() << std::endl;
100 template<
typename T>
struct MPIOp<
maximum<T>,T,typename std::
enable_if<std::is_pod<T>::value, void>::type > {
static MPI_Op
op() {
return MPI_MAX; } };
101 template<
typename T>
struct MPIOp<
minimum<T>,T,typename std::
enable_if<std::is_pod<T>::value, void>::type > {
static MPI_Op
op() {
return MPI_MIN; } };
102 template<
typename T>
struct MPIOp< std::plus<T>,T,typename std::enable_if<std::is_pod<T>::value, void>::type > {
static MPI_Op
op() {
return MPI_SUM; } };
103 template<
typename T>
struct MPIOp< std::multiplies<T>,T,typename std::enable_if<std::is_pod<T>::value, void>::type > {
static MPI_Op
op() {
return MPI_PROD; } };
104 template<
typename T>
struct MPIOp< std::logical_and<T>,T,typename std::enable_if<std::is_pod<T>::value, void>::type > {
static MPI_Op
op() {
return MPI_LAND; } };
105 template<
typename T>
struct MPIOp< std::logical_or<T>,T,typename std::enable_if<std::is_pod<T>::value, void>::type > {
static MPI_Op
op() {
return MPI_LOR; } };
106 template<
typename T>
struct MPIOp<
logical_xor<T>,T,typename std::
enable_if<std::is_pod<T>::value, void>::type > {
static MPI_Op
op() {
return MPI_LXOR; } };
107 template<
typename T>
struct MPIOp<
bitwise_and<T>,T,typename std::
enable_if<std::is_pod<T>::value, void>::type > {
static MPI_Op
op() {
return MPI_BAND; } };
108 template<
typename T>
struct MPIOp<
bitwise_or<T>,T,typename std::
enable_if<std::is_pod<T>::value, void>::type > {
static MPI_Op
op() {
return MPI_BOR; } };
109 template<
typename T>
struct MPIOp<
bitwise_xor<T>,T,typename std::
enable_if<std::is_pod<T>::value, void>::type > {
static MPI_Op
op() {
return MPI_BXOR; } };
MPI_Op get(const std::type_info *t)
void set(const std::type_info *t, MPI_Op datatype)
static void funcmpi(void *invec, void *inoutvec, int *len, MPI_Datatype *datatype)
Compute the bitwise AND of two integral values.
Compute the bitwise OR of two integral values.
Compute the bitwise exclusive OR of two integral values.
Compute the logical exclusive OR of two integral values.
Compute the maximum of two values.
Compute the minimum of two values.