driver.cpp 21.5 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
7
8
#include "config.hpp"
#include "ConstantTensorDescriptor.hpp"
#include "device.hpp"
Chao Liu's avatar
Chao Liu committed
9
#include "conv_common.hpp"
10
#include "host_conv.hpp"
Chao Liu's avatar
Chao Liu committed
11
#include "device_convolution_direct_v2_nchw_kcyx_nkhw.hpp"
Chao Liu's avatar
Chao Liu committed
12
#include "device_convolution_implicit_gemm_v1_chwn_cyxk_khwn.hpp"
Chao Liu's avatar
Chao Liu committed
13
#include "device_convolution_implicit_gemm_v1_nchw_cyxk_nkhw.hpp"
Chao Liu's avatar
Chao Liu committed
14
#include "device_convolution_implicit_gemm_v2_chwn_cyxk_khwn.hpp"
Chao Liu's avatar
Chao Liu committed
15
#include "device_convolution_implicit_gemm_v3_nchw_cyxk_nkhw.hpp"
Chao Liu's avatar
Chao Liu committed
16
#include "device_convolution_implicit_gemm_v4r1_nchw_kcyx_nkhw.hpp"
Chao Liu's avatar
Chao Liu committed
17
#include "device_convolution_implicit_gemm_v4r2_nchw_kcyx_nkhw.hpp"
Chao Liu's avatar
Chao Liu committed
18
#include "device_convolution_implicit_gemm_v4r3_nchw_kcyx_nkhw.hpp"
Chao Liu's avatar
Chao Liu committed
19
#include "device_convolution_implicit_gemm_v4r4_nchw_kcyx_nkhw.hpp"
20

Chao Liu's avatar
Chao Liu committed
21
struct GeneratorTensor_1
Chao Liu's avatar
Chao Liu committed
22
23
{
    template <class... Is>
Chao Liu's avatar
Chao Liu committed
24
    double operator()(Is... is)
Chao Liu's avatar
Chao Liu committed
25
    {
Chao Liu's avatar
Chao Liu committed
26
        return 1;
Chao Liu's avatar
Chao Liu committed
27
28
29
    }
};

Chao Liu's avatar
Chao Liu committed
30
31
32
33
34
35
36
37
38
39
40
41
struct GeneratorTensor_2
{
    int min_value = 0;
    int max_value = 1;

    template <class... Is>
    double operator()(Is...)
    {
        return (std::rand() % (max_value - min_value)) + min_value;
    }
};

42
43
44
45
46
47
48
struct GeneratorTensor_3
{
    template <class... Is>
    double operator()(Is... is)
    {
        std::array<index_t, sizeof...(Is)> dims = {{static_cast<index_t>(is)...}};

49
        auto f_acc = [](auto a, auto b) { return 100 * a + b; };
50

51
        return std::accumulate(dims.begin(), dims.end(), index_t(0), f_acc);
52
53
54
    }
};

Chao Liu's avatar
Chao Liu committed
55
56
57
58
59
struct GeneratorTensor_Checkboard
{
    template <class... Ts>
    double operator()(Ts... Xs) const
    {
Chao Liu's avatar
Chao Liu committed
60
        std::array<index_t, sizeof...(Ts)> dims = {{Xs...}};
Chao Liu's avatar
Chao Liu committed
61
62
63
        return std::accumulate(dims.begin(),
                               dims.end(),
                               true,
Chao Liu's avatar
Chao Liu committed
64
                               [](bool init, index_t x) -> int { return init != (x % 2); })
Chao Liu's avatar
Chao Liu committed
65
66
67
68
69
                   ? 1
                   : -1;
    }
};

Jehandad Khan's avatar
Jehandad Khan committed
70

Chao Liu's avatar
Chao Liu committed
71
int main(int argc, char* argv[])
Chao Liu's avatar
Chao Liu committed
72
{
Chao Liu's avatar
Chao Liu committed
73
    using namespace ck;
Jehandad Khan's avatar
Jehandad Khan committed
74
    ConvolutionDir dir = Forward;
75
#if 1
Jehandad Khan's avatar
Jehandad Khan committed
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
    constexpr index_t N  = 64;
    constexpr index_t C  = 384;
    constexpr index_t HI = 8;
    constexpr index_t WI = 8;
    constexpr index_t K  = 128;
    constexpr index_t Y  = 1;
    constexpr index_t X  = 1;

    using ConvStrides   = Sequence<1, 1>;
    using ConvDilations = Sequence<1, 1>;

    constexpr index_t HPad = 0;
    constexpr index_t WPad = 0;
    dir = BackwardWeights;
#elif 0
Jehandad Khan's avatar
Jehandad Khan committed
91
    constexpr index_t N  = 64;
Chao Liu's avatar
Chao Liu committed
92
    constexpr index_t C  = 1536;
Chao Liu's avatar
Chao Liu committed
93
94
    constexpr index_t HI = 8;
    constexpr index_t WI = 8;
Chao Liu's avatar
Chao Liu committed
95
    constexpr index_t K  = 256;
Chao Liu's avatar
Chao Liu committed
96
97
98
99
100
    constexpr index_t Y  = 1;
    constexpr index_t X  = 1;

    using ConvStrides   = Sequence<1, 1>;
    using ConvDilations = Sequence<1, 1>;
Chao Liu's avatar
Chao Liu committed
101
102
103

    constexpr index_t HPad = 0;
    constexpr index_t WPad = 0;
Jehandad Khan's avatar
Jehandad Khan committed
104
    dir = BackwardWeights;
105
#elif 0
106
    // 3x3, 34x34
107
    constexpr index_t N  = 128;
108
    constexpr index_t C  = 256;
109
110
    constexpr index_t HI = 34;
    constexpr index_t WI = 34;
111
112
113
    constexpr index_t K  = 128;
    constexpr index_t Y  = 3;
    constexpr index_t X  = 3;
Chao Liu's avatar
Chao Liu committed
114

Chao Liu's avatar
Chao Liu committed
115
    using ConvStrides   = Sequence<1, 1>;
116
117
    using ConvDilations = Sequence<1, 1>;

Chao Liu's avatar
Chao Liu committed
118
119
    constexpr index_t HPad = 0;
    constexpr index_t WPad = 0;
Chao Liu's avatar
Chao Liu committed
120
#elif 0
121
    // 3x3, 56x56
Chao Liu's avatar
Chao Liu committed
122
123
    constexpr index_t N  = 64;
    constexpr index_t C  = 64;
124
125
    constexpr index_t HI = 56;
    constexpr index_t WI = 56;
Chao Liu's avatar
Chao Liu committed
126
127
128
    constexpr index_t K  = 128;
    constexpr index_t Y  = 3;
    constexpr index_t X  = 3;
Chao Liu's avatar
Chao Liu committed
129
130
131

    constexpr index_t HPad = 0;
    constexpr index_t WPad = 0;
Chao Liu's avatar
Chao Liu committed
132
#elif 0
Chao Liu's avatar
Chao Liu committed
133
134
135
136
137
    // 3x3 filter, 28x28 image
    constexpr index_t N  = 128;
    constexpr index_t C  = 256;
    constexpr index_t HI = 28;
    constexpr index_t WI = 28;
138
    constexpr index_t K  = 128;
Chao Liu's avatar
Chao Liu committed
139
140
141
    constexpr index_t Y  = 3;
    constexpr index_t X  = 3;

Chao Liu's avatar
Chao Liu committed
142
    using ConvStrides   = Sequence<1, 1>;
143
144
    using ConvDilations = Sequence<1, 1>;

Chao Liu's avatar
Chao Liu committed
145
146
    constexpr index_t HPad = 0;
    constexpr index_t WPad = 0;
Chao Liu's avatar
Chao Liu committed
147
#elif 0
Chao Liu's avatar
Chao Liu committed
148
    // 1x1 filter, 28x28 image
149
150
    constexpr index_t N  = 128;
    constexpr index_t C  = 512;
Chao Liu's avatar
Chao Liu committed
151
152
153
154
155
156
    constexpr index_t HI = 28;
    constexpr index_t WI = 28;
    constexpr index_t K  = 512;
    constexpr index_t Y  = 1;
    constexpr index_t X  = 1;

Chao Liu's avatar
Chao Liu committed
157
158
159
    using ConvStrides   = Sequence<1, 1>;
    using ConvDilations = Sequence<1, 1>;

Chao Liu's avatar
Chao Liu committed
160
161
    constexpr index_t HPad = 0;
    constexpr index_t WPad = 0;
162
163
#elif 0
    // 3x3 filter, 20x84 image, 1x1 padding
Chao Liu's avatar
Chao Liu committed
164
165
166
167
168
169
170
171
172
173
    constexpr index_t N  = 16;
    constexpr index_t C  = 256;
    constexpr index_t HI = 20;
    constexpr index_t WI = 84;
    constexpr index_t K  = 256;
    constexpr index_t Y  = 3;
    constexpr index_t X  = 3;

    constexpr index_t HPad = 1;
    constexpr index_t WPad = 1;
Chao Liu's avatar
Chao Liu committed
174
175
#elif 0
    // 3x3 filter, 112x112 image, 1x1 padding
Chao Liu's avatar
Chao Liu committed
176
177
178
179
180
181
182
183
184
185
    constexpr index_t N  = 16;
    constexpr index_t C  = 64;
    constexpr index_t HI = 112;
    constexpr index_t WI = 112;
    constexpr index_t K  = 128;
    constexpr index_t Y  = 3;
    constexpr index_t X  = 3;

    constexpr index_t HPad = 1;
    constexpr index_t WPad = 1;
186
#elif 0
187
188
189
190
191
192
193
194
195
196
197
    // 5x5 filter, 20x86 image
    constexpr index_t N  = 16;
    constexpr index_t C  = 256;
    constexpr index_t HI = 20;
    constexpr index_t WI = 86;
    constexpr index_t K  = 512;
    constexpr index_t Y  = 5;
    constexpr index_t X  = 5;

    constexpr index_t HPad = 0;
    constexpr index_t WPad = 0;
Chao Liu's avatar
Chao Liu committed
198
199
#elif 0
    // 5x5 filter, 20x86 image, 1x1 padding
Chao Liu's avatar
Chao Liu committed
200
201
202
203
204
205
206
207
208
209
    constexpr index_t N  = 16;
    constexpr index_t C  = 256;
    constexpr index_t HI = 20;
    constexpr index_t WI = 86;
    constexpr index_t K  = 512;
    constexpr index_t Y  = 5;
    constexpr index_t X  = 5;

    constexpr index_t HPad = 1;
    constexpr index_t WPad = 1;
Chao Liu's avatar
Chao Liu committed
210
211
#elif 0
    // 5x5 filter, 28x28 image, 2x2 padding
Chao Liu's avatar
Chao Liu committed
212
213
214
215
216
217
218
219
220
221
    constexpr index_t N  = 16;
    constexpr index_t C  = 192;
    constexpr index_t HI = 28;
    constexpr index_t WI = 28;
    constexpr index_t K  = 32;
    constexpr index_t Y  = 5;
    constexpr index_t X  = 5;

    constexpr index_t HPad = 2;
    constexpr index_t WPad = 2;
Chao Liu's avatar
Chao Liu committed
222
#elif 0
223
    // 3x3 filter, 14x14 image
Chao Liu's avatar
Chao Liu committed
224
    constexpr index_t N  = 128;
225
    constexpr index_t C  = 256;
Chao Liu's avatar
Chao Liu committed
226
227
    constexpr index_t HI = 14;
    constexpr index_t WI = 14;
228
229
230
    constexpr index_t K  = 128;
    constexpr index_t Y  = 3;
    constexpr index_t X  = 3;
Chao Liu's avatar
Chao Liu committed
231
232
233

    constexpr index_t HPad = 0;
    constexpr index_t WPad = 0;
Chao Liu's avatar
Chao Liu committed
234
#elif 0
235
    // 1x1 filter, 14x14 image
Chao Liu's avatar
Chao Liu committed
236
237
238
239
240
241
242
243
    constexpr index_t N  = 128;
    constexpr index_t C  = 512;
    constexpr index_t HI = 14;
    constexpr index_t WI = 14;
    constexpr index_t K  = 512;
    constexpr index_t Y  = 1;
    constexpr index_t X  = 1;

244
245
246
    using ConvStrides   = Sequence<1, 1>;
    using ConvDilations = Sequence<1, 1>;

Chao Liu's avatar
Chao Liu committed
247
248
249
250
251
252
253
254
255
256
257
258
    constexpr index_t HPad = 0;
    constexpr index_t WPad = 0;
#elif 0
    // 1x1 filter, 7x7 image
    constexpr index_t N  = 128;
    constexpr index_t C  = 512;
    constexpr index_t HI = 7;
    constexpr index_t WI = 7;
    constexpr index_t K  = 2048;
    constexpr index_t Y  = 1;
    constexpr index_t X  = 1;

259
260
    constexpr index_t HPad = 0;
    constexpr index_t WPad = 0;
Chao Liu's avatar
Chao Liu committed
261
#elif 0
262
263
    // 1x1 filter, 73x73 image
    constexpr index_t N  = 128;
Chao Liu's avatar
Chao Liu committed
264
    constexpr index_t C  = 512;
265
266
267
268
269
270
    constexpr index_t HI = 73;
    constexpr index_t WI = 73;
    constexpr index_t K  = 128;
    constexpr index_t Y  = 1;
    constexpr index_t X  = 1;

Chao Liu's avatar
Chao Liu committed
271
272
    constexpr index_t HPad = 0;
    constexpr index_t WPad = 0;
Chao Liu's avatar
Chao Liu committed
273
#elif 1
Chao Liu's avatar
Chao Liu committed
274
    // 1x1 filter, 8x8 image
Chao Liu's avatar
Chao Liu committed
275
    // cudnn@V100 68%, ck@V100 72%, ck@P100 52%, ck@VII 42%
Chao Liu's avatar
Chao Liu committed
276
277
278
279
280
281
282
283
284
285
286
287
288
    constexpr index_t N  = 64;
    constexpr index_t C  = 1536;
    constexpr index_t HI = 8;
    constexpr index_t WI = 8;
    constexpr index_t K  = 256;
    constexpr index_t Y  = 1;
    constexpr index_t X  = 1;

    using ConvStrides   = Sequence<1, 1>;
    using ConvDilations = Sequence<1, 1>;

    constexpr index_t HPad = 0;
    constexpr index_t WPad = 0;
Chao Liu's avatar
Chao Liu committed
289
#elif 0
Chao Liu's avatar
Chao Liu committed
290
    // 1x1 filter, 8x8 image
Chao Liu's avatar
Chao Liu committed
291
    // cudnn@V100 77%, ck@V100 76%, ck@P100 79%, ck@VII 51%
Chao Liu's avatar
Chao Liu committed
292
293
294
295
296
297
298
299
300
301
302
303
304
    constexpr index_t N  = 128;
    constexpr index_t C  = 2048;
    constexpr index_t HI = 8;
    constexpr index_t WI = 8;
    constexpr index_t K  = 384;
    constexpr index_t Y  = 1;
    constexpr index_t X  = 1;

    using ConvStrides   = Sequence<1, 1>;
    using ConvDilations = Sequence<1, 1>;

    constexpr index_t HPad = 0;
    constexpr index_t WPad = 0;
Chao Liu's avatar
Chao Liu committed
305
#elif 0
Chao Liu's avatar
Chao Liu committed
306
    // 1x1 filter, 7x7 image
Chao Liu's avatar
Chao Liu committed
307
    // cudnn@V100 82%, ck@V100 76%, ck@P100 67%, ck@VII 64%
Chao Liu's avatar
Chao Liu committed
308
309
310
311
312
313
314
315
316
317
318
319
320
    constexpr index_t N  = 128;
    constexpr index_t C  = 832;
    constexpr index_t HI = 7;
    constexpr index_t WI = 7;
    constexpr index_t K  = 384;
    constexpr index_t Y  = 1;
    constexpr index_t X  = 1;

    using ConvStrides   = Sequence<1, 1>;
    using ConvDilations = Sequence<1, 1>;

    constexpr index_t HPad = 0;
    constexpr index_t WPad = 0;
Chao Liu's avatar
Chao Liu committed
321
#elif 0
Chao Liu's avatar
Chao Liu committed
322
    // 1x1 filter, 8x8 image
Chao Liu's avatar
Chao Liu committed
323
    // cudnn@V100 83%, ck@V100 75%, ck@P100 78%, ck@VII 65%
Chao Liu's avatar
Chao Liu committed
324
325
326
327
328
329
330
331
332
333
334
335
336
    constexpr index_t N  = 128;
    constexpr index_t C  = 1280;
    constexpr index_t HI = 8;
    constexpr index_t WI = 8;
    constexpr index_t K  = 384;
    constexpr index_t Y  = 1;
    constexpr index_t X  = 1;

    using ConvStrides   = Sequence<1, 1>;
    using ConvDilations = Sequence<1, 1>;

    constexpr index_t HPad = 0;
    constexpr index_t WPad = 0;
Chao Liu's avatar
Chao Liu committed
337
#elif 0
Chao Liu's avatar
Chao Liu committed
338
    // 1x1 filter, 14x14 image
Chao Liu's avatar
Chao Liu committed
339
    // cudnn@V100 62%, ck@V100 68%, ck@P100 70%, ck@VII 50%
Chao Liu's avatar
Chao Liu committed
340
341
342
343
344
345
346
347
348
349
350
351
352
    constexpr index_t N  = 128;
    constexpr index_t C  = 512;
    constexpr index_t HI = 14;
    constexpr index_t WI = 14;
    constexpr index_t K  = 128;
    constexpr index_t Y  = 1;
    constexpr index_t X  = 1;

    using ConvStrides   = Sequence<1, 1>;
    using ConvDilations = Sequence<1, 1>;

    constexpr index_t HPad = 0;
    constexpr index_t WPad = 0;
Chao Liu's avatar
Chao Liu committed
353
#elif 0
Chao Liu's avatar
Chao Liu committed
354
    // 1x1 filter, 8x8 image
Chao Liu's avatar
Chao Liu committed
355
    // cudnn@V100 74%, ck@V100 57%, ck@P100 78%, ck@VII 61%
Chao Liu's avatar
Chao Liu committed
356
357
358
359
360
361
362
363
364
365
366
367
368
    constexpr index_t N  = 64;
    constexpr index_t C  = 1536;
    constexpr index_t HI = 8;
    constexpr index_t WI = 8;
    constexpr index_t K  = 384;
    constexpr index_t Y  = 1;
    constexpr index_t X  = 1;

    using ConvStrides   = Sequence<1, 1>;
    using ConvDilations = Sequence<1, 1>;

    constexpr index_t HPad = 0;
    constexpr index_t WPad = 0;
Chao Liu's avatar
Chao Liu committed
369
#elif 0
Chao Liu's avatar
Chao Liu committed
370
    // 1x1 filter, 28x28 image
Chao Liu's avatar
Chao Liu committed
371
    // cudnn@V100 86%, ck@V100 84%, ck@P100 80%, ck@VII 69%
Chao Liu's avatar
Chao Liu committed
372
373
374
375
376
377
378
379
380
381
382
383
384
    constexpr index_t N  = 128;
    constexpr index_t C  = 256;
    constexpr index_t HI = 28;
    constexpr index_t WI = 28;
    constexpr index_t K  = 128;
    constexpr index_t Y  = 1;
    constexpr index_t X  = 1;

    using ConvStrides   = Sequence<1, 1>;
    using ConvDilations = Sequence<1, 1>;

    constexpr index_t HPad = 0;
    constexpr index_t WPad = 0;
Chao Liu's avatar
Chao Liu committed
385
#elif 0
Chao Liu's avatar
Chao Liu committed
386
    // 1x1 filter, 7x7 image
Chao Liu's avatar
Chao Liu committed
387
    // cudnn@V100 71%, ck@V100 55%, ck@P100 70%, ck@VII 62%
Chao Liu's avatar
Chao Liu committed
388
389
390
391
392
393
394
395
396
397
398
399
400
    constexpr index_t N  = 128;
    constexpr index_t C  = 832;
    constexpr index_t HI = 7;
    constexpr index_t WI = 7;
    constexpr index_t K  = 256;
    constexpr index_t Y  = 1;
    constexpr index_t X  = 1;

    using ConvStrides   = Sequence<1, 1>;
    using ConvDilations = Sequence<1, 1>;

    constexpr index_t HPad = 0;
    constexpr index_t WPad = 0;
Chao Liu's avatar
Chao Liu committed
401
#elif 0
Chao Liu's avatar
Chao Liu committed
402
    // 3x3 filter, 2x2 stride, 35x35 input, 17x17 output
Chao Liu's avatar
Chao Liu committed
403
    // cudnn@V100 90%, ck@V100 93%, ck@P100 83%, ck@VII 81%
Chao Liu's avatar
Chao Liu committed
404
405
406
407
408
409
410
411
412
413
414
415
416
    constexpr index_t N  = 128;
    constexpr index_t C  = 288;
    constexpr index_t HI = 35;
    constexpr index_t WI = 35;
    constexpr index_t K  = 384;
    constexpr index_t Y  = 3;
    constexpr index_t X  = 3;

    using ConvStrides   = Sequence<2, 2>;
    using ConvDilations = Sequence<1, 1>;

    constexpr index_t HPad = 0;
    constexpr index_t WPad = 0;
Chao Liu's avatar
Chao Liu committed
417
#elif 0
Chao Liu's avatar
Chao Liu committed
418
    // 1x1 filter, 17x17 input
Chao Liu's avatar
Chao Liu committed
419
    // cudnn@V100 81%, ck@V100 76%, ck@P100 70%, ck@VII 76%
Chao Liu's avatar
Chao Liu committed
420
421
422
423
424
425
426
427
428
429
430
431
432
    constexpr index_t N  = 128;
    constexpr index_t C  = 768;
    constexpr index_t HI = 17;
    constexpr index_t WI = 17;
    constexpr index_t K  = 128;
    constexpr index_t Y  = 1;
    constexpr index_t X  = 1;

    using ConvStrides   = Sequence<1, 1>;
    using ConvDilations = Sequence<1, 1>;

    constexpr index_t HPad = 0;
    constexpr index_t WPad = 0;
Chao Liu's avatar
Chao Liu committed
433
#elif 0
Chao Liu's avatar
Chao Liu committed
434
    // 1x1 filter, 14x14 image
Chao Liu's avatar
Chao Liu committed
435
    // cudnn@V100 73%, ck@V100 71%, ck@P100 70%, ck@VII 64%
Chao Liu's avatar
Chao Liu committed
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
    constexpr index_t N  = 128;
    constexpr index_t C  = 528;
    constexpr index_t HI = 14;
    constexpr index_t WI = 14;
    constexpr index_t K  = 128;
    constexpr index_t Y  = 1;
    constexpr index_t X  = 1;

    using ConvStrides   = Sequence<1, 1>;
    using ConvDilations = Sequence<1, 1>;

    constexpr index_t HPad = 0;
    constexpr index_t WPad = 0;
#elif 0
    // 1x1 filter, 14x14 image
Chao Liu's avatar
Chao Liu committed
451
    // cudnn@V100 73%, ck@V100 72%, ck@P100 79%, ck@VII 75%
Chao Liu's avatar
Chao Liu committed
452
453
454
455
456
457
458
459
460
461
462
463
464
    constexpr index_t N  = 128;
    constexpr index_t C  = 528;
    constexpr index_t HI = 14;
    constexpr index_t WI = 14;
    constexpr index_t K  = 256;
    constexpr index_t Y  = 1;
    constexpr index_t X  = 1;

    using ConvStrides   = Sequence<1, 1>;
    using ConvDilations = Sequence<1, 1>;

    constexpr index_t HPad = 0;
    constexpr index_t WPad = 0;
Chao Liu's avatar
Chao Liu committed
465
#elif 0
Chao Liu's avatar
Chao Liu committed
466
    // 1x1 filter, 7x7 image
Chao Liu's avatar
Chao Liu committed
467
    // cudnn@V100 49%, ck@V100 50%, ck@P100 61%, ck@VII 52%
Chao Liu's avatar
Chao Liu committed
468
469
470
471
    constexpr index_t N  = 128;
    constexpr index_t C  = 832;
    constexpr index_t HI = 7;
    constexpr index_t WI = 7;
Chao Liu's avatar
Chao Liu committed
472
473
474
    constexpr index_t K  = 128;
    constexpr index_t Y  = 1;
    constexpr index_t X  = 1;
Chao Liu's avatar
Chao Liu committed
475
476
477
478

    using ConvStrides   = Sequence<1, 1>;
    using ConvDilations = Sequence<1, 1>;

Chao Liu's avatar
Chao Liu committed
479
480
    constexpr index_t HPad = 0;
    constexpr index_t WPad = 0;
Chao Liu's avatar
Chao Liu committed
481
#endif
Chao Liu's avatar
Chao Liu committed
482

483
484
485
    auto lower_pads = Sequence<HPad, WPad>{};
    auto upper_pads = Sequence<HPad, WPad>{};

Chao Liu's avatar
Chao Liu committed
486
487
    auto in_nchw_desc  = make_ConstantTensorDescriptor_packed(Sequence<N, C, HI, WI>{});
    auto wei_kcyx_desc = make_ConstantTensorDescriptor_packed(Sequence<K, C, Y, X>{});
488
    auto out_nkhw_desc = get_convolution_with_padding_output_default_4d_tensor_descriptor(
489
        in_nchw_desc, wei_kcyx_desc, ConvStrides{}, ConvDilations{}, lower_pads, upper_pads);
Chao Liu's avatar
Chao Liu committed
490

Chao Liu's avatar
Chao Liu committed
491
    ostream_ConstantTensorDescriptor(in_nchw_desc, std::cout << "in_nchw_desc: ");
Chao Liu's avatar
Chao Liu committed
492
    ostream_ConstantTensorDescriptor(wei_kcyx_desc, std::cout << "wei_kcyx_desc: ");
Chao Liu's avatar
Chao Liu committed
493
    ostream_ConstantTensorDescriptor(out_nkhw_desc, std::cout << "out_nkhw_desc: ");
Chao Liu's avatar
Chao Liu committed
494

Chao Liu's avatar
Chao Liu committed
495
496
    using in_data_t  = float;
    using out_data_t = float;
Jehandad Khan's avatar
Jehandad Khan committed
497
498
499
500
    Tensor<in_data_t> in_nchw_device(make_TensorDescriptor(in_nchw_desc));
    Tensor<in_data_t> wei_kcyx_device(make_TensorDescriptor(wei_kcyx_desc));
    Tensor<in_data_t> in_nchw_host(make_TensorDescriptor(in_nchw_desc));
    Tensor<in_data_t> wei_kcyx_host(make_TensorDescriptor(wei_kcyx_desc));
501
502
    Tensor<out_data_t> out_nkhw_host(make_TensorDescriptor(out_nkhw_desc));
    Tensor<out_data_t> out_nkhw_device(make_TensorDescriptor(out_nkhw_desc));
Chao Liu's avatar
Chao Liu committed
503

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

Chao Liu's avatar
Chao Liu committed
506
507
508
509
510
511
512
    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
513
    index_t nrepeat      = atoi(argv[2]);
514
515
516

    if(do_verification)
    {
Chao Liu's avatar
Chao Liu committed
517
#if 0
518
        in_nchw.GenerateTensorValue(GeneratorTensor_1{}, num_thread);
Chao Liu's avatar
Chao Liu committed
519
        wei_kcyx.GenerateTensorValue(GeneratorTensor_1{}, num_thread);
Chao Liu's avatar
Chao Liu committed
520
521
522
#elif 0
        in_nchw.GenerateTensorValue(GeneratorTensor_1{}, num_thread);
        wei_kcyx.GenerateTensorValue(GeneratorTensor_2{-5, 5}, num_thread);
523
524
525
#elif 0
        in_nchw.GenerateTensorValue(GeneratorTensor_3{}, num_thread);
        wei_kcyx.GenerateTensorValue(GeneratorTensor_1{}, num_thread);
Chao Liu's avatar
Chao Liu committed
526
#elif 1
Jehandad Khan's avatar
Jehandad Khan committed
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
        in_nchw_device.GenerateTensorValue(GeneratorTensor_2{-5, 5}, num_thread);
        assert(in_nchw_device.mData.size() == in_nchw_host.mData.size());
        for(auto i = 0; i < in_nchw_device.mData.size(); ++i)
        {
            in_nchw_host.mData[i] = in_nchw_device.mData[i];
        }
        wei_kcyx_device.GenerateTensorValue(GeneratorTensor_2{-5, 5}, num_thread);
        assert(wei_kcyx_device.mData.size() == wei_kcyx_host.mData.size());
        for(auto i =0; i < wei_kcyx_device.mData.size(); ++i)
        {
            wei_kcyx_host.mData[i] = wei_kcyx_device.mData[i];
        }
        out_nkhw_device.GenerateTensorValue(GeneratorTensor_2{-5, 5}, num_thread);
        assert(out_nkhw_device.mData.size() == out_nkhw_host.mData.size());
        for(auto i = 0; i < out_nkhw_device.mData.size(); ++i)
        {
            out_nkhw_host.mData[i] = out_nkhw_device.mData[i];
        }
Chao Liu's avatar
Chao Liu committed
545
#elif 0
546
547
548
549
550
551
        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
552
#endif
553
    }
Chao Liu's avatar
Chao Liu committed
554

Chao Liu's avatar
Chao Liu committed
555
#if 0
Chao Liu's avatar
Chao Liu committed
556
    device_convolution_direct_v2_nchw_kcyx_nkhw
Chao Liu's avatar
Chao Liu committed
557
        (in_nchw_desc, in_nchw, wei_kcyx_desc, wei_kcyx, out_nkhw_desc, out_nkhw_device, nrepeat);
558
#elif 0
Chao Liu's avatar
Chao Liu committed
559
    device_convolution_implicit_gemm_v1_chwn_cyxk_khwn(
Chao Liu's avatar
Chao Liu committed
560
        in_nchw_desc, in_nchw, wei_kcyx_desc, wei_kcyx, out_nkhw_desc, out_nkhw_device, nrepeat);
Chao Liu's avatar
Chao Liu committed
561
#elif 0
Chao Liu's avatar
Chao Liu committed
562
    device_convolution_implicit_gemm_v1_nchw_cyxk_nkhw(
Chao Liu's avatar
Chao Liu committed
563
        in_nchw_desc, in_nchw, wei_kcyx_desc, wei_kcyx, out_nkhw_desc, out_nkhw_device, nrepeat);
564
#elif 0
Chao Liu's avatar
Chao Liu committed
565
    device_convolution_implicit_gemm_v2_chwn_cyxk_khwn(
Chao Liu's avatar
Chao Liu committed
566
        in_nchw_desc, in_nchw, wei_kcyx_desc, wei_kcyx, out_nkhw_desc, out_nkhw_device, nrepeat);
Chao Liu's avatar
Chao Liu committed
567
#elif 0
Chao Liu's avatar
Chao Liu committed
568
    device_convolution_implicit_gemm_v3_nchw_cyxk_nkhw(
Chao Liu's avatar
Chao Liu committed
569
        (in_nchw_desc, in_nchw, wei_kcyx_desc, wei_kcyx, out_nkhw_desc, out_nkhw_device, nrepeat);
Chao Liu's avatar
Chao Liu committed
570
#elif 1
571
572
// this is the same as MIOpen
// I should modify this one 
Chao Liu's avatar
Chao Liu committed
573
    device_convolution_implicit_gemm_v4r1_nchw_kcyx_nkhw(in_nchw_desc,
Jehandad Khan's avatar
Jehandad Khan committed
574
                                                         in_nchw_device,
Chao Liu's avatar
Chao Liu committed
575
                                                         wei_kcyx_desc,
Jehandad Khan's avatar
Jehandad Khan committed
576
                                                         wei_kcyx_device,
Chao Liu's avatar
Chao Liu committed
577
578
579
580
581
                                                         out_nkhw_desc,
                                                         out_nkhw_device,
                                                         ConvStrides{},
                                                         ConvDilations{},
                                                         nrepeat);
Chao Liu's avatar
Chao Liu committed
582
#elif 0
Chao Liu's avatar
Chao Liu committed
583
584
585
586
587
588
    device_convolution_implicit_gemm_v4r2_nchw_kcyx_nkhw(in_nchw_desc,
                                                         in_nchw,
                                                         wei_kcyx_desc,
                                                         wei_kcyx,
                                                         out_nkhw_desc,
                                                         out_nkhw_device,
Chao Liu's avatar
Chao Liu committed
589
590
591
                                                         ConvStrides{},
                                                         ConvDilations{},
                                                         nrepeat);
Chao Liu's avatar
Chao Liu committed
592
#elif 0
Chao Liu's avatar
Chao Liu committed
593
594
595
596
597
598
    device_convolution_implicit_gemm_v4r3_nchw_kcyx_nkhw(in_nchw_desc,
                                                         in_nchw,
                                                         wei_kcyx_desc,
                                                         wei_kcyx,
                                                         out_nkhw_desc,
                                                         out_nkhw_device,
Chao Liu's avatar
Chao Liu committed
599
600
601
                                                         ConvStrides{},
                                                         ConvDilations{},
                                                         nrepeat);
602
#elif 0
Chao Liu's avatar
Chao Liu committed
603
604
605
606
607
608
    device_convolution_implicit_gemm_v4r4_nchw_kcyx_nkhw(in_nchw_desc,
                                                         in_nchw,
                                                         wei_kcyx_desc,
                                                         wei_kcyx,
                                                         out_nkhw_desc,
                                                         out_nkhw_device,
Chao Liu's avatar
Chao Liu committed
609
610
611
                                                         ConvStrides{},
                                                         ConvDilations{},
                                                         nrepeat);
612
#elif 0
Chao Liu's avatar
Chao Liu committed
613
    device_implicit_gemm_convolution_1_chwn_cyxk_khwn_padded(in_nchw_desc,
Chao Liu's avatar
Chao Liu committed
614
                                                             in_nchw,
Chao Liu's avatar
Chao Liu committed
615
616
                                                             wei_kcyx_desc,
                                                             wei_kcyx,
Chao Liu's avatar
Chao Liu committed
617
618
619
620
621
                                                             out_nkhw_desc,
                                                             out_nkhw_device,
                                                             lower_pads,
                                                             upper_pads,
                                                             nrepeat);
622
#endif
Chao Liu's avatar
Chao Liu committed
623

624
    if(do_verification)
625
    {
Jehandad Khan's avatar
Jehandad Khan committed
626
#if 0
627
628
        if(Y == 3 && X == 3 && ConvStrides{}[0] == 1 && ConvStrides{}[1] == 1 &&
           ConvDilations{}[0] == 1 && ConvDilations{}[1] == 1)
629
        {
Chao Liu's avatar
Chao Liu committed
630
            host_winograd_3x3_convolution(in_nchw, wei_kcyx, out_nkhw_host, lower_pads, upper_pads);
631
632
        }
        else
Chao Liu's avatar
Chao Liu committed
633
#endif
634
        {
Jehandad Khan's avatar
Jehandad Khan committed
635
            host_direct_convolution(in_nchw_host,
636
                                    out_nkhw_host,
Jehandad Khan's avatar
Jehandad Khan committed
637
                                    wei_kcyx_host,
638
                                    ConvDilations{},
Jehandad Khan's avatar
Jehandad Khan committed
639
                                    ConvStrides{},
640
                                    lower_pads,
Jehandad Khan's avatar
Jehandad Khan committed
641
                                    upper_pads, dir);
642
        }
Jehandad Khan's avatar
Jehandad Khan committed
643
644
645
646
        if(dir == Forward)
            check_error(out_nkhw_host, out_nkhw_device);
        else
            check_error(wei_kcyx_host, wei_kcyx_device);
Chao Liu's avatar
Chao Liu committed
647

Chao Liu's avatar
Chao Liu committed
648
#if 0
Jehandad Khan's avatar
Jehandad Khan committed
649
        LogRange(std::cout << "in_nchw : ", in_nchw_device.mData, ",") << std::endl;
650
        LogRange(std::cout << "out_nkhw_device: ", out_nkhw_device.mData, ",") << std::endl;
Jehandad Khan's avatar
Jehandad Khan committed
651
652
        LogRange(std::cout << "wei_kcyx_device: ", wei_kcyx_device.mData, ",") << std::endl;
        LogRange(std::cout << "wei_kcyx_host: ", wei_kcyx_host.mData, ",") << std::endl;
Chao Liu's avatar
Chao Liu committed
653
#endif
654
    }
655
}