17 #ifndef KOKKOS_IMPL_PUBLIC_INCLUDE 
   18 #include <Kokkos_Macros.hpp> 
   20               "Including non-public Kokkos header files is not allowed.");
 
   22 #ifndef KOKKOS_UNIQUE_TOKEN_HPP 
   23 #define KOKKOS_UNIQUE_TOKEN_HPP 
   25 #include <Kokkos_Macros.hpp> 
   26 #include <Kokkos_MemoryTraits.hpp> 
   27 #include <Kokkos_Core_fwd.hpp> 
   30 namespace Experimental {
 
   32 enum class UniqueTokenScope : int { Instance, Global };
 
   39 template <
typename ExecutionSpace = Kokkos::DefaultExecutionSpace,
 
   40           UniqueTokenScope        = UniqueTokenScope::Instance>
 
   43   using execution_space = ExecutionSpace;
 
   44   using size_type       = 
typename execution_space::size_type;
 
   49   UniqueToken(execution_space 
const& = execution_space());
 
   52   KOKKOS_INLINE_FUNCTION
 
   53   size_type 
size() 
const;
 
   56   KOKKOS_INLINE_FUNCTION
 
   60   KOKKOS_INLINE_FUNCTION
 
   69 template <
typename ExecutionSpace>
 
   71     : 
public UniqueToken<ExecutionSpace, UniqueTokenScope::Global> {
 
   73   using execution_space = ExecutionSpace;
 
   74   using size_type       = 
typename execution_space::size_type;
 
   85   UniqueToken(size_type max_size, execution_space 
const& = execution_space());
 
   95 template <
typename ExecutionSpace,
 
   96           UniqueTokenScope TokenScope = UniqueTokenScope::Instance>
 
   99   using exec_space = ExecutionSpace;
 
  100   using size_type  = 
typename exec_space::size_type;
 
  105   size_type my_acquired_val;
 
  109       : my_token(t), my_acquired_val(my_token.acquire()) {}
 
  111   KOKKOS_FUNCTION ~AcquireUniqueToken() { my_token.
release(my_acquired_val); }
 
  113   KOKKOS_FUNCTION size_type value()
 const { 
return my_acquired_val; }
 
  121 template <
typename TeamPolicy>
 
  124   using exec_space       = 
typename TeamPolicy::execution_space;
 
  126   using size_type        = 
typename token_type::size_type;
 
  127   using team_member_type = 
typename TeamPolicy::member_type;
 
  129       Kokkos::View<size_type, 
typename exec_space::scratch_memory_space,
 
  130                    Kokkos::MemoryUnmanaged>;
 
  134   size_type my_acquired_val;
 
  135   scratch_view my_team_acquired_val;
 
  136   team_member_type my_team;
 
  148   KOKKOS_FUNCTION ~AcquireTeamUniqueToken();
 
  149   KOKKOS_FUNCTION size_type value()
 const { 
return my_acquired_val; }
 
  150   static std::size_t shmem_size() { 
return scratch_view::shmem_size(); }
 
  156 #endif  // KOKKOS_UNIQUE_TOKEN_HPP 
KOKKOS_INLINE_FUNCTION size_type acquire() const 
acquire value such that 0 <= value < size() 
 
RAII helper for per-thread unique token values. 
 
class to generate unique ids base on the required amount of concurrency 
 
UniqueToken(execution_space const &=execution_space())
create object size for concurrency on the given instance 
 
KOKKOS_INLINE_FUNCTION void release(size_type) const 
release a value acquired by generate 
 
KOKKOS_INLINE_FUNCTION size_type size() const 
upper bound for acquired values, i.e. 0 <= value < size() 
 
RAII helper for per-team unique token values.