ReducerConcept
¶
The concept of a Reducer is the abstraction that defines the “how” a “Reduction” is performed during the parallel reduce execution pattern. The abstraction of “what” is given as a template parameter and corresponds to the “what” that is being reduced in the parallel_reduce operation. This page describes the definitions and functions expected from a Reducer with a hypothetical ‘Reducer’ class definition. A brief description of built-in reducers is also included.
Header File: <Kokkos_Core.hpp>
Usage¶
T result;
parallel_reduce(N,Functor,ReducerConcept<T>(result));
Synopsis¶
class Reducer {
public:
//Required for Concept
typedef Reducer reducer;
typedef ... value_type;
typedef Kokkos::View<value_type, ... > result_view_type;
KOKKOS_INLINE_FUNCTION
void join(value_type& dest, const value_type& src) const;
KOKKOS_INLINE_FUNCTION
value_type& reference() const;
KOKKOS_INLINE_FUNCTION
result_view_type view() const;
//Optional
KOKKOS_INLINE_FUNCTION
void init(value_type& val) const;
KOKKOS_INLINE_FUNCTION
void final(value_type& val) const;
//Part of Build-In reducers for Kokkos
KOKKOS_INLINE_FUNCTION
Reducer(value_type& value_);
KOKKOS_INLINE_FUNCTION
Reducer(const result_view_type& value_);
};
Public Class Members¶
Typedefs¶
reducer
: The self type.value_type
: The reduction scalar type.result_view_type
: AKokkos::View
referencing where the reduction result should be placed. Can be an unmanaged view of a scalar or complex datatype (class or struct). Unmanaged views must specify the same memory space where the referenced scalar (or complex datatype) resides.
Constructors¶
Constructors are not part of the concept. A custom reducer can have complex custom constructors. All Build-In reducers in Kokkos have the following two constructors:
-
KOKKOS_INLINE_FUNCTION Reducer(value_type &value_);¶
Constructs a reducer which references a local variable as its result location.
-
KOKKOS_INLINE_FUNCTION Reducer(const result_view_type &value_);¶
Constructs a reducer which references a specific view as its result location.
Functions¶
-
KOKKOS_INLINE_FUNCTION void join(value_type &dest, const value_type &src) const;¶
Combine
src
intodest
. For example,Add
performsdest+=src;
.
-
KOKKOS_INLINE_FUNCTION void init(value_type &val) const;¶
Optional callback initializing
val
with appropriate initial value. For example, ‘Add’ assignsval = 0;
, but Prod assignsval = 1;
. Defaults to calling the default constructor.
-
KOKKOS_INLINE_FUNCTION void final(value_type &val) const;¶
Optional callback modifying the result
val
. Defaults to a no-op.
-
KOKKOS_INLINE_FUNCTION value_type &reference() const;¶
Returns a reference to the result place.
-
KOKKOS_INLINE_FUNCTION result_view_type view() const;¶
Returns a view of the result place.
Requirements¶
The reducer is assumed to define a commutative monoid with respect to the value type it is used with, i.e., the binary operation
value_type op(const value_type& val1, const value_type& val2) {
value_type result = val1;
reducer.join(result, val2);
return result;
}
is commutative and associative with identity element that can be set by calling reducer.init(el)
.
Built-In Reducers¶
Kokkos provides a number of built-in reducers that automatically work with the intrinsic C++ types as well as Kokkos::complex
. In order to use a Built-in reducer with a custom type, a template specialization of Kokkos::reduction_identity<CustomType>
must be defined. A simple example is shown below and more information can be found under Custom Reductions.
Examples¶
#include<Kokkos_Core.hpp>
int main(int argc, char* argv[]) {
long N = argc>1 ? atoi(argv[1]):100;
long result;
Kokkos::parallel_reduce("ReduceSum: ", N, KOKKOS_LAMBDA (const int i, long& lval) {
lval += i;
}, Sum<long>(result));
printf("Result: %l Expected: %l\n",result,N*(N-1)/2);
}