Kokkos Core Kernels Package Version of the Day
Kokkos_MemoryTraits.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_MEMORYTRAITS_HPP
46#define KOKKOS_MEMORYTRAITS_HPP
47
48#include <impl/Kokkos_Traits.hpp>
49#include <impl/Kokkos_Tags.hpp>
50
51//----------------------------------------------------------------------------
52
53namespace Kokkos {
54
63enum MemoryTraitsFlags {
64 Unmanaged = 0x01,
65 RandomAccess = 0x02,
66 Atomic = 0x04,
67 Restrict = 0x08,
68 Aligned = 0x10
69};
70
71template <unsigned T>
72struct MemoryTraits {
74 using memory_traits = MemoryTraits<T>;
75 enum : bool {
76 is_unmanaged = (unsigned(0) != (T & unsigned(Kokkos::Unmanaged)))
77 };
78 enum : bool {
79 is_random_access = (unsigned(0) != (T & unsigned(Kokkos::RandomAccess)))
80 };
81 enum : bool { is_atomic = (unsigned(0) != (T & unsigned(Kokkos::Atomic))) };
82 enum : bool {
83 is_restrict = (unsigned(0) != (T & unsigned(Kokkos::Restrict)))
84 };
85 enum : bool { is_aligned = (unsigned(0) != (T & unsigned(Kokkos::Aligned))) };
86};
87
88} // namespace Kokkos
89
90//----------------------------------------------------------------------------
91
92namespace Kokkos {
93
94using MemoryManaged = Kokkos::MemoryTraits<0>;
95using MemoryUnmanaged = Kokkos::MemoryTraits<Kokkos::Unmanaged>;
96using MemoryRandomAccess =
97 Kokkos::MemoryTraits<Kokkos::Unmanaged | Kokkos::RandomAccess>;
98
99} // namespace Kokkos
100
101//----------------------------------------------------------------------------
102
103namespace Kokkos {
104namespace Impl {
105
106static_assert((0 < int(KOKKOS_MEMORY_ALIGNMENT)) &&
107 (0 == (int(KOKKOS_MEMORY_ALIGNMENT) &
108 (int(KOKKOS_MEMORY_ALIGNMENT) - 1))),
109 "KOKKOS_MEMORY_ALIGNMENT must be a power of two");
110
117enum : unsigned {
118 MEMORY_ALIGNMENT = KOKKOS_MEMORY_ALIGNMENT,
119 MEMORY_ALIGNMENT_THRESHOLD = KOKKOS_MEMORY_ALIGNMENT_THRESHOLD
120};
121
122} // namespace Impl
123} // namespace Kokkos
124
125#endif /* #ifndef KOKKOS_MEMORYTRAITS_HPP */