Kokkos Core Kernels Package Version of the Day
Loading...
Searching...
No Matches
Kokkos_HostSpace.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_IMPL_PUBLIC_INCLUDE
18#include <Kokkos_Macros.hpp>
19static_assert(false,
20 "Including non-public Kokkos header files is not allowed.");
21#endif
22#ifndef KOKKOS_HOSTSPACE_HPP
23#define KOKKOS_HOSTSPACE_HPP
24
25#include <cstring>
26#include <string>
27#include <iosfwd>
28#include <typeinfo>
29
30#include <Kokkos_Core_fwd.hpp>
31#include <Kokkos_Concepts.hpp>
32#include <Kokkos_MemoryTraits.hpp>
33
34#include <impl/Kokkos_Traits.hpp>
35#include <impl/Kokkos_Error.hpp>
36#include <impl/Kokkos_SharedAlloc.hpp>
37#include <impl/Kokkos_Tools.hpp>
38
39#include "impl/Kokkos_HostSpace_deepcopy.hpp"
40
41/*--------------------------------------------------------------------------*/
42
43namespace Kokkos {
49class HostSpace {
50 public:
53 using size_type = size_t;
54
62
65
66 HostSpace() = default;
67 HostSpace(HostSpace&& rhs) = default;
68 HostSpace(const HostSpace& rhs) = default;
69 HostSpace& operator=(HostSpace&&) = default;
70 HostSpace& operator=(const HostSpace&) = default;
71 ~HostSpace() = default;
72
73#ifdef KOKKOS_ENABLE_DEPRECATED_CODE_4
77#if defined(KOKKOS_COMPILER_GNU) && KOKKOS_COMPILER_GNU < 1100
78 // We see deprecation warnings even when not using the deprecated
79 // HostSpace constructor below when using gcc before release 11.
80 enum
81#else
82 enum KOKKOS_DEPRECATED
83#endif
89 };
90
91 KOKKOS_DEPRECATED
92 explicit HostSpace(const AllocationMechanism&);
93#endif
94
96 template <typename ExecutionSpace>
97 void* allocate(const ExecutionSpace&, const size_t arg_alloc_size) const {
99 }
100 template <typename ExecutionSpace>
101 void* allocate(const ExecutionSpace&, const char* arg_label,
102 const size_t arg_alloc_size,
103 const size_t arg_logical_size = 0) const {
105 }
106 void* allocate(const size_t arg_alloc_size) const;
107 void* allocate(const char* arg_label, const size_t arg_alloc_size,
108 const size_t arg_logical_size = 0) const;
109
111 void deallocate(void* const arg_alloc_ptr, const size_t arg_alloc_size) const;
112 void deallocate(const char* arg_label, void* const arg_alloc_ptr,
113 const size_t arg_alloc_size,
114 const size_t arg_logical_size = 0) const;
115
116 void* impl_allocate(const char* arg_label, const size_t arg_alloc_size,
117 const size_t arg_logical_size = 0,
118 const Kokkos::Tools::SpaceHandle =
119 Kokkos::Tools::make_space_handle(name())) const;
120 void impl_deallocate(const char* arg_label, void* const arg_alloc_ptr,
121 const size_t arg_alloc_size,
122 const size_t arg_logical_size = 0,
123 const Kokkos::Tools::SpaceHandle =
124 Kokkos::Tools::make_space_handle(name())) const;
125
127 static constexpr const char* name() { return m_name; }
128
129 private:
130 static constexpr const char* m_name = "Host";
131};
132
133} // namespace Kokkos
134
135//----------------------------------------------------------------------------
136
137namespace Kokkos {
138
139namespace Impl {
140
142 Kokkos::HostSpace>::assignable);
143
144template <typename S>
145struct HostMirror {
146 private:
147 // If input execution space can access HostSpace then keep it.
148 // Example: Kokkos::OpenMP can access, Kokkos::Cuda cannot
149 enum {
151 typename S::execution_space::memory_space,
152 Kokkos::HostSpace>::accessible
153 };
154
155 // If HostSpace can access memory space then keep it.
156 // Example: Cannot access Kokkos::CudaSpace, can access Kokkos::CudaUVMSpace
157 enum {
158 keep_mem =
160 typename S::memory_space>::accessible
161 };
162
163 public:
164 using Space = std::conditional_t<
165 keep_exe && keep_mem, S,
166 std::conditional_t<keep_mem,
168 typename S::memory_space>,
170};
171
172} // namespace Impl
173
174} // namespace Kokkos
175
176//----------------------------------------------------------------------------
177
178KOKKOS_IMPL_SHARED_ALLOCATION_SPECIALIZATION(Kokkos::HostSpace);
179
180//----------------------------------------------------------------------------
181
182namespace Kokkos {
183
184namespace Impl {
185
186template <class ExecutionSpace>
187struct DeepCopy<HostSpace, HostSpace, ExecutionSpace> {
188 DeepCopy(void* dst, const void* src, size_t n) {
189 hostspace_parallel_deepcopy(dst, src, n);
190 }
191
192 DeepCopy(const ExecutionSpace& exec, void* dst, const void* src, size_t n) {
193 if constexpr (!Kokkos::SpaceAccessibility<ExecutionSpace,
194 Kokkos::HostSpace>::accessible) {
195 exec.fence(
196 "Kokkos::Impl::DeepCopy<HostSpace, HostSpace, "
197 "ExecutionSpace>::DeepCopy: fence before copy");
198 hostspace_parallel_deepcopy_async(dst, src, n);
199 } else {
200 hostspace_parallel_deepcopy_async(exec, dst, src, n);
201 }
202 }
203};
204
205} // namespace Impl
206
207} // namespace Kokkos
208
209#endif // #define KOKKOS_HOSTSPACE_HPP
A thread safe view to a bitset.
Memory management for host memory.
void * allocate(const ExecutionSpace &, const size_t arg_alloc_size) const
Allocate untracked memory in the space.
static constexpr const char * name()
Return Name of the MemorySpace.
void deallocate(void *const arg_alloc_ptr, const size_t arg_alloc_size) const
Deallocate untracked memory in the space.
DefaultHostExecutionSpace execution_space
Default execution space for this memory space.
Access relationship between DstMemorySpace and SrcMemorySpace.
Can AccessSpace access MemorySpace ?