common.hip.hpp 2.48 KB
Newer Older
1
#pragma once
Chao Liu's avatar
Chao Liu committed
2
#include "vector_type.hip.hpp"
Chao Liu's avatar
Chao Liu committed
3
#include "integral_constant.hip.hpp"
4
5
6
#include "Sequence.hip.hpp"
#include "Array.hip.hpp"
#include "functional.hip.hpp"
7
#include "functional2.hip.hpp"
8

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

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

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

17
18
19
template <class T1, class T2>
struct is_same
{
Chao Liu's avatar
Chao Liu committed
20
    static constexpr bool value = false;
21
22
23
24
25
};

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

Chao Liu's avatar
Chao Liu committed
29
30
31
32
33
34
template <class X, class Y>
__host__ __device__ constexpr bool is_same_type(X, Y)
{
    return is_same<X, Y>::value;
}

35
namespace mod_conv { // namespace mod_conv
Chao Liu's avatar
Chao Liu committed
36
37
template <class T, T s>
struct scales
38
{
Chao Liu's avatar
Chao Liu committed
39
    __host__ __device__ constexpr T operator()(T a) const { return s * a; }
40
41
};

42
43
44
45
46
47
48
49
50
51
52
53
template <class T>
struct plus
{
    __host__ __device__ constexpr T operator()(T a, T b) const { return a + b; }
};

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

54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
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
70
    return (a + b - 1) / b;
Chao Liu's avatar
Chao Liu committed
71
72
}

Chao Liu's avatar
Chao Liu committed
73
74
template <class T>
__host__ __device__ constexpr T max(T x, T y)
Chao Liu's avatar
Chao Liu committed
75
{
Chao Liu's avatar
Chao Liu committed
76
    return x > y ? x : y;
Chao Liu's avatar
Chao Liu committed
77
78
}

Chao Liu's avatar
Chao Liu committed
79
80
template <class T, class... Ts>
__host__ __device__ constexpr T max(T x, Ts... xs)
Chao Liu's avatar
Chao Liu committed
81
{
Chao Liu's avatar
Chao Liu committed
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
    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;
}
108
109
110
111
112
113
114
115
116

// this is wrong
// TODO: implement correct least common multiple, instead of calling max()
template <class T, class... Ts>
__host__ __device__ constexpr T least_common_multiple(T x, Ts... xs)
{
    return max(x, xs...);
}

Chao Liu's avatar
tidy up  
Chao Liu committed
117
} // namespace mod_conv