conv_driver.cpp 8.98 KB
Newer Older
Chao Liu's avatar
Chao Liu committed
1
#include <iostream>
Chao Liu's avatar
Chao Liu committed
2
3
#include <numeric>
#include <initializer_list>
Chao Liu's avatar
Chao Liu committed
4
#include <cstdlib>
Chao Liu's avatar
Chao Liu committed
5
#include <stdlib.h>
Chao Liu's avatar
Chao Liu committed
6
#include <half.hpp>
Chao Liu's avatar
Chao Liu committed
7
#include "config.hpp"
Chao Liu's avatar
Chao Liu committed
8
#include "print.hpp"
Chao Liu's avatar
Chao Liu committed
9
#include "device.hpp"
Chao Liu's avatar
Chao Liu committed
10
#include "host_tensor_generator.hpp"
Chao Liu's avatar
Chao Liu committed
11
#include "conv_common.hpp"
12
#include "host_conv.hpp"
Chao Liu's avatar
Chao Liu committed
13
#include "device_tensor.hpp"
14
15
#include "device_convolution_forward_implicit_gemm_v4r1_nchw_kcyx_nkhw.hpp"
#include "device_convolution_forward_implicit_gemm_v4r4_nchw_kcyx_nkhw.hpp"
Jing Zhang's avatar
Jing Zhang committed
16
#include "device_convolution_forward_implicit_gemm_v4r4_xdlops_nchw_kcyx_nkhw.hpp"
17
#include "device_dynamic_convolution_forward_implicit_gemm_v4r4_nchw_kcyx_nkhw.hpp"
Chao Liu's avatar
Chao Liu committed
18
#include "device_dummy_static_transform.hpp"
Chao Liu's avatar
Chao Liu committed
19
#include "device_dummy_dynamic_transform_v1.hpp"
Chao Liu's avatar
fix  
Chao Liu committed
20
#include "device_dummy_dynamic_transform.hpp"
21

Chao Liu's avatar
Chao Liu committed
22
int main(int argc, char* argv[])
Chao Liu's avatar
Chao Liu committed
23
{
Chao Liu's avatar
Chao Liu committed
24
25
    using namespace ck;

Jing Zhang's avatar
Jing Zhang committed
26
    // 1x1, 56x56
Chao Liu's avatar
Chao Liu committed
27
    constexpr index_t N  = 128;
Chao Liu's avatar
Chao Liu committed
28
    constexpr index_t C  = 128;
Chao Liu's avatar
Chao Liu committed
29
30
31
    constexpr index_t HI = 56;
    constexpr index_t WI = 56;
    constexpr index_t K  = 128;
Chao Liu's avatar
Chao Liu committed
32
33
34
    constexpr index_t Y  = 1;
    constexpr index_t X  = 1;

35
36
37
    using ConvStrides   = Sequence<1, 1>;
    using ConvDilations = Sequence<1, 1>;

Chao Liu's avatar
Chao Liu committed
38
39
    using LeftPads  = Sequence<0, 0>;
    using RightPads = Sequence<0, 0>;
Chao Liu's avatar
Chao Liu committed
40

Chao Liu's avatar
Chao Liu committed
41
42
43
    auto in_nchw_desc  = make_native_tensor_descriptor_packed(Sequence<N, C, HI, WI>{});
    auto wei_kcyx_desc = make_native_tensor_descriptor_packed(Sequence<K, C, Y, X>{});
    auto out_nkhw_desc = get_convolution_output_default_4d_tensor_descriptor(
Chao Liu's avatar
Chao Liu committed
44
        in_nchw_desc, wei_kcyx_desc, ConvStrides{}, ConvDilations{}, LeftPads{}, RightPads{});
Chao Liu's avatar
Chao Liu committed
45

Chao Liu's avatar
Chao Liu committed
46
47
48
    ostream_tensor_descriptor(in_nchw_desc, std::cout << "in_nchw_desc: ");
    ostream_tensor_descriptor(wei_kcyx_desc, std::cout << "wei_kcyx_desc: ");
    ostream_tensor_descriptor(out_nkhw_desc, std::cout << "out_nkhw_desc: ");
Chao Liu's avatar
Chao Liu committed
49
50
51
52
    print_array("LeftPads", to_multi_index(LeftPads{}));
    print_array("RightPads", to_multi_index(RightPads{}));
    print_array("ConvStrides", to_multi_index(ConvStrides{}));
    print_array("ConvDilations", to_multi_index(ConvDilations{}));
Chao Liu's avatar
Chao Liu committed
53

Chao Liu's avatar
Chao Liu committed
54
#if 1
Chao Liu's avatar
Chao Liu committed
55
56
    using in_data_t  = float;
    using out_data_t = float;
Chao Liu's avatar
Chao Liu committed
57
58
59
60
61
62
63
64
65
#else
    using in_data_t  = half_float::half;
    using out_data_t = half_float::half;
#endif

    Tensor<in_data_t> in_nchw(make_HostTensorDescriptor(in_nchw_desc));
    Tensor<in_data_t> wei_kcyx(make_HostTensorDescriptor(wei_kcyx_desc));
    Tensor<out_data_t> out_nkhw_host(make_HostTensorDescriptor(out_nkhw_desc));
    Tensor<out_data_t> out_nkhw_device(make_HostTensorDescriptor(out_nkhw_desc));
Chao Liu's avatar
Chao Liu committed
66

Chao Liu's avatar
Chao Liu committed
67
    std::size_t num_thread = std::thread::hardware_concurrency();
Chao Liu's avatar
Chao Liu committed
68

Chao Liu's avatar
Chao Liu committed
69
70
71
72
73
74
75
    if(argc != 3)
    {
        printf("arg1: do_verification, arg2: nrepeat\n");
        exit(1);
    }

    bool do_verification = atoi(argv[1]);
Chao Liu's avatar
Chao Liu committed
76
    index_t nrepeat      = atoi(argv[2]);
77
78
79

    if(do_verification)
    {
Chao Liu's avatar
Chao Liu committed
80
#if 0
81
        in_nchw.GenerateTensorValue(GeneratorTensor_1{}, num_thread);
Chao Liu's avatar
Chao Liu committed
82
        wei_kcyx.GenerateTensorValue(GeneratorTensor_1{}, num_thread);
Chao Liu's avatar
Chao Liu committed
83
84
#elif 0
        in_nchw.GenerateTensorValue(GeneratorTensor_1{}, num_thread);
Chao Liu's avatar
bug fix  
Chao Liu committed
85
        wei_kcyx.GenerateTensorValue(GeneratorTensor_3{}, num_thread);
86
87
88
#elif 0
        in_nchw.GenerateTensorValue(GeneratorTensor_3{}, num_thread);
        wei_kcyx.GenerateTensorValue(GeneratorTensor_1{}, num_thread);
Chao Liu's avatar
Chao Liu committed
89
#elif 1
90
        in_nchw.GenerateTensorValue(GeneratorTensor_2{-5, 5}, num_thread);
Chao Liu's avatar
Chao Liu committed
91
        wei_kcyx.GenerateTensorValue(GeneratorTensor_2{-5, 5}, num_thread);
Chao Liu's avatar
Chao Liu committed
92
#elif 0
93
94
95
96
97
98
        in_nchw.GenerateTensorValue(GeneratorTensor_2{1, 5}, num_thread);

        auto gen_wei = [](auto... is) {
            return GeneratorTensor_2{1, 5}(is...) * GeneratorTensor_Checkboard{}(is...);
        };
        wei_kcyx.GenerateTensorValue(gen_wei, num_thread);
Chao Liu's avatar
Chao Liu committed
99
#endif
100
    }
Chao Liu's avatar
Chao Liu committed
101

Chao Liu's avatar
Chao Liu committed
102
#if 0
103
    device_convolution_forward_implicit_gemm_v4r1_nchw_kcyx_nkhw(in_nchw_desc,
Chao Liu's avatar
Chao Liu committed
104
105
106
107
108
109
110
                                                         in_nchw,
                                                         wei_kcyx_desc,
                                                         wei_kcyx,
                                                         out_nkhw_desc,
                                                         out_nkhw_device,
                                                         ConvStrides{},
                                                         ConvDilations{},
111
112
                                                         LeftPads{},
                                                         RightPads{},
Chao Liu's avatar
Chao Liu committed
113
                                                         nrepeat);
114
#elif 1
Jing Zhang's avatar
Jing Zhang committed
115
116
117
118
119
120
121
122
123
124
125
    gridwise_convolution_forward_implicit_gemm_v4r4_xdlops_nchw_kcyx_nkhw(in_nchw_desc,
                                                                          in_nchw,
                                                                          wei_kcyx_desc,
                                                                          wei_kcyx,
                                                                          out_nkhw_desc,
                                                                          out_nkhw_device,
                                                                          ConvStrides{},
                                                                          ConvDilations{},
                                                                          LeftPads{},
                                                                          RightPads{},
                                                                          nrepeat);
126
127
128
129
130
131
132
133
134
135
136
137
#elif 1
    device_dynamic_convolution_forward_implicit_gemm_v4r4_nchw_kcyx_nkhw(in_nchw_desc,
                                                                         in_nchw,
                                                                         wei_kcyx_desc,
                                                                         wei_kcyx,
                                                                         out_nkhw_desc,
                                                                         out_nkhw_device,
                                                                         ConvStrides{},
                                                                         ConvDilations{},
                                                                         LeftPads{},
                                                                         RightPads{},
                                                                         nrepeat);
138
#elif 0
Chao Liu's avatar
Chao Liu committed
139
140
141
142
143
144
145
146
147
148
149
    device_dummy_static_transform(in_nchw_desc,
                                  in_nchw,
                                  wei_kcyx_desc,
                                  wei_kcyx,
                                  out_nkhw_desc,
                                  out_nkhw_device,
                                  ConvStrides{},
                                  ConvDilations{},
                                  LeftPads{},
                                  RightPads{},
                                  nrepeat);
Chao Liu's avatar
Chao Liu committed
150
#elif 0
Chao Liu's avatar
Chao Liu committed
151
152
153
154
155
156
157
158
159
160
161
    device_dummy_dynamic_transform_v1(in_nchw_desc,
                                      in_nchw,
                                      wei_kcyx_desc,
                                      wei_kcyx,
                                      out_nkhw_desc,
                                      out_nkhw_device,
                                      ConvStrides{},
                                      ConvDilations{},
                                      LeftPads{},
                                      RightPads{},
                                      nrepeat);
Chao Liu's avatar
Chao Liu committed
162
#elif 1
Chao Liu's avatar
Chao Liu committed
163
164
165
166
167
168
169
170
171
172
173
    device_dummy_dynamic_transform(in_nchw_desc,
                                   in_nchw,
                                   wei_kcyx_desc,
                                   wei_kcyx,
                                   out_nkhw_desc,
                                   out_nkhw_device,
                                   ConvStrides{},
                                   ConvDilations{},
                                   LeftPads{},
                                   RightPads{},
                                   nrepeat);
174
#endif
Chao Liu's avatar
Chao Liu committed
175

176
    if(do_verification)
177
    {
Chao Liu's avatar
Chao Liu committed
178
#if 0
179
180
        if(Y == 3 && X == 3 && ConvStrides{}[0] == 1 && ConvStrides{}[1] == 1 &&
           ConvDilations{}[0] == 1 && ConvDilations{}[1] == 1)
181
        {
Chao Liu's avatar
Chao Liu committed
182
183
            host_winograd_3x3_convolution(
                in_nchw, wei_kcyx, out_nkhw_host, LeftPads{}, RightPads{});
184
185
        }
        else
Chao Liu's avatar
Chao Liu committed
186
#endif
187
        {
188
189
190
191
192
            host_direct_convolution(in_nchw,
                                    wei_kcyx,
                                    out_nkhw_host,
                                    ConvStrides{},
                                    ConvDilations{},
Chao Liu's avatar
Chao Liu committed
193
194
                                    LeftPads{},
                                    RightPads{});
195
196
        }
        check_error(out_nkhw_host, out_nkhw_device);
Chao Liu's avatar
Chao Liu committed
197

Chao Liu's avatar
Chao Liu committed
198
#if 0
199
        LogRange(std::cout << "in_nchw : ", in_nchw.mData, ",") << std::endl;
Chao Liu's avatar
Chao Liu committed
200
        LogRange(std::cout << "wei_kcyx: ", wei_kcyx.mData, ",") << std::endl;
201
202
        LogRange(std::cout << "out_nkhw_host  : ", out_nkhw_host.mData, ",") << std::endl;
        LogRange(std::cout << "out_nkhw_device: ", out_nkhw_device.mData, ",") << std::endl;
Chao Liu's avatar
Chao Liu committed
203
#endif
204
    }
205
}