alpaka
Abstraction Library for Parallel Kernel Acceleration
Loading...
Searching...
No Matches
stlIntrinsic.hpp
Go to the documentation of this file.
1/* Copyright 2025 Luca Venerando Greco, René Widera
2 * SPDX-License-Identifier: MPL-2.0
3 */
4
5#pragma once
6
10
11#include <bit>
12#include <type_traits>
13
15{
16 template<typename T_Arg>
18 {
19 constexpr auto operator()(alpaka::internal::StlIntrinsic const, T_Arg const& val) const
20 {
21 if constexpr(sizeof(T_Arg) == 4u)
22 {
23 return std::popcount(std::bit_cast<unsigned int>(val));
24 }
25 else if constexpr(sizeof(T_Arg) == 8u)
26 {
27 return std::popcount(std::bit_cast<unsigned long long>(val));
28 }
29 else
30 static_assert(!sizeof(T_Arg), "Unsupported data type, sizeof() must be 4 or 8");
31
32 ALPAKA_UNREACHABLE(int{});
33 }
34 };
35
36 template<typename T_Arg>
38 {
39 constexpr auto operator()(alpaka::internal::StlIntrinsic const, T_Arg const& val) const
40 {
41 if constexpr(sizeof(T_Arg) == 4u)
42 {
43 auto value = std::bit_cast<unsigned int>(val);
44 return value == 0u ? 0u : std::countr_zero(value) + 1;
45 }
46 else if constexpr(sizeof(T_Arg) == 8u)
47 {
48 auto value = std::bit_cast<unsigned long long>(val);
49 return value == 0u ? 0 : std::countr_zero(value) + 1;
50 }
51 else
52 static_assert(!sizeof(T_Arg), "Unsupported data type, sizeof() must be 4 or 8");
53
54 ALPAKA_UNREACHABLE(int{});
55 }
56 };
57
58 template<typename T_Arg>
60 {
61 constexpr auto operator()(alpaka::internal::StlIntrinsic const, T_Arg const& val) const
62 {
63 if constexpr(sizeof(T_Arg) == 4u)
64 {
65 return std::countl_zero(std::bit_cast<unsigned int>(val));
66 }
67 else if constexpr(sizeof(T_Arg) == 8u)
68 {
69 return std::countl_zero(std::bit_cast<unsigned long long>(val));
70 }
71 else
72 static_assert(!sizeof(T_Arg), "Unsupported data type, sizeof() must be 4 or 8");
73
74 ALPAKA_UNREACHABLE(int{});
75 }
76 };
77} // namespace alpaka::internal::intrinsic
#define ALPAKA_UNREACHABLE(...)
Before CUDA 11.5 nvcc is unable to correctly identify return statements in 'if constexpr' branches....
main alpaka namespace.
Definition alpaka.hpp:76
constexpr auto operator()(alpaka::internal::StlIntrinsic const, T_Arg const &val) const
constexpr auto operator()(alpaka::internal::StlIntrinsic const, T_Arg const &val) const
constexpr auto operator()(alpaka::internal::StlIntrinsic const, T_Arg const &val) const