common.hip.hpp 1.5 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
__device__ index_t get_thread_local_1d_id() { return threadIdx.x; }
Chao Liu's avatar
Chao Liu committed
9

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

12
13
14
15
16
17
18
19
20
21
22
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
23

Chao Liu's avatar
Chao Liu committed
24
__host__ __device__ constexpr index_t integer_divide_ceil(index_t a, index_t b)
Chao Liu's avatar
Chao Liu committed
25
{
Chao Liu's avatar
Chao Liu committed
26
    return (a + b - 1) / b;
Chao Liu's avatar
Chao Liu committed
27
28
}

29
namespace mod_conv { // namespace mod_conv
Chao Liu's avatar
Chao Liu committed
30
31
template <class T>
__host__ __device__ constexpr T max(T x, T y)
Chao Liu's avatar
Chao Liu committed
32
{
Chao Liu's avatar
Chao Liu committed
33
    return x > y ? x : y;
Chao Liu's avatar
Chao Liu committed
34
35
}

Chao Liu's avatar
Chao Liu committed
36
37
template <class T, class... Ts>
__host__ __device__ constexpr T max(T x, Ts... xs)
Chao Liu's avatar
Chao Liu committed
38
{
Chao Liu's avatar
Chao Liu committed
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
    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;
}
65
66
67
68
69
70
71
}// namespace mod_conv

#if DEVICE_BACKEND_HIP
// cast a pointer of LDS to its address
extern "C" __attribute__((address_space(3))) void* __to_local(void* p)[[hc]];
#endif