Kokkos Core Kernels Package  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
Kokkos_Core.hpp
1 //@HEADER
2 // ************************************************************************
3 //
4 // Kokkos v. 4.0
5 // Copyright (2022) National Technology & Engineering
6 // Solutions of Sandia, LLC (NTESS).
7 //
8 // Under the terms of Contract DE-NA0003525 with NTESS,
9 // the U.S. Government retains certain rights in this software.
10 //
11 // Part of Kokkos, under the Apache License v2.0 with LLVM Exceptions.
12 // See https://kokkos.org/LICENSE for license information.
13 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
14 //
15 //@HEADER
16 
17 #ifndef KOKKOS_CORE_HPP
18 #define KOKKOS_CORE_HPP
19 #ifndef KOKKOS_IMPL_PUBLIC_INCLUDE
20 #define KOKKOS_IMPL_PUBLIC_INCLUDE
21 #define KOKKOS_IMPL_PUBLIC_INCLUDE_NOTDEFINED_CORE
22 #endif
23 
24 //----------------------------------------------------------------------------
25 // In the case windows.h is included before Kokkos_Core.hpp there might be
26 // errors due to the potentially defined macros with name "min" and "max" in
27 // windows.h. These collide with the use of "min" and "max" in names inside
28 // Kokkos. The macros will be redefined at the end of Kokkos_Core.hpp
29 #if defined(min)
30 #pragma push_macro("min")
31 #undef min
32 #define KOKKOS_IMPL_PUSH_MACRO_MIN
33 #endif
34 #if defined(max)
35 #pragma push_macro("max")
36 #undef max
37 #define KOKKOS_IMPL_PUSH_MACRO_MAX
38 #endif
39 
40 //----------------------------------------------------------------------------
41 // Include the execution space header files for the enabled execution spaces.
42 
43 #include <Kokkos_Core_fwd.hpp>
44 
45 #include <KokkosCore_Config_DeclareBackend.hpp>
46 
47 #include <Kokkos_Half.hpp>
48 #include <Kokkos_AnonymousSpace.hpp>
49 #include <Kokkos_Pair.hpp>
50 #include <Kokkos_Clamp.hpp>
51 #include <Kokkos_MinMax.hpp>
52 #include <Kokkos_MathematicalConstants.hpp>
53 #include <Kokkos_MathematicalFunctions.hpp>
54 #include <Kokkos_MathematicalSpecialFunctions.hpp>
55 #include <Kokkos_NumericTraits.hpp>
56 #include <Kokkos_BitManipulation.hpp>
57 #include <Kokkos_Swap.hpp>
58 #include <Kokkos_MemoryPool.hpp>
59 #include <Kokkos_Array.hpp>
60 #include <Kokkos_View.hpp>
61 #include <Kokkos_Vectorization.hpp>
62 #include <Kokkos_Atomic.hpp>
63 #include <Kokkos_hwloc.hpp>
64 #include <Kokkos_Timer.hpp>
65 #include <Kokkos_Tuners.hpp>
66 #ifdef KOKKOS_ENABLE_DEPRECATED_CODE_4
67 #include <Kokkos_TaskScheduler.hpp>
68 #endif
69 #include <Kokkos_Complex.hpp>
70 #include <Kokkos_CopyViews.hpp>
71 #include <impl/Kokkos_TeamMDPolicy.hpp>
72 #include <impl/Kokkos_InitializationSettings.hpp>
73 #include <functional>
74 #include <iosfwd>
75 #include <memory>
76 #include <vector>
77 
78 //----------------------------------------------------------------------------
79 
80 namespace Kokkos {
81 
82 void initialize(int& argc, char* argv[]);
83 
84 void initialize(
85  InitializationSettings const& settings = InitializationSettings());
86 
87 namespace Impl {
88 
89 void pre_initialize(const InitializationSettings& settings);
90 
91 void post_initialize(const InitializationSettings& settings);
92 
93 void pre_finalize();
94 
95 void post_finalize();
96 
97 void declare_configuration_metadata(const std::string& category,
98  const std::string& key,
99  const std::string& value);
100 
101 } // namespace Impl
102 
103 [[nodiscard]] bool is_initialized() noexcept;
104 [[nodiscard]] bool is_finalized() noexcept;
105 
106 [[nodiscard]] int device_id() noexcept;
107 [[nodiscard]] int num_devices() noexcept;
108 [[nodiscard]] int num_threads() noexcept;
109 
110 bool show_warnings() noexcept;
111 bool tune_internals() noexcept;
112 
114 void finalize();
115 
136 void push_finalize_hook(std::function<void()> f);
137 
138 void fence(const std::string& name /*= "Kokkos::fence: Unnamed Global Fence"*/);
139 
141 void print_configuration(std::ostream& os, bool verbose = false);
142 
143 } // namespace Kokkos
144 
145 //----------------------------------------------------------------------------
146 //----------------------------------------------------------------------------
147 
148 namespace Kokkos {
149 
150 /* Allocate memory from a memory space.
151  * The allocation is tracked in Kokkos memory tracking system, so
152  * leaked memory can be identified.
153  */
154 template <class Space = Kokkos::DefaultExecutionSpace::memory_space>
155 inline void* kokkos_malloc(const std::string& arg_alloc_label,
156  const size_t arg_alloc_size) {
157  using MemorySpace = typename Space::memory_space;
158  return Impl::SharedAllocationRecord<MemorySpace>::allocate_tracked(
159  MemorySpace(), arg_alloc_label, arg_alloc_size);
160 }
161 
162 template <class Space = Kokkos::DefaultExecutionSpace::memory_space>
163 inline void* kokkos_malloc(const size_t arg_alloc_size) {
164  using MemorySpace = typename Space::memory_space;
165  return Impl::SharedAllocationRecord<MemorySpace>::allocate_tracked(
166  MemorySpace(), "no-label", arg_alloc_size);
167 }
168 
169 template <class Space = Kokkos::DefaultExecutionSpace::memory_space>
170 inline void kokkos_free(void* arg_alloc) {
171  using MemorySpace = typename Space::memory_space;
172  return Impl::SharedAllocationRecord<MemorySpace>::deallocate_tracked(
173  arg_alloc);
174 }
175 
176 template <class Space = Kokkos::DefaultExecutionSpace::memory_space>
177 inline void* kokkos_realloc(void* arg_alloc, const size_t arg_alloc_size) {
178  using MemorySpace = typename Space::memory_space;
179  return Impl::SharedAllocationRecord<MemorySpace>::reallocate_tracked(
180  arg_alloc, arg_alloc_size);
181 }
182 
183 } // namespace Kokkos
184 
185 namespace Kokkos {
186 
195 namespace Impl {
196 
197 inline std::string scopeguard_correct_usage() {
198  return std::string(
199  "Do instead:\n"
200  " std::unique_ptr<Kokkos::ScopeGuard> guard =\n"
201  " !Kokkos::is_initialized() && !Kokkos::is_finalized()?\n"
202  " new ScopeGuard(argc,argv) : nullptr;\n");
203 }
204 
205 inline std::string scopeguard_create_while_initialized_warning() {
206  return std::string(
207  "Kokkos Error: Creating a ScopeGuard while Kokkos is initialized "
208  "is illegal.\n")
209  .append(scopeguard_correct_usage());
210 }
211 
212 inline std::string scopeguard_create_after_finalize_warning() {
213  return std::string(
214  "Kokkos Error: Creating a ScopeGuard after Kokkos was finalized "
215  "is illegal.\n")
216  .append(scopeguard_correct_usage());
217 }
218 
219 inline std::string scopeguard_destruct_after_finalize_warning() {
220  return std::string(
221  "Kokkos Error: Destroying a ScopeGuard after Kokkos was finalized "
222  "is illegal.\n")
223  .append(scopeguard_correct_usage());
224 }
225 
226 } // namespace Impl
227 
228 class KOKKOS_ATTRIBUTE_NODISCARD ScopeGuard {
229  public:
230  template <class... Args>
231 #if defined(__has_cpp_attribute) && __has_cpp_attribute(nodiscard) >= 201907
232  [[nodiscard]]
233 #endif
234  ScopeGuard(Args&&... args) {
235  if (is_initialized()) {
236  Kokkos::abort(
237  Impl::scopeguard_create_while_initialized_warning().c_str());
238  }
239  if (is_finalized()) {
240  Kokkos::abort(Impl::scopeguard_create_after_finalize_warning().c_str());
241  }
242  initialize(static_cast<Args&&>(args)...);
243  }
244 
245  ~ScopeGuard() {
246  if (is_finalized()) {
247  Kokkos::abort(Impl::scopeguard_destruct_after_finalize_warning().c_str());
248  }
249  finalize();
250  }
251 
252  ScopeGuard& operator=(const ScopeGuard&) = delete;
253  ScopeGuard& operator=(ScopeGuard&&) = delete;
254  ScopeGuard(const ScopeGuard&) = delete;
255  ScopeGuard(ScopeGuard&&) = delete;
256 };
257 
258 } // namespace Kokkos
259 
260 namespace Kokkos {
261 namespace Experimental {
262 // Partitioning an Execution Space: expects space and integer arguments for
263 // relative weight
264 // Customization point for backends
265 // Default behavior is to return the passed in instance
266 template <class ExecSpace, class... Args>
267 std::vector<ExecSpace> partition_space(ExecSpace const& space, Args...) {
268  static_assert(is_execution_space<ExecSpace>::value,
269  "Kokkos Error: partition_space expects an Execution Space as "
270  "first argument");
271  static_assert(
272  (... && std::is_arithmetic_v<Args>),
273  "Kokkos Error: partitioning arguments must be integers or floats");
274  std::vector<ExecSpace> instances(sizeof...(Args));
275  for (int s = 0; s < int(sizeof...(Args)); s++) instances[s] = space;
276  return instances;
277 }
278 
279 template <class ExecSpace, class T>
280 std::vector<ExecSpace> partition_space(ExecSpace const& space,
281  std::vector<T> const& weights) {
282  static_assert(is_execution_space<ExecSpace>::value,
283  "Kokkos Error: partition_space expects an Execution Space as "
284  "first argument");
285  static_assert(
286  std::is_arithmetic_v<T>,
287  "Kokkos Error: partitioning arguments must be integers or floats");
288 
289  std::vector<ExecSpace> instances(weights.size());
290  for (int s = 0; s < int(weights.size()); s++) instances[s] = space;
291  return instances;
292 }
293 } // namespace Experimental
294 } // namespace Kokkos
295 
296 #include <Kokkos_Crs.hpp>
297 #include <Kokkos_WorkGraphPolicy.hpp>
298 // Including this in Kokkos_Parallel_Reduce.hpp led to a circular dependency
299 // because Kokkos::Sum is used in Kokkos_Combined_Reducer.hpp and the default.
300 // The real answer is to finally break up Kokkos_Parallel_Reduce.hpp into
301 // smaller parts...
302 #include <impl/Kokkos_Combined_Reducer.hpp>
303 // Yet another workaround to deal with circular dependency issues because the
304 // implementation of the RAII wrapper is using Kokkos::single.
305 #include <Kokkos_AcquireUniqueTokenImpl.hpp>
306 
307 //----------------------------------------------------------------------------
308 // Redefinition of the macros min and max if we pushed them at entry of
309 // Kokkos_Core.hpp
310 #if defined(KOKKOS_IMPL_PUSH_MACRO_MIN)
311 #pragma pop_macro("min")
312 #undef KOKKOS_IMPL_PUSH_MACRO_MIN
313 #endif
314 #if defined(KOKKOS_IMPL_PUSH_MACRO_MAX)
315 #pragma pop_macro("max")
316 #undef KOKKOS_IMPL_PUSH_MACRO_MAX
317 #endif
318 
319 //----------------------------------------------------------------------------
320 //----------------------------------------------------------------------------
321 
322 #ifdef KOKKOS_IMPL_PUBLIC_INCLUDE_NOTDEFINED_CORE
323 #undef KOKKOS_IMPL_PUBLIC_INCLUDE
324 #undef KOKKOS_IMPL_PUBLIC_INCLUDE_NOTDEFINED_CORE
325 #endif
326 #endif
Declaration and definition of Kokkos::Vectorization interface.
Declaration and definition of Kokkos::pair.
Atomic functions.