Kokkos Core Kernels Package Version of the Day
Kokkos_Half.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_HALF_HPP_
46#define KOKKOS_HALF_HPP_
47
48#include <type_traits>
49#include <Kokkos_Macros.hpp>
50
51// Include special backend specific versions here
52#include <Cuda/Kokkos_Cuda_Half.hpp>
53
54// Potentially include special compiler specific versions here
55// e.g. for Intel
56
57// If none of the above actually did anything and defined a half precision type
58// define a fallback implementation here using float
59#ifndef KOKKOS_IMPL_HALF_TYPE_DEFINED
60#define KOKKOS_IMPL_HALF_TYPE_DEFINED
61#define KOKKOS_HALF_T_IS_FLOAT true
62namespace Kokkos {
63namespace Impl {
64struct half_impl_t {
65 using type = float;
66};
67} // namespace Impl
68namespace Experimental {
69
70using half_t = Kokkos::Impl::half_impl_t::type;
71
72// cast_to_half
73KOKKOS_INLINE_FUNCTION
74half_t cast_to_half(float val) { return half_t(val); }
75KOKKOS_INLINE_FUNCTION
76half_t cast_to_half(bool val) { return half_t(val); }
77KOKKOS_INLINE_FUNCTION
78half_t cast_to_half(double val) { return half_t(val); }
79KOKKOS_INLINE_FUNCTION
80half_t cast_to_half(short val) { return half_t(val); }
81KOKKOS_INLINE_FUNCTION
82half_t cast_to_half(unsigned short val) { return half_t(val); }
83KOKKOS_INLINE_FUNCTION
84half_t cast_to_half(int val) { return half_t(val); }
85KOKKOS_INLINE_FUNCTION
86half_t cast_to_half(unsigned int val) { return half_t(val); }
87KOKKOS_INLINE_FUNCTION
88half_t cast_to_half(long val) { return half_t(val); }
89KOKKOS_INLINE_FUNCTION
90half_t cast_to_half(unsigned long val) { return half_t(val); }
91KOKKOS_INLINE_FUNCTION
92half_t cast_to_half(long long val) { return half_t(val); }
93KOKKOS_INLINE_FUNCTION
94half_t cast_to_half(unsigned long long val) { return half_t(val); }
95
96// cast_from_half
97// Using an explicit list here too, since the other ones are explicit and for
98// example don't include char
99template <class T>
100KOKKOS_INLINE_FUNCTION std::enable_if_t<
101 std::is_same<T, float>::value || std::is_same<T, bool>::value ||
102 std::is_same<T, double>::value || std::is_same<T, short>::value ||
103 std::is_same<T, unsigned short>::value || std::is_same<T, int>::value ||
104 std::is_same<T, unsigned int>::value || std::is_same<T, long>::value ||
105 std::is_same<T, unsigned long>::value ||
106 std::is_same<T, long long>::value ||
107 std::is_same<T, unsigned long long>::value,
108 T>
109cast_from_half(half_t val) {
110 return T(val);
111}
112
113} // namespace Experimental
114} // namespace Kokkos
115
116#else
117#define KOKKOS_HALF_T_IS_FLOAT false
118#endif // KOKKOS_IMPL_HALF_TYPE_DEFINED
119#endif // KOKKOS_HALF_HPP_