"examples/vscode:/vscode.git/clone" did not exist on "42a705d51eeea34242ec54e902a90728e0d10e72"
common.hip.hpp 1.99 KB
Newer Older
1
#pragma once
2
#include "data_type.hip.hpp"
3
4
5
6
#include "constant_integral.hip.hpp"
#include "Sequence.hip.hpp"
#include "Array.hip.hpp"
#include "functional.hip.hpp"
7

Chao Liu's avatar
Chao Liu committed
8
9
#if DEVICE_BACKEND_HIP
#include "amd_inline_asm.hip.hpp"
Chao Liu's avatar
Chao Liu committed
10
11
#endif

Chao Liu's avatar
Chao Liu committed
12
__device__ index_t get_thread_local_1d_id() { return threadIdx.x; }
Chao Liu's avatar
Chao Liu committed
13

Chao Liu's avatar
Chao Liu committed
14
__device__ index_t get_block_1d_id() { return blockIdx.x; }
15

16
17
18
19
20
21
22
23
24
25
26
template <class T1, class T2>
struct is_same
{
    static const bool value = false;
};

template <class T>
struct is_same<T, T>
{
    static const bool value = true;
};
Chao Liu's avatar
Chao Liu committed
27

28
29
30
namespace mod_conv { // namespace mod_conv
template <class T>
struct multiplies
Chao Liu's avatar
Chao Liu committed
31
{
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
    __host__ __device__ constexpr T operator()(T a, T b) const { return a * b; }
};

template <class T>
struct plus
{
    __host__ __device__ constexpr T operator()(T a, T b) const { return a + b; }
};

template <class T>
struct integer_divide_ceiler
{
    __host__ __device__ constexpr T operator()(T a, T b) const
    {
        static_assert(is_same<T, index_t>::value || is_same<T, int>::value, "wrong type");

        return (a + b - 1) / b;
    }
};

template <class T>
__host__ __device__ constexpr T integer_divide_ceil(T a, T b)
{
    static_assert(is_same<T, index_t>::value || is_same<T, int>::value, "wrong type");

Chao Liu's avatar
Chao Liu committed
57
    return (a + b - 1) / b;
Chao Liu's avatar
Chao Liu committed
58
59
}

Chao Liu's avatar
Chao Liu committed
60
61
template <class T>
__host__ __device__ constexpr T max(T x, T y)
Chao Liu's avatar
Chao Liu committed
62
{
Chao Liu's avatar
Chao Liu committed
63
    return x > y ? x : y;
Chao Liu's avatar
Chao Liu committed
64
65
}

Chao Liu's avatar
Chao Liu committed
66
67
template <class T, class... Ts>
__host__ __device__ constexpr T max(T x, Ts... xs)
Chao Liu's avatar
Chao Liu committed
68
{
Chao Liu's avatar
Chao Liu committed
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
    static_assert(sizeof...(xs) > 0, "not enough argument");

    auto y = max(xs...);

    static_assert(is_same<decltype(y), T>::value, "not the same type");

    return x > y ? x : y;
}

template <class T>
__host__ __device__ constexpr T min(T x, T y)
{
    return x < y ? x : y;
}

template <class T, class... Ts>
__host__ __device__ constexpr T min(T x, Ts... xs)
{
    static_assert(sizeof...(xs) > 0, "not enough argument");

    auto y = min(xs...);

    static_assert(is_same<decltype(y), T>::value, "not the same type");

    return x < y ? x : y;
}
Chao Liu's avatar
tidy up  
Chao Liu committed
95
} // namespace mod_conv