threadwise_2d_tensor_op.cuh 4.38 KB
Newer Older
1
#pragma once
Chao Liu's avatar
Chao Liu committed
2
#include "ConstantTensorDescriptor.cuh"
3

Chao Liu's avatar
Chao Liu committed
4
template <class Float, class Desc, class F>
Chao Liu's avatar
Chao Liu committed
5
__device__ void threadwise_2d_tensor_pointwise_operation_unary(Desc, Float* __restrict__ p, F f)
6
{
Chao Liu's avatar
Chao Liu committed
7
8
    constexpr auto I0 = Number<0>{};
    constexpr auto I1 = Number<1>{};
9

Chao Liu's avatar
Chao Liu committed
10
    constexpr auto desc = Desc{};
11
12
13
14

#if 0
    if(threadIdx.x == 0)
    {
Chao Liu's avatar
Chao Liu committed
15
        print_ConstantTensorDescriptor(desc, "threadwise_4d_tensor_op_unary: ");
16
17
18
    }
#endif

Chao Liu's avatar
Chao Liu committed
19
    for(unsigned did0 = 0; did0 < desc.GetLength(I0); ++did0)
Chao Liu's avatar
Chao Liu committed
20
    {
Chao Liu's avatar
Chao Liu committed
21
        for(unsigned did1 = 0; did1 < desc.GetLength(I1); ++did1)
Chao Liu's avatar
Chao Liu committed
22
        {
Chao Liu's avatar
Chao Liu committed
23
24
25
            const unsigned dindex = desc.Get1dIndex(did0, did1);

            f(p[dindex]);
Chao Liu's avatar
Chao Liu committed
26
27
28
29
        }
    }
}

30
31
// TODO: in order to optimize mem access for different mem type,
// need to write specialized version
Chao Liu's avatar
Chao Liu committed
32
33
34
35
36
37
template <class Float,
          class SrcDesc,
          class DstDesc,
          class SrcOpLengths,
          class DstFromSrcReorder,
          class F>
Chao Liu's avatar
Chao Liu committed
38
__device__ void threadwise_2d_tensor_pointwise_operation_binary_reorder_by_get_dst_from_src(
Chao Liu's avatar
Chao Liu committed
39
40
41
42
43
44
45
    SrcDesc,
    Float* const __restrict__ p_src,
    DstDesc,
    Float* __restrict__ p_dst,
    SrcOpLengths,
    DstFromSrcReorder,
    F f)
Chao Liu's avatar
Chao Liu committed
46
{
Chao Liu's avatar
Chao Liu committed
47
48
    constexpr auto I0 = Number<0>{};
    constexpr auto I1 = Number<1>{};
Chao Liu's avatar
Chao Liu committed
49

Chao Liu's avatar
Chao Liu committed
50
51
    constexpr unsigned IR0 = DstFromSrcReorder{}.Get(I0);
    constexpr unsigned IR1 = DstFromSrcReorder{}.Get(I1);
Chao Liu's avatar
Chao Liu committed
52

53
54
    constexpr auto src_desc = SrcDesc{};
    constexpr auto dst_desc = DstDesc{};
Chao Liu's avatar
Chao Liu committed
55
    constexpr auto ref_desc = make_ConstantTensorDescriptor(SrcOpLengths{});
Chao Liu's avatar
Chao Liu committed
56

57
    for(unsigned did0 = 0; did0 < ref_desc.GetLength(I0); ++did0)
Chao Liu's avatar
Chao Liu committed
58
    {
59
        for(unsigned did1 = 0; did1 < ref_desc.GetLength(I1); ++did1)
Chao Liu's avatar
Chao Liu committed
60
        {
Chao Liu's avatar
Chao Liu committed
61
            const unsigned aindex = src_desc.Get1dIndex(did0, did1);
62

Chao Liu's avatar
Chao Liu committed
63
            const unsigned did[2] = {did0, did1};
Chao Liu's avatar
Chao Liu committed
64

Chao Liu's avatar
Chao Liu committed
65
            const unsigned bindex = dst_desc.Get1dIndex(did[IR0], did[IR1]);
Chao Liu's avatar
Chao Liu committed
66

Chao Liu's avatar
Chao Liu committed
67
            f(p_src[aindex], p_dst[bindex]);
68
69
70
        }
    }
}
Chao Liu's avatar
Chao Liu committed
71

Chao Liu's avatar
Chao Liu committed
72
template <class Float, class Desc>
Chao Liu's avatar
Chao Liu committed
73
__device__ void threadwise_2d_tensor_set_zero(Desc, Float* __restrict__ p)
Chao Liu's avatar
Chao Liu committed
74
{
Chao Liu's avatar
Chao Liu committed
75
    auto f_set_zero = [](Float& v) { v = Float(0); };
Chao Liu's avatar
Chao Liu committed
76

Chao Liu's avatar
Chao Liu committed
77
    threadwise_2d_tensor_pointwise_operation_unary<Float, Desc, decltype(f_set_zero)>(
Chao Liu's avatar
Chao Liu committed
78
        Desc{}, p, f_set_zero);
Chao Liu's avatar
Chao Liu committed
79
}
Chao Liu's avatar
Chao Liu committed
80

Chao Liu's avatar
Chao Liu committed
81
82
template <class Float, class SrcDesc, class DstDesc, class SrcOpLengths, class DstFromSrcReorder>
__device__ void
Chao Liu's avatar
Chao Liu committed
83
threadwise_2d_tensor_copy_reorder_by_get_dst_from_src(SrcDesc,
Chao Liu's avatar
Chao Liu committed
84
85
86
87
88
                                                      Float* const __restrict__ p_src,
                                                      DstDesc,
                                                      Float* __restrict__ p_dst,
                                                      SrcOpLengths,
                                                      DstFromSrcReorder)
89
{
Chao Liu's avatar
Chao Liu committed
90
    auto f_copy = [](const Float& src, Float& dst) { dst = src; };
91

Chao Liu's avatar
Chao Liu committed
92
    threadwise_2d_tensor_pointwise_operation_binary_reorder_by_get_dst_from_src(
Chao Liu's avatar
Chao Liu committed
93
        SrcDesc{}, p_src, DstDesc{}, p_dst, SrcOpLengths{}, DstFromSrcReorder{}, f_copy);
94
95
}

Chao Liu's avatar
Chao Liu committed
96
template <class Float, class SrcDesc, class DstDesc, class SrcOpLengths>
Chao Liu's avatar
Chao Liu committed
97
__device__ void threadwise_2d_tensor_copy(
Chao Liu's avatar
Chao Liu committed
98
    SrcDesc, Float* const __restrict__ p_src, DstDesc, Float* __restrict__ p_dst, SrcOpLengths)
Chao Liu's avatar
Chao Liu committed
99
{
Chao Liu's avatar
Chao Liu committed
100
    auto dst_from_src_reorder = Sequence<0, 1>{};
Chao Liu's avatar
Chao Liu committed
101

Chao Liu's avatar
Chao Liu committed
102
    threadwise_2d_tensor_copy_reorder_by_get_dst_from_src(
Chao Liu's avatar
Chao Liu committed
103
        SrcDesc{}, p_src, DstDesc{}, p_dst, SrcOpLengths{}, dst_from_src_reorder);
Chao Liu's avatar
Chao Liu committed
104
105
}

Chao Liu's avatar
Chao Liu committed
106
template <class Float, class Desc, class IDim, class NShift>
Chao Liu's avatar
Chao Liu committed
107
__device__ void threadwise_2d_tensor_shift_down(Desc, Float* __restrict__ p, IDim, NShift)
Chao Liu's avatar
Chao Liu committed
108
109
110
111
112
113
114
115
116
117
118
119
120
{
    constexpr auto I0 = Number<0>{};
    constexpr auto I1 = Number<1>{};

    constexpr auto desc = Desc{};

#if 0
    if(threadIdx.x == 0)
    {
        print_ConstantTensorDescriptor(desc, "threadwise_4d_tensor_shift_down: ");
    }
#endif

Chao Liu's avatar
Chao Liu committed
121
122
123
124
    constexpr unsigned nshift = NShift::mValue;

    constexpr unsigned did0_end =
        is_same<decltype(I0), IDim>::value ? desc.GetLength(I0) - nshift : desc.GetLength(I0);
Chao Liu's avatar
Chao Liu committed
125

Chao Liu's avatar
Chao Liu committed
126
127
    constexpr unsigned did1_end =
        is_same<decltype(I1), IDim>::value ? desc.GetLength(I1) - nshift : desc.GetLength(I1);
Chao Liu's avatar
Chao Liu committed
128

Chao Liu's avatar
Chao Liu committed
129
130
131
132
    for(unsigned did0 = 0; did0 < did0_end; ++did0)
    {
        for(unsigned did1 = 0; did1 < did1_end; ++did1)
        {
Chao Liu's avatar
Chao Liu committed
133
            const unsigned dindex = desc.Get1dIndex(did0, did1);
Chao Liu's avatar
Chao Liu committed
134

Chao Liu's avatar
Chao Liu committed
135
            const unsigned sindex = dindex + nshift * desc.GetStride(IDim{});
Chao Liu's avatar
Chao Liu committed
136

Chao Liu's avatar
Chao Liu committed
137
            p[dindex] = p[sindex];
Chao Liu's avatar
Chao Liu committed
138
139
        }
    }
Chao Liu's avatar
Chao Liu committed
140
}