- 
                Notifications
    
You must be signed in to change notification settings  - Fork 0
 
Kokkos::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));.
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
    void join(volatile value_type& dest, const volatile value_type& src) const;
    KOKKOS_INLINE_FUNCTION
    void init( value_type& val)  const;
    KOKKOS_INLINE_FUNCTION
    value_type& reference() const;
    KOKKOS_INLINE_FUNCTION
    result_view_type view() const;
    
    //Part of Build-In reducers for Kokkos
    KOKKOS_INLINE_FUNCTION
    Reducer(value_type& value_);
    KOKKOS_INLINE_FUNCTION
    Reducer(const result_view_type& value_);
};- 
reducer: The self type. - 
value_type: The reduction scalar type. - 
result_view_type: AKokkos::Viewreferencing 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 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:
- 
Reducer(value_type& result)Constructs a reducer which references a local variable as its result location.
 - 
Reducer(const result_view_type result)`
Constructs a reducer which references a specific view as its result location.
 
- 
void join(value_type& dest, const value_type& src) const;`
Combine
srcintodest. For example,Addperformsdest+=src;. - 
void join(volatile value_type& dest, const volatile value_type& src) const;
Combine
srcintodest. For example,Addperformsdest+=src;. - 
void init( value_type& val) const;
Initialize
valwith appropriate initial value. For example, 'Add' assignsval = 0;, but Prod assignsval = 1; - 
value_type& reference() const;
Returns a reference to the result place.
 - 
result_view_type view() const;
Returns a view of the result place.
 
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 must be defined. A simple example is shown below and more information can be found under Custom Reductions.
  #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);
  }Home:
- Introduction
 - Machine Model
 - Programming Model
 - Compiling
 - Initialization
 - View
 - Parallel Dispatch
 - Hierarchical Parallelism
 - Custom Reductions
 - Atomic Operations
 - Subviews
 - Interoperability
 - Kokkos and Virtual Functions
 
- Initialization and Finalization
 - View
 - Data Parallelism
 - Execution Policies
 - Spaces
 - Task Parallelism
 - Utilities
 - STL Compatibility
 - Numerics
 - Detection Idiom