ExecutionPolicy
#
The concept of an ExecutionPolicy
is the fundamental abstraction to represent “how” the execution of a Kokkos parallel pattern takes place. This page talks practically about how to use the common features of execution policies in Kokkos; for a more formal and theoretical treatment, see this document.
Disclaimer: There is nothing new about the term “concept” in C++; anyone who has ever used templates in C++ has used concepts whether they knew it or not. Please do not be confused by the word “concept” itself, which is now more often associated with a shiny new C++20 language feature. Here, “concept” just means “what you’re allowed to do with a type that is a template parameter in certain places”.
What is an ExecutionPolicy
?#
The dominant parallel dispatch mechanism in Kokkos, described elsewhere in the programming guide, involves a parallel_pattern
(e.g., something like Kokkos::parallel_for or Kokkos::parallel_reduce), an ExecutionPolicy
, and a Functor
. In a hand-wavy sense:
parallel_pattern(
ExecutionPolicy(),
Functor()
);
The most basic (“beginner”) case is actually a shortcut:
Kokkos::parallel_for(
42,
KOKKOS_LAMBDA (int n) { /* ... */ }
);
is a “shortcut” for
Kokkos::parallel_for(
Kokkos::RangePolicy<Kokkos::DefaultExecutionSpace>(
Kokkos::DefaultExecutionSpace(), 0, 42
),
KOKKOS_LAMBDA(int n) { /* ... */ }
);
In this example, Kokkos::RangePolicy<Kokkos::DefaultExecutionSpace>
is the ExecutionPolicy
type.
Functionality#
All ExecutionPolicy
types provide a nested type named index_type
.