17 #ifndef KOKKOS_IMPL_PUBLIC_INCLUDE
18 #include <Kokkos_Macros.hpp>
20 "Including non-public Kokkos header files is not allowed.");
22 #ifndef KOKKOS_OPENMPTARGETSPACE_HPP
23 #define KOKKOS_OPENMPTARGETSPACE_HPP
30 #include <Kokkos_Core_fwd.hpp>
32 #ifdef KOKKOS_ENABLE_OPENMPTARGET
34 #include <OpenMPTarget/Kokkos_OpenMPTarget_Error.hpp>
35 #include <Kokkos_HostSpace.hpp>
75 struct MemorySpaceAccess<Kokkos::HostSpace,
76 Kokkos::Experimental::OpenMPTargetSpace> {
77 enum :
bool { assignable =
false };
78 enum :
bool { accessible =
false };
79 enum :
bool { deepcopy =
true };
85 struct MemorySpaceAccess<Kokkos::Experimental::OpenMPTargetSpace,
87 enum :
bool { assignable =
false };
88 enum :
bool { accessible =
false };
89 enum :
bool { deepcopy =
true };
97 namespace Experimental {
104 class OpenMPTargetSpace {
107 using memory_space = OpenMPTargetSpace;
108 using size_type = unsigned;
116 using execution_space = Kokkos::Experimental::OpenMPTarget;
119 using device_type = Kokkos::Device<execution_space, memory_space>;
125 OpenMPTargetSpace(OpenMPTargetSpace&& rhs) =
default;
126 OpenMPTargetSpace(
const OpenMPTargetSpace& rhs) =
default;
127 OpenMPTargetSpace& operator=(OpenMPTargetSpace&&) =
default;
128 OpenMPTargetSpace& operator=(
const OpenMPTargetSpace&) =
default;
129 ~OpenMPTargetSpace() =
default;
132 void* allocate(
const size_t arg_alloc_size)
const;
133 void* allocate(
const char* arg_label,
const size_t arg_alloc_size,
134 const size_t arg_logical_size = 0)
const;
137 void deallocate(
void*
const arg_alloc_ptr,
138 const std::size_t arg_alloc_size)
const;
139 void deallocate(
const char* arg_label,
void*
const arg_alloc_ptr,
140 const size_t arg_alloc_size,
141 const size_t arg_logical_size = 0)
const;
143 static constexpr
const char* name() {
return "OpenMPTargetSpace"; }
146 void* impl_allocate(
const char* arg_label,
const size_t arg_alloc_size,
147 const size_t arg_logical_size = 0,
148 const Kokkos::Tools::SpaceHandle =
149 Kokkos::Tools::make_space_handle(name()))
const;
150 void impl_deallocate(
const char* arg_label,
void*
const arg_alloc_ptr,
151 const size_t arg_alloc_size,
152 const size_t arg_logical_size = 0,
153 const Kokkos::Tools::SpaceHandle =
154 Kokkos::Tools::make_space_handle(name()))
const;
156 friend class Kokkos::Impl::SharedAllocationRecord<
157 Kokkos::Experimental::OpenMPTargetSpace, void>;
169 class SharedAllocationRecord<Kokkos::Experimental::OpenMPTargetSpace, void>
170 :
public HostInaccessibleSharedAllocationRecordCommon<
171 Kokkos::Experimental::OpenMPTargetSpace> {
173 friend class HostInaccessibleSharedAllocationRecordCommon<
174 Kokkos::Experimental::OpenMPTargetSpace>;
175 friend class SharedAllocationRecordCommon<
176 Kokkos::Experimental::OpenMPTargetSpace>;
177 friend Kokkos::Experimental::OpenMPTargetSpace;
179 using base_t = HostInaccessibleSharedAllocationRecordCommon<
180 Kokkos::Experimental::OpenMPTargetSpace>;
181 using RecordBase = SharedAllocationRecord<void, void>;
183 SharedAllocationRecord(const SharedAllocationRecord&) = delete;
184 SharedAllocationRecord& operator=(const SharedAllocationRecord&) = delete;
188 static RecordBase s_root_record;
190 const Kokkos::Experimental::OpenMPTargetSpace m_space;
193 ~SharedAllocationRecord();
194 SharedAllocationRecord() = default;
196 template <typename ExecutionSpace>
197 SharedAllocationRecord(
198 const ExecutionSpace& ,
199 const Kokkos::Experimental::OpenMPTargetSpace& arg_space,
200 const std::string& arg_label, const size_t arg_alloc_size,
201 const RecordBase::function_type arg_dealloc = &deallocate)
202 : SharedAllocationRecord(arg_space, arg_label, arg_alloc_size,
205 SharedAllocationRecord(
206 const Kokkos::Experimental::OpenMPTargetSpace& arg_space,
207 const std::string& arg_label,
const size_t arg_alloc_size,
208 const RecordBase::function_type arg_dealloc = &deallocate);
211 KOKKOS_INLINE_FUNCTION
static SharedAllocationRecord* allocate(
212 const Kokkos::Experimental::OpenMPTargetSpace& arg_space,
213 const std::string& arg_label,
const size_t arg_alloc) {
215 (
return new SharedAllocationRecord(arg_space, arg_label, arg_alloc);))
217 ((
void)arg_space; (
void)arg_label; (
void)arg_alloc; return
nullptr;))
231 template <
class ExecutionSpace>
232 struct DeepCopy<Kokkos::Experimental::OpenMPTargetSpace,
233 Kokkos::Experimental::OpenMPTargetSpace, ExecutionSpace> {
234 DeepCopy(
void* dst,
const void* src,
size_t n) {
239 KOKKOS_IMPL_OMPT_SAFE_CALL(omp_target_memcpy(
240 dst, const_cast<void*>(src), n, 0, 0, omp_get_default_device(),
241 omp_get_default_device()));
243 DeepCopy(
const ExecutionSpace& exec,
void* dst,
const void* src,
size_t n) {
245 "Kokkos::Impl::DeepCopy<OpenMPTargetSpace, OpenMPTargetSpace>: fence "
249 KOKKOS_IMPL_OMPT_SAFE_CALL(omp_target_memcpy(
250 dst, const_cast<void*>(src), n, 0, 0, omp_get_default_device(),
251 omp_get_default_device()));
255 template <
class ExecutionSpace>
256 struct DeepCopy<Kokkos::Experimental::OpenMPTargetSpace, HostSpace,
258 DeepCopy(
void* dst,
const void* src,
size_t n) {
260 KOKKOS_IMPL_OMPT_SAFE_CALL(omp_target_memcpy(
261 dst, const_cast<void*>(src), n, 0, 0, omp_get_default_device(),
262 omp_get_initial_device()));
264 DeepCopy(
const ExecutionSpace& exec,
void* dst,
const void* src,
size_t n) {
266 "Kokkos::Impl::DeepCopy<OpenMPTargetSpace, HostSpace>: fence before "
269 KOKKOS_IMPL_OMPT_SAFE_CALL(omp_target_memcpy(
270 dst, const_cast<void*>(src), n, 0, 0, omp_get_default_device(),
271 omp_get_initial_device()));
275 template <
class ExecutionSpace>
276 struct DeepCopy<HostSpace, Kokkos::Experimental::OpenMPTargetSpace,
278 DeepCopy(
void* dst,
const void* src,
size_t n) {
280 KOKKOS_IMPL_OMPT_SAFE_CALL(omp_target_memcpy(
281 dst, const_cast<void*>(src), n, 0, 0, omp_get_initial_device(),
282 omp_get_default_device()));
284 DeepCopy(
const ExecutionSpace& exec,
void* dst,
const void* src,
size_t n) {
286 "Kokkos::Impl::DeepCopy<HostSpace, OpenMPTargetSpace>: fence before "
289 KOKKOS_IMPL_OMPT_SAFE_CALL(omp_target_memcpy(
290 dst, const_cast<void*>(src), n, 0, 0, omp_get_initial_device(),
291 omp_get_default_device()));
Memory management for host memory.