Kokkos Core Kernels Package Version of the Day
Kokkos_OpenMPTarget.hpp
1/*
2//@HEADER
3// ************************************************************************
4//
5// Kokkos v. 3.0
6// Copyright (2020) National Technology & Engineering
7// Solutions of Sandia, LLC (NTESS).
8//
9// Under the terms of Contract DE-NA0003525 with NTESS,
10// the U.S. Government retains certain rights in this software.
11//
12// Redistribution and use in source and binary forms, with or without
13// modification, are permitted provided that the following conditions are
14// met:
15//
16// 1. Redistributions of source code must retain the above copyright
17// notice, this list of conditions and the following disclaimer.
18//
19// 2. Redistributions in binary form must reproduce the above copyright
20// notice, this list of conditions and the following disclaimer in the
21// documentation and/or other materials provided with the distribution.
22//
23// 3. Neither the name of the Corporation nor the names of the
24// contributors may be used to endorse or promote products derived from
25// this software without specific prior written permission.
26//
27// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY
28// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
30// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE
31// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
32// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
33// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
34// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
35// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
36// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
37// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38//
39// Questions? Contact Christian R. Trott (crtrott@sandia.gov)
40//
41// ************************************************************************
42//@HEADER
43*/
44
45#ifndef KOKKOS_OPENMPTARGET_HPP
46#define KOKKOS_OPENMPTARGET_HPP
47
48#include <Kokkos_Core_fwd.hpp>
49
50#if defined(KOKKOS_ENABLE_OPENMPTARGET) && defined(_OPENMP)
51
52#include <omp.h>
53
54#include <cstddef>
55#include <iosfwd>
56#include <Kokkos_OpenMPTargetSpace.hpp>
57#include <Kokkos_ScratchSpace.hpp>
58#include <Kokkos_Parallel.hpp>
59#include <Kokkos_TaskPolicy.hpp>
60#include <Kokkos_Layout.hpp>
61#include <impl/Kokkos_Tags.hpp>
62#include <impl/Kokkos_Profiling_Interface.hpp>
63#include <KokkosExp_MDRangePolicy.hpp>
64#include <impl/Kokkos_ExecSpaceInitializer.hpp>
65/*--------------------------------------------------------------------------*/
66
67namespace Kokkos {
68namespace Experimental {
69namespace Impl {
70class OpenMPTargetInternal;
71}
72
75class OpenMPTarget {
76 public:
77 //------------------------------------
79
80
82 using execution_space = OpenMPTarget;
83 using memory_space = OpenMPTargetSpace;
85 using device_type = Kokkos::Device<execution_space, memory_space>;
86
87 using array_layout = LayoutLeft;
88 using size_type = memory_space::size_type;
89
90 using scratch_memory_space = ScratchMemorySpace<OpenMPTarget>;
91
92 inline static bool in_parallel() { return omp_in_parallel(); }
93
94 static void fence();
95
97 static int concurrency();
98
100 void print_configuration(std::ostream&, const bool detail = false);
101
102 static const char* name();
103
105 void impl_finalize();
106
108 static int impl_is_initialized();
109
111 void impl_initialize();
112
113 inline Impl::OpenMPTargetInternal* impl_internal_space_instance() const {
114 return m_space_instance;
115 }
116
117 OpenMPTarget();
118 uint32_t impl_instance_id() const noexcept { return 0; }
119
120 private:
121 Impl::OpenMPTargetInternal* m_space_instance;
122};
123} // namespace Experimental
124
125namespace Tools {
126namespace Experimental {
127template <>
128struct DeviceTypeTraits<::Kokkos::Experimental::OpenMPTarget> {
129 static constexpr DeviceType id =
130 ::Kokkos::Profiling::Experimental::DeviceType::OpenMPTarget;
131};
132} // namespace Experimental
133} // namespace Tools
134
135namespace Impl {
136
137class OpenMPTargetSpaceInitializer : public ExecSpaceInitializerBase {
138 public:
139 OpenMPTargetSpaceInitializer() = default;
140 ~OpenMPTargetSpaceInitializer() = default;
141 void initialize(const InitArguments& args) final;
142 void finalize(const bool) final;
143 void fence() final;
144 void print_configuration(std::ostream& msg, const bool detail) final;
145};
146
147} // namespace Impl
148} // namespace Kokkos
149
150/*--------------------------------------------------------------------------*/
151/*--------------------------------------------------------------------------*/
152
153#include <OpenMPTarget/Kokkos_OpenMPTarget_Exec.hpp>
154#include <OpenMPTarget/Kokkos_OpenMPTarget_Parallel.hpp>
155#include <OpenMPTarget/Kokkos_OpenMPTarget_Parallel_MDRange.hpp>
156#include <OpenMPTarget/Kokkos_OpenMPTarget_Task.hpp>
157
158/*--------------------------------------------------------------------------*/
159
160#endif /* #if defined( KOKKOS_ENABLE_OPENMPTARGET ) && defined( _OPENMP ) */
161#endif /* #ifndef KOKKOS_OPENMPTARGET_HPP */
Declaration of various MemoryLayout options.
Declaration of parallel operators.