OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
OPAL
Operations.h
Go to the documentation of this file.
1 #ifndef IPPL_MPI_OPERATIONS_H
2 #define IPPL_MPI_OPERATIONS_H
3 
4 #include <functional>
5 #include <mpi.h>
6 
7 template<class> struct is_ippl_mpi_type: std::false_type {};
8 
9 template <class Op> MPI_Op get_mpi_op(Op op)
10 {
11  static_assert(is_ippl_mpi_type<Op>::value,
12  "type not supported");
13  return get_mpi_op( op );
14 }
15 
16 #define IPPL_MPI_OP(CppOp, MPIOp) \
17 template <> \
18 inline MPI_Op \
19 get_mpi_op< CppOp >(CppOp) { return MPIOp; } \
20  \
21 template<> \
22 struct is_ippl_mpi_type<CppOp>: \
23  std::true_type {};
24 
25 
26 /* with C++14 we should be able
27  * to simply write
28  *
29  * IPPL_MPI_OP(std::plus<>, MPI_SUM);
30  *
31  */
32 
33 IPPL_MPI_OP(std::plus<char>, MPI_SUM);
34 IPPL_MPI_OP(std::plus<short>, MPI_SUM);
35 IPPL_MPI_OP(std::plus<int>, MPI_SUM);
36 IPPL_MPI_OP(std::plus<long>, MPI_SUM);
37 IPPL_MPI_OP(std::plus<long long>, MPI_SUM);
38 IPPL_MPI_OP(std::plus<unsigned char>, MPI_SUM);
39 IPPL_MPI_OP(std::plus<unsigned short>, MPI_SUM);
40 IPPL_MPI_OP(std::plus<unsigned int>, MPI_SUM);
41 IPPL_MPI_OP(std::plus<unsigned long>, MPI_SUM);
42 IPPL_MPI_OP(std::plus<unsigned long long>, MPI_SUM);
43 IPPL_MPI_OP(std::plus<float>, MPI_SUM);
44 IPPL_MPI_OP(std::plus<double>, MPI_SUM);
45 IPPL_MPI_OP(std::plus<long double>, MPI_SUM);
46 
47 
48 IPPL_MPI_OP(std::less<char>, MPI_MIN);
49 IPPL_MPI_OP(std::less<short>, MPI_MIN);
50 IPPL_MPI_OP(std::less<int>, MPI_MIN);
51 IPPL_MPI_OP(std::less<long>, MPI_MIN);
52 IPPL_MPI_OP(std::less<long long>, MPI_MIN);
53 IPPL_MPI_OP(std::less<unsigned char>, MPI_MIN);
54 IPPL_MPI_OP(std::less<unsigned short>, MPI_MIN);
55 IPPL_MPI_OP(std::less<unsigned int>, MPI_MIN);
56 IPPL_MPI_OP(std::less<unsigned long>, MPI_MIN);
57 IPPL_MPI_OP(std::less<unsigned long long>, MPI_MIN);
58 IPPL_MPI_OP(std::less<float>, MPI_MIN);
59 IPPL_MPI_OP(std::less<double>, MPI_MIN);
60 IPPL_MPI_OP(std::less<long double>, MPI_MIN);
61 
62 
63 IPPL_MPI_OP(std::greater<char>, MPI_MAX);
64 IPPL_MPI_OP(std::greater<short>, MPI_MAX);
65 IPPL_MPI_OP(std::greater<int>, MPI_MAX);
66 IPPL_MPI_OP(std::greater<long>, MPI_MAX);
67 IPPL_MPI_OP(std::greater<long long>, MPI_MAX);
68 IPPL_MPI_OP(std::greater<unsigned char>, MPI_MAX);
69 IPPL_MPI_OP(std::greater<unsigned short>, MPI_MAX);
70 IPPL_MPI_OP(std::greater<unsigned int>, MPI_MAX);
71 IPPL_MPI_OP(std::greater<unsigned long>, MPI_MAX);
72 IPPL_MPI_OP(std::greater<unsigned long long>, MPI_MAX);
73 IPPL_MPI_OP(std::greater<float>, MPI_MAX);
74 IPPL_MPI_OP(std::greater<double>, MPI_MAX);
75 IPPL_MPI_OP(std::greater<long double>, MPI_MAX);
76 
77 
78 IPPL_MPI_OP(std::logical_or<bool>, MPI_LOR);
79 IPPL_MPI_OP(std::logical_and<bool>, MPI_LAND);
80 
81 #endif
MPI_Op get_mpi_op(Op op)
Definition: Operations.h:9
#define IPPL_MPI_OP(CppOp, MPIOp)
Definition: Operations.h:16