45 #ifndef KOKKOS_OPENMPTARGETSPACE_HPP 46 #define KOKKOS_OPENMPTARGETSPACE_HPP 53 #include <Kokkos_Core_fwd.hpp> 55 #ifdef KOKKOS_ENABLE_OPENMPTARGET 57 #include <OpenMPTarget/Kokkos_OpenMPTarget_Error.hpp> 58 #include <Kokkos_HostSpace.hpp> 100 class OpenMPTargetSpace {
103 using memory_space = OpenMPTargetSpace;
104 using size_type = size_t;
112 using execution_space = Kokkos::Experimental::OpenMPTarget;
115 using device_type = Kokkos::Device<execution_space, memory_space>;
121 OpenMPTargetSpace(OpenMPTargetSpace&& rhs) =
default;
122 OpenMPTargetSpace(
const OpenMPTargetSpace& rhs) =
default;
123 OpenMPTargetSpace& operator=(OpenMPTargetSpace&&) =
default;
124 OpenMPTargetSpace& operator=(
const OpenMPTargetSpace&) =
default;
125 ~OpenMPTargetSpace() =
default;
128 void* allocate(
const size_t arg_alloc_size)
const;
131 void deallocate(
void*
const arg_alloc_ptr,
const size_t arg_alloc_size)
const;
133 static constexpr
const char* name() {
return "OpenMPTargetSpace"; }
136 friend class Kokkos::Impl::SharedAllocationRecord<
137 Kokkos::Experimental::OpenMPTargetSpace, void>;
149 class SharedAllocationRecord<
Kokkos::Experimental::OpenMPTargetSpace, void>
150 :
public HostInaccessibleSharedAllocationRecordCommon<
151 Kokkos::Experimental::OpenMPTargetSpace> {
153 friend class HostInaccessibleSharedAllocationRecordCommon<
154 Kokkos::Experimental::OpenMPTargetSpace>;
155 friend class SharedAllocationRecordCommon<
156 Kokkos::Experimental::OpenMPTargetSpace>;
157 friend Kokkos::Experimental::OpenMPTargetSpace;
159 using base_t = HostInaccessibleSharedAllocationRecordCommon<
160 Kokkos::Experimental::OpenMPTargetSpace>;
161 using RecordBase = SharedAllocationRecord<void, void>;
163 SharedAllocationRecord(const SharedAllocationRecord&) = delete;
164 SharedAllocationRecord& operator=(const SharedAllocationRecord&) = delete;
168 static RecordBase s_root_record;
170 const Kokkos::Experimental::OpenMPTargetSpace m_space;
173 ~SharedAllocationRecord();
174 SharedAllocationRecord() = default;
176 SharedAllocationRecord(
177 const Kokkos::Experimental::OpenMPTargetSpace& arg_space,
178 const std::string& arg_label, const size_t arg_alloc_size,
179 const RecordBase::function_type arg_dealloc = &deallocate);
182 KOKKOS_INLINE_FUNCTION static SharedAllocationRecord* allocate(
183 const Kokkos::Experimental::OpenMPTargetSpace& arg_space,
184 const std::string& arg_label, const size_t arg_alloc_size) {
185 #if defined(KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_HOST) 186 return new SharedAllocationRecord(arg_space, arg_label, arg_alloc_size);
203 template <
class ExecutionSpace>
204 struct DeepCopy<
Kokkos::Experimental::OpenMPTargetSpace,
205 Kokkos::Experimental::OpenMPTargetSpace, ExecutionSpace> {
206 DeepCopy(
void* dst,
const void* src,
size_t n) {
211 OMPT_SAFE_CALL(omp_target_memcpy(dst, const_cast<void*>(src), n, 0, 0,
212 omp_get_default_device(),
213 omp_get_default_device()));
215 DeepCopy(
const ExecutionSpace& exec,
void* dst,
const void* src,
size_t n) {
218 OMPT_SAFE_CALL(omp_target_memcpy(dst, const_cast<void*>(src), n, 0, 0,
219 omp_get_default_device(),
220 omp_get_default_device()));
224 template <
class ExecutionSpace>
225 struct DeepCopy<
Kokkos::Experimental::OpenMPTargetSpace, HostSpace,
227 DeepCopy(
void* dst,
const void* src,
size_t n) {
229 OMPT_SAFE_CALL(omp_target_memcpy(dst, const_cast<void*>(src), n, 0, 0,
230 omp_get_default_device(),
231 omp_get_initial_device()));
233 DeepCopy(
const ExecutionSpace& exec,
void* dst,
const void* src,
size_t n) {
236 OMPT_SAFE_CALL(omp_target_memcpy(dst, const_cast<void*>(src), n, 0, 0,
237 omp_get_default_device(),
238 omp_get_initial_device()));
242 template <
class ExecutionSpace>
243 struct DeepCopy<HostSpace,
Kokkos::Experimental::OpenMPTargetSpace,
245 DeepCopy(
void* dst,
const void* src,
size_t n) {
247 OMPT_SAFE_CALL(omp_target_memcpy(dst, const_cast<void*>(src), n, 0, 0,
248 omp_get_initial_device(),
249 omp_get_default_device()));
251 DeepCopy(
const ExecutionSpace& exec,
void* dst,
const void* src,
size_t n) {
254 OMPT_SAFE_CALL(omp_target_memcpy(dst, const_cast<void*>(src), n, 0, 0,
255 omp_get_initial_device(),
256 omp_get_default_device()));