conv_driver.cpp 24.2 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"
Chao Liu's avatar
Chao Liu committed
14
15
16
#include "device_convolution_forward_implicit_gemm_v4r1_nchw_kcyx_nkhw.hpp"
#include "device_convolution_forward_implicit_gemm_v4r4_nchw_kcyx_nkhw.hpp"
#include "device_convolution_forward_implicit_gemm_v4r4_nhwc_kyxc_nhwk.hpp"
17

Chao Liu's avatar
Chao Liu committed
18
int main(int argc, char* argv[])
Chao Liu's avatar
Chao Liu committed
19
{
Chao Liu's avatar
Chao Liu committed
20
21
    using namespace ck;

22
23
24
25
26
27
28
    if(argc != 5)
    {
        printf("arg1: do_verification, arg2: do_log, arg3: init_method, arg4: nrepeat\n");
        exit(1);
    }

    const bool do_verification = atoi(argv[1]);
zjing14's avatar
zjing14 committed
29
30
    const bool do_log          = atoi(argv[2]);
    const int init_method      = atoi(argv[3]);
31
32
    const int nrepeat          = atoi(argv[4]);

Chao Liu's avatar
Chao Liu committed
33
#if 0
zjing14's avatar
zjing14 committed
34
35
36
37
    constexpr index_t N  = 256;
    constexpr index_t C  = 256;
    constexpr index_t HI = 16;
    constexpr index_t WI = 16;
38
    constexpr index_t K  = 256;
zjing14's avatar
zjing14 committed
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
    constexpr index_t Y  = 1;
    constexpr index_t X  = 1;

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

    using InLeftPads  = Sequence<0, 0>;
    using InRightPads = Sequence<0, 0>;
#elif 0
    constexpr index_t N  = 1;
    constexpr index_t C  = 16;
    constexpr index_t HI = 1080;
    constexpr index_t WI = 1920;
    constexpr index_t K  = 16;
    constexpr index_t Y  = 1;
    constexpr index_t X  = 1;
Chao Liu's avatar
Chao Liu committed
55
56
57
58

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

59
60
    using InLeftPads  = Sequence<1, 1>;
    using InRightPads = Sequence<1, 1>;
Chao Liu's avatar
Chao Liu committed
61
62
63
#elif 0
    constexpr index_t N  = 1;
    constexpr index_t C  = 16;
64
65
    constexpr index_t Hi = 540;
    constexpr index_t Wi = 960;
Chao Liu's avatar
Chao Liu committed
66
67
68
69
70
71
72
    constexpr index_t K  = 16;
    constexpr index_t Y  = 1;
    constexpr index_t X  = 1;

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

73
74
    using InLeftPads  = Sequence<0, 0>;
    using InRightPads = Sequence<0, 0>;
Chao Liu's avatar
Chao Liu committed
75
76
77
#elif 0
    constexpr index_t N  = 1;
    constexpr index_t C  = 16;
78
79
    constexpr index_t Hi = 270;
    constexpr index_t Wi = 480;
Chao Liu's avatar
Chao Liu committed
80
    constexpr index_t K  = 16;
81
82
    constexpr index_t Y  = 1;
    constexpr index_t X  = 1;
Chao Liu's avatar
Chao Liu committed
83
84

    using ConvStrides   = Sequence<1, 1>;
85
    using ConvDilations = Sequence<1, 1>;
Chao Liu's avatar
Chao Liu committed
86

87
88
    using InLeftPads  = Sequence<0, 0>;
    using InRightPads = Sequence<0, 0>;
Chao Liu's avatar
Chao Liu committed
89
#elif 0
Chao Liu's avatar
Chao Liu committed
90
91
    constexpr index_t N  = 1;
    constexpr index_t C  = 16;
92
93
    constexpr index_t Hi = 1080;
    constexpr index_t Wi = 1920;
Chao Liu's avatar
Chao Liu committed
94
95
96
97
98
99
100
    constexpr index_t K  = 16;
    constexpr index_t Y  = 3;
    constexpr index_t X  = 3;

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

101
102
    using InLeftPads  = Sequence<1, 1>;
    using InRightPads = Sequence<1, 1>;
Chao Liu's avatar
Chao Liu committed
103
104
105
#elif 0
    constexpr index_t N  = 1;
    constexpr index_t C  = 1;
106
107
    constexpr index_t Hi = 1024;
    constexpr index_t Wi = 2048;
Chao Liu's avatar
Chao Liu committed
108
109
110
111
112
113
114
    constexpr index_t K  = 4;
    constexpr index_t Y  = 3;
    constexpr index_t X  = 3;

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

115
116
    using InLeftPads  = Sequence<1, 1>;
    using InRightPads = Sequence<1, 1>;
117
#elif 0
Chao Liu's avatar
Chao Liu committed
118
119
    constexpr index_t N  = 1;
    constexpr index_t C  = 16;
120
121
    constexpr index_t Hi = 540;
    constexpr index_t Wi = 960;
Chao Liu's avatar
Chao Liu committed
122
123
124
125
126
127
128
    constexpr index_t K  = 16;
    constexpr index_t Y  = 3;
    constexpr index_t X  = 3;

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

129
130
    using InLeftPads  = Sequence<1, 1>;
    using InRightPads = Sequence<1, 1>;
Chao Liu's avatar
Chao Liu committed
131
132
133
#elif 0
    constexpr index_t N  = 1;
    constexpr index_t C  = 16;
134
135
    constexpr index_t Hi = 270;
    constexpr index_t Wi = 480;
Chao Liu's avatar
Chao Liu committed
136
137
138
139
140
141
142
    constexpr index_t K  = 16;
    constexpr index_t Y  = 3;
    constexpr index_t X  = 3;

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

143
144
    using InLeftPads  = Sequence<1, 1>;
    using InRightPads = Sequence<1, 1>;
Chao Liu's avatar
Chao Liu committed
145
146
147
148
#elif 0
    // 3x3, 36x36, stride 2
    constexpr index_t N  = 128;
    constexpr index_t C  = 192;
149
150
    constexpr index_t Hi = 37;
    constexpr index_t Wi = 37;
Chao Liu's avatar
Chao Liu committed
151
152
153
154
155
156
157
    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>;

158
159
    using InLeftPads  = Sequence<0, 0>;
    using InRightPads = Sequence<0, 0>;
Chao Liu's avatar
Chao Liu committed
160
161
162
163
#elif 0
    // 3x3, 35x35, stride 2
    constexpr index_t N  = 128;
    constexpr index_t C  = 192;
164
165
    constexpr index_t Hi = 35;
    constexpr index_t Wi = 35;
Chao Liu's avatar
Chao Liu committed
166
167
168
169
170
171
172
    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>;

173
174
175
    using InLeftPads  = Sequence<0, 0>;
    using InRightPads = Sequence<0, 0>;
#elif 0
Chao Liu's avatar
Chao Liu committed
176
177
178
    // 3x3, 71x71
    constexpr index_t N  = 128;
    constexpr index_t C  = 192;
zjing14's avatar
zjing14 committed
179
180
181
    constexpr index_t HI = 71;
    constexpr index_t WI = 71;
    constexpr index_t K  = 256;
Chao Liu's avatar
Chao Liu committed
182
183
184
185
186
187
    constexpr index_t Y  = 3;
    constexpr index_t X  = 3;

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

188
189
190
    using InLeftPads  = Sequence<1, 1>;
    using InRightPads = Sequence<1, 1>;
#elif 0
Chao Liu's avatar
Chao Liu committed
191
    // 1x1, 8x8
192
    constexpr index_t N  = 128;
Chao Liu's avatar
Chao Liu committed
193
    constexpr index_t C  = 1536;
194
195
    constexpr index_t Hi = 8;
    constexpr index_t Wi = 8;
Chao Liu's avatar
Chao Liu committed
196
197
198
199
200
201
202
    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>;

203
204
    using InLeftPads  = Sequence<0, 0>;
    using InRightPads = Sequence<0, 0>;
Chao Liu's avatar
Chao Liu committed
205
206
207
208
#elif 0
    // 1x1, 73x73
    constexpr index_t N  = 128;
    constexpr index_t C  = 160;
209
210
    constexpr index_t Hi = 73;
    constexpr index_t Wi = 73;
Chao Liu's avatar
Chao Liu committed
211
212
213
214
215
216
217
    constexpr index_t K  = 64;
    constexpr index_t Y  = 1;
    constexpr index_t X  = 1;

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

218
219
    using InLeftPads  = Sequence<0, 0>;
    using InRightPads = Sequence<0, 0>;
Chao Liu's avatar
Chao Liu committed
220
221
222
223
#elif 0
    // 3x3, 35x35
    constexpr index_t N  = 128;
    constexpr index_t C  = 96;
224
225
    constexpr index_t Hi = 35;
    constexpr index_t Wi = 35;
Chao Liu's avatar
Chao Liu committed
226
    constexpr index_t K  = 128;
Chao Liu's avatar
Chao Liu committed
227
228
229
230
231
232
    constexpr index_t Y  = 3;
    constexpr index_t X  = 3;

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

233
234
235
    using InLeftPads  = Sequence<1, 1>;
    using InRightPads = Sequence<1, 1>;
#elif 0
Chao Liu's avatar
Chao Liu committed
236
237
238
    // 3x3, 71x71
    constexpr index_t N  = 128;
    constexpr index_t C  = 192;
239
240
    constexpr index_t Hi = 71;
    constexpr index_t Wi = 71;
Chao Liu's avatar
Chao Liu committed
241
242
243
244
245
246
247
    constexpr index_t K  = 192;
    constexpr index_t Y  = 3;
    constexpr index_t X  = 3;

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

248
249
    using InLeftPads  = Sequence<1, 1>;
    using InRightPads = Sequence<1, 1>;
Chao Liu's avatar
Chao Liu committed
250
#elif 0
Chao Liu's avatar
Chao Liu committed
251
252
253
    // 7x1, 17x17
    constexpr index_t N  = 128;
    constexpr index_t C  = 128;
254
255
    constexpr index_t Hi = 17;
    constexpr index_t Wi = 17;
Chao Liu's avatar
Chao Liu committed
256
257
258
259
260
261
262
    constexpr index_t K  = 128;
    constexpr index_t Y  = 7;
    constexpr index_t X  = 1;

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

263
264
265
    using InLeftPads  = Sequence<3, 0>;
    using InRightPads = Sequence<3, 0>;
#elif 1
Chao Liu's avatar
Chao Liu committed
266
267
268
    // 1x7, 17x17
    constexpr index_t N  = 128;
    constexpr index_t C  = 128;
269
270
    constexpr index_t Hi = 17;
    constexpr index_t Wi = 17;
Chao Liu's avatar
Chao Liu committed
271
    constexpr index_t K  = 128;
272
273
274
275
276
277
    constexpr index_t Y  = 1;
    constexpr index_t X  = 7;

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

278
279
    using InLeftPads  = Sequence<0, 3>;
    using InRightPads = Sequence<0, 3>;
280
#elif 0
Chao Liu's avatar
Chao Liu committed
281
282
283
    // 3x3, 299x299 stride=2
    constexpr index_t N  = 128;
    constexpr index_t C  = 3;
284
285
    constexpr index_t Hi = 299;
    constexpr index_t Wi = 299;
Chao Liu's avatar
Chao Liu committed
286
    constexpr index_t K  = 32;
287
288
    constexpr index_t Y  = 3;
    constexpr index_t X  = 3;
Chao Liu's avatar
Chao Liu committed
289

Chao Liu's avatar
Chao Liu committed
290
    using ConvStrides   = Sequence<2, 2>;
291
292
    using ConvDilations = Sequence<1, 1>;

293
294
    using InLeftPads  = Sequence<0, 0>;
    using InRightPads = Sequence<0, 0>;
295
#elif 0
Chao Liu's avatar
Chao Liu committed
296
    // 3x3, 147x147
297
    constexpr index_t N  = 128;
Chao Liu's avatar
Chao Liu committed
298
    constexpr index_t C  = 128;
299
300
    constexpr index_t Hi = 147;
    constexpr index_t Wi = 147;
Chao Liu's avatar
Chao Liu committed
301
    constexpr index_t K  = 128;
302
303
304
    constexpr index_t Y  = 3;
    constexpr index_t X  = 3;

Chao Liu's avatar
Chao Liu committed
305
306
307
    using ConvStrides   = Sequence<1, 1>;
    using ConvDilations = Sequence<1, 1>;

308
309
    using InLeftPads  = Sequence<1, 1>;
    using InRightPads = Sequence<1, 1>;
Chao Liu's avatar
Chao Liu committed
310
311
312
313
#elif 0
    // 3x3, 149x149
    constexpr index_t N  = 128;
    constexpr index_t C  = 32;
314
315
    constexpr index_t Hi = 149;
    constexpr index_t Wi = 149;
Chao Liu's avatar
Chao Liu committed
316
317
318
319
320
    constexpr index_t K  = 32;
    constexpr index_t Y  = 3;
    constexpr index_t X  = 3;

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

323
324
    using InLeftPads  = Sequence<0, 0>;
    using InRightPads = Sequence<0, 0>;
Chao Liu's avatar
Chao Liu committed
325
#elif 0
Chao Liu's avatar
Chao Liu committed
326
327
328
    // 3x3, 17x17, stride 2
    constexpr index_t N  = 128;
    constexpr index_t C  = 192;
329
330
    constexpr index_t Hi = 17;
    constexpr index_t Wi = 17;
Chao Liu's avatar
Chao Liu committed
331
332
333
    constexpr index_t K  = 192;
    constexpr index_t Y  = 3;
    constexpr index_t X  = 3;
Chao Liu's avatar
Chao Liu committed
334

Chao Liu's avatar
Chao Liu committed
335
    using ConvStrides   = Sequence<2, 2>;
Chao Liu's avatar
Chao Liu committed
336
337
    using ConvDilations = Sequence<1, 1>;

338
339
    using InLeftPads  = Sequence<0, 0>;
    using InRightPads = Sequence<0, 0>;
Chao Liu's avatar
Chao Liu committed
340
#elif 0
Chao Liu's avatar
Chao Liu committed
341
    // 1x1, 35x35
Chao Liu's avatar
Chao Liu committed
342
    constexpr index_t N  = 128;
Chao Liu's avatar
Chao Liu committed
343
    constexpr index_t C  = 384;
344
345
    constexpr index_t Hi = 35;
    constexpr index_t Wi = 35;
Chao Liu's avatar
Chao Liu committed
346
    constexpr index_t K  = 96;
Chao Liu's avatar
Chao Liu committed
347
348
349
350
351
352
    constexpr index_t Y  = 1;
    constexpr index_t X  = 1;

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

353
354
    using InLeftPads  = Sequence<0, 0>;
    using InRightPads = Sequence<0, 0>;
Chao Liu's avatar
Chao Liu committed
355
#elif 0
Chao Liu's avatar
Chao Liu committed
356
    // 3x3, 35x35, stride 2
Chao Liu's avatar
Chao Liu committed
357
    constexpr index_t N  = 128;
Chao Liu's avatar
Chao Liu committed
358
    constexpr index_t C  = 288;
359
360
    constexpr index_t Hi = 35;
    constexpr index_t Wi = 35;
Chao Liu's avatar
Chao Liu committed
361
    constexpr index_t K  = 384;
Chao Liu's avatar
Chao Liu committed
362
363
    constexpr index_t Y  = 3;
    constexpr index_t X  = 3;
Chao Liu's avatar
Chao Liu committed
364

Chao Liu's avatar
Chao Liu committed
365
    using ConvStrides   = Sequence<2, 2>;
Chao Liu's avatar
Chao Liu committed
366
367
    using ConvDilations = Sequence<1, 1>;

368
369
    using InLeftPads  = Sequence<0, 0>;
    using InRightPads = Sequence<0, 0>;
Chao Liu's avatar
Chao Liu committed
370
#elif 0
Chao Liu's avatar
Chao Liu committed
371
    // 1x3, 8x8
Chao Liu's avatar
Chao Liu committed
372
    constexpr index_t N  = 128;
Chao Liu's avatar
Chao Liu committed
373
    constexpr index_t C  = 384;
374
375
    constexpr index_t Hi = 8;
    constexpr index_t Wi = 8;
Chao Liu's avatar
Chao Liu committed
376
    constexpr index_t K  = 448;
Chao Liu's avatar
Chao Liu committed
377
    constexpr index_t Y  = 1;
Chao Liu's avatar
Chao Liu committed
378
    constexpr index_t X  = 3;
Chao Liu's avatar
Chao Liu committed
379
380
381
382

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

383
384
    using InLeftPads  = Sequence<0, 1>;
    using InRightPads = Sequence<0, 1>;
Chao Liu's avatar
Chao Liu committed
385
#elif 0
Chao Liu's avatar
Chao Liu committed
386
    // 3x1, 8x8
Chao Liu's avatar
Chao Liu committed
387
    constexpr index_t N  = 128;
Chao Liu's avatar
Chao Liu committed
388
    constexpr index_t C  = 448;
389
390
    constexpr index_t Hi = 8;
    constexpr index_t Wi = 8;
Chao Liu's avatar
Chao Liu committed
391
392
    constexpr index_t K  = 512;
    constexpr index_t Y  = 3;
Chao Liu's avatar
Chao Liu committed
393
394
395
396
397
    constexpr index_t X  = 1;

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

398
399
    using InLeftPads  = Sequence<1, 0>;
    using InRightPads = Sequence<1, 0>;
Chao Liu's avatar
Chao Liu committed
400
401
402
403
#elif 0
    // 3x3, 147x147
    constexpr index_t N  = 128;
    constexpr index_t C  = 64;
404
405
    constexpr index_t Hi = 147;
    constexpr index_t Wi = 147;
Chao Liu's avatar
Chao Liu committed
406
407
408
409
410
411
412
    constexpr index_t K  = 96;
    constexpr index_t Y  = 3;
    constexpr index_t X  = 3;

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

413
414
    using InLeftPads  = Sequence<0, 0>;
    using InRightPads = Sequence<0, 0>;
Chao Liu's avatar
Chao Liu committed
415
#elif 0
Chao Liu's avatar
Chao Liu committed
416
    // 7x1, 73x73
Chao Liu's avatar
Chao Liu committed
417
    constexpr index_t N  = 128;
Chao Liu's avatar
Chao Liu committed
418
    constexpr index_t C  = 64;
419
420
    constexpr index_t Hi = 73;
    constexpr index_t Wi = 73;
Chao Liu's avatar
Chao Liu committed
421
422
    constexpr index_t K  = 64;
    constexpr index_t Y  = 7;
Chao Liu's avatar
Chao Liu committed
423
424
425
426
427
    constexpr index_t X  = 1;

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

428
429
    using InLeftPads  = Sequence<3, 0>;
    using InRightPads = Sequence<3, 0>;
Chao Liu's avatar
Chao Liu committed
430
431
432
433
#elif 0
    // 3x3, 73x73
    constexpr index_t N  = 128;
    constexpr index_t C  = 64;
434
435
    constexpr index_t Hi = 73;
    constexpr index_t Wi = 73;
Chao Liu's avatar
Chao Liu committed
436
437
438
439
440
441
442
    constexpr index_t K  = 96;
    constexpr index_t Y  = 3;
    constexpr index_t X  = 3;

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

443
444
    using InLeftPads  = Sequence<0, 0>;
    using InRightPads = Sequence<0, 0>;
Chao Liu's avatar
Chao Liu committed
445
#elif 0
Chao Liu's avatar
Chao Liu committed
446
    // 1x1, 14x14, stride 2
zjing14's avatar
zjing14 committed
447
    constexpr index_t N  = 256;
Chao Liu's avatar
Chao Liu committed
448
    constexpr index_t C  = 1024;
449
450
    constexpr index_t Hi = 14;
    constexpr index_t Wi = 14;
Chao Liu's avatar
Chao Liu committed
451
    constexpr index_t K  = 2048;
Chao Liu's avatar
Chao Liu committed
452
453
454
    constexpr index_t Y  = 1;
    constexpr index_t X  = 1;

Chao Liu's avatar
Chao Liu committed
455
    using ConvStrides   = Sequence<2, 2>;
Chao Liu's avatar
Chao Liu committed
456
457
    using ConvDilations = Sequence<1, 1>;

458
459
    using InLeftPads  = Sequence<0, 0>;
    using InRightPads = Sequence<0, 0>;
460
#elif 0
Chao Liu's avatar
Chao Liu committed
461
    // 1x1, 14x14
zjing14's avatar
zjing14 committed
462
    constexpr index_t N  = 256;
Chao Liu's avatar
Chao Liu committed
463
    constexpr index_t C  = 1024;
464
465
    constexpr index_t Hi = 14;
    constexpr index_t Wi = 14;
Chao Liu's avatar
Chao Liu committed
466
    constexpr index_t K  = 256;
Chao Liu's avatar
Chao Liu committed
467
468
469
470
471
472
    constexpr index_t Y  = 1;
    constexpr index_t X  = 1;

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

473
474
    using InLeftPads  = Sequence<0, 0>;
    using InRightPads = Sequence<0, 0>;
Chao Liu's avatar
Chao Liu committed
475
#elif 0
Chao Liu's avatar
Chao Liu committed
476
    // 1x1, 14x14, stride 2
Chao Liu's avatar
Chao Liu committed
477
    constexpr index_t N  = 128;
Chao Liu's avatar
Chao Liu committed
478
    constexpr index_t C  = 1024;
479
480
    constexpr index_t Hi = 14;
    constexpr index_t Wi = 14;
Chao Liu's avatar
Chao Liu committed
481
    constexpr index_t K  = 512;
Chao Liu's avatar
Chao Liu committed
482
483
484
    constexpr index_t Y  = 1;
    constexpr index_t X  = 1;

Chao Liu's avatar
Chao Liu committed
485
    using ConvStrides   = Sequence<2, 2>;
Chao Liu's avatar
Chao Liu committed
486
487
    using ConvDilations = Sequence<1, 1>;

488
489
    using InLeftPads  = Sequence<0, 0>;
    using InRightPads = Sequence<0, 0>;
Chao Liu's avatar
Chao Liu committed
490
#elif 1
Chao Liu's avatar
Chao Liu committed
491
492
493
    // 3x3, 28x28
    constexpr index_t N  = 128;
    constexpr index_t C  = 128;
494
495
    constexpr index_t Hi = 28;
    constexpr index_t Wi = 28;
Chao Liu's avatar
Chao Liu committed
496
497
498
499
500
501
502
    constexpr index_t K  = 128;
    constexpr index_t Y  = 3;
    constexpr index_t X  = 3;

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

503
504
    using InLeftPads  = Sequence<1, 1>;
    using InRightPads = Sequence<1, 1>;
Chao Liu's avatar
Chao Liu committed
505
506
#elif 1
    // 3x3, 14x14
Chao Liu's avatar
Chao Liu committed
507
    constexpr index_t N  = 128;
Chao Liu's avatar
Chao Liu committed
508
    constexpr index_t C  = 256;
509
510
    constexpr index_t Hi = 14;
    constexpr index_t Wi = 14;
Chao Liu's avatar
Chao Liu committed
511
    constexpr index_t K  = 256;
Chao Liu's avatar
Chao Liu committed
512
513
514
515
516
517
    constexpr index_t Y  = 3;
    constexpr index_t X  = 3;

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

518
519
    using InLeftPads  = Sequence<1, 1>;
    using InRightPads = Sequence<1, 1>;
Chao Liu's avatar
Chao Liu committed
520
#elif 0
Chao Liu's avatar
Chao Liu committed
521
522
523
    // 1x1, 56x56, stride 2
    constexpr index_t N  = 128;
    constexpr index_t C  = 256;
524
525
    constexpr index_t Hi = 56;
    constexpr index_t Wi = 56;
Chao Liu's avatar
Chao Liu committed
526
    constexpr index_t K  = 128;
Chao Liu's avatar
Chao Liu committed
527
528
529
    constexpr index_t Y  = 1;
    constexpr index_t X  = 1;

Chao Liu's avatar
Chao Liu committed
530
    using ConvStrides   = Sequence<2, 2>;
Chao Liu's avatar
Chao Liu committed
531
532
    using ConvDilations = Sequence<1, 1>;

533
534
    using InLeftPads  = Sequence<0, 0>;
    using InRightPads = Sequence<0, 0>;
Chao Liu's avatar
Chao Liu committed
535
#elif 0
Chao Liu's avatar
Chao Liu committed
536
    // 7x7, 230x230 stride=2
Chao Liu's avatar
Chao Liu committed
537
    constexpr index_t N  = 128;
Chao Liu's avatar
Chao Liu committed
538
    constexpr index_t C  = 3;
539
540
    constexpr index_t Hi = 230;
    constexpr index_t Wi = 230;
Chao Liu's avatar
Chao Liu committed
541
542
543
544
545
546
547
    constexpr index_t K  = 64;
    constexpr index_t Y  = 7;
    constexpr index_t X  = 7;

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

548
549
    using InLeftPads  = Sequence<0, 0>;
    using InRightPads = Sequence<0, 0>;
Chao Liu's avatar
Chao Liu committed
550
551
552
553
#elif 0
    // 1x1, 28x28, stride = 2
    constexpr index_t N  = 128;
    constexpr index_t C  = 512;
554
555
    constexpr index_t Hi = 28;
    constexpr index_t Wi = 28;
Chao Liu's avatar
Chao Liu committed
556
    constexpr index_t K  = 1024;
Chao Liu's avatar
Chao Liu committed
557
558
    constexpr index_t Y  = 1;
    constexpr index_t X  = 1;
Chao Liu's avatar
Chao Liu committed
559

Chao Liu's avatar
Chao Liu committed
560
    using ConvStrides   = Sequence<2, 2>;
Chao Liu's avatar
Chao Liu committed
561
562
    using ConvDilations = Sequence<1, 1>;

563
564
    using InLeftPads  = Sequence<0, 0>;
    using InRightPads = Sequence<0, 0>;
565
#elif 0
Chao Liu's avatar
Chao Liu committed
566
    // 1x1, 28x28, stride 2
Chao Liu's avatar
Chao Liu committed
567
    constexpr index_t N  = 128;
Chao Liu's avatar
Chao Liu committed
568
    constexpr index_t C  = 512;
569
570
    constexpr index_t Hi = 28;
    constexpr index_t Wi = 28;
Chao Liu's avatar
Chao Liu committed
571
572
573
    constexpr index_t K  = 256;
    constexpr index_t Y  = 1;
    constexpr index_t X  = 1;
Chao Liu's avatar
Chao Liu committed
574
575
576
577

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

578
579
    using InLeftPads  = Sequence<0, 0>;
    using InRightPads = Sequence<0, 0>;
Chao Liu's avatar
Chao Liu committed
580
#elif 1
Chao Liu's avatar
Chao Liu committed
581
    // 1x1, 7x7
582
    constexpr index_t N  = 128;
Chao Liu's avatar
Chao Liu committed
583
    constexpr index_t C  = 512;
584
585
    constexpr index_t Hi = 7;
    constexpr index_t Wi = 7;
Chao Liu's avatar
Chao Liu committed
586
587
588
    constexpr index_t K  = 2048;
    constexpr index_t Y  = 1;
    constexpr index_t X  = 1;
589
590
591
592

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

593
594
    using InLeftPads  = Sequence<0, 0>;
    using InRightPads = Sequence<0, 0>;
595
#elif 0
Chao Liu's avatar
Chao Liu committed
596
    // 3x3, 7x7
597
    constexpr index_t N  = 128;
Chao Liu's avatar
Chao Liu committed
598
    constexpr index_t C  = 512;
599
600
    constexpr index_t Hi = 7;
    constexpr index_t Wi = 7;
Chao Liu's avatar
Chao Liu committed
601
602
603
    constexpr index_t K  = 512;
    constexpr index_t Y  = 3;
    constexpr index_t X  = 3;
604
605
606
607

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

608
609
    using InLeftPads  = Sequence<1, 1>;
    using InRightPads = Sequence<1, 1>;
Chao Liu's avatar
Chao Liu committed
610
#elif 0
Chao Liu's avatar
Chao Liu committed
611
    // 1x1, 56x56
612
    constexpr index_t N  = 128;
Chao Liu's avatar
Chao Liu committed
613
    constexpr index_t C  = 64;
614
615
    constexpr index_t Hi = 56;
    constexpr index_t Wi = 56;
Chao Liu's avatar
Chao Liu committed
616
617
    constexpr index_t K  = 64;
    constexpr index_t Y  = 1;
618
    constexpr index_t X  = 1;
619
620
621
622

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

623
624
    using InLeftPads  = Sequence<0, 0>;
    using InRightPads = Sequence<0, 0>;
Chao Liu's avatar
Chao Liu committed
625
#elif 0
Chao Liu's avatar
Chao Liu committed
626
627
628
    // 3x3, 56x56
    constexpr index_t N  = 128;
    constexpr index_t C  = 64;
629
630
    constexpr index_t Hi = 56;
    constexpr index_t Wi = 56;
Chao Liu's avatar
Chao Liu committed
631
632
633
634
635
636
637
    constexpr index_t K  = 64;
    constexpr index_t Y  = 3;
    constexpr index_t X  = 3;

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

638
639
    using InLeftPads  = Sequence<1, 1>;
    using InRightPads = Sequence<1, 1>;
Chao Liu's avatar
Chao Liu committed
640
#endif
Chao Liu's avatar
Chao Liu committed
641

642
643
    constexpr index_t YEff = (Y - 1) * ConvDilations{}[0] + 1;
    constexpr index_t XEff = (X - 1) * ConvDilations{}[1] + 1;
Chao Liu's avatar
Chao Liu committed
644

645
646
    constexpr index_t Ho = (Hi + InLeftPads{}[0] + InRightPads{}[0] - YEff) / ConvStrides{}[0] + 1;
    constexpr index_t Wo = (Wi + InLeftPads{}[1] + InRightPads{}[1] - XEff) / ConvStrides{}[1] + 1;
Chao Liu's avatar
Chao Liu committed
647

648
#if 1
Chao Liu's avatar
Chao Liu committed
649
    constexpr index_t in_vector_size = 1;
650
    using in_data_t                  = typename vector_type<float, in_vector_size>::type;
Chao Liu's avatar
Chao Liu committed
651
652
    using acc_data_t                 = float;
    using out_data_t                 = float;
zjing14's avatar
zjing14 committed
653
654
655
656
657
#elif 1
    using in_data_t                  = half_t;
    constexpr index_t in_vector_size = 1;
    using acc_data_t                 = float;
    using out_data_t                 = half_t;
Chao Liu's avatar
Chao Liu committed
658
659
#elif 0
    constexpr index_t in_vector_size = 1;
660
    using in_data_t                  = typename vector_type<float, in_vector_size>::type;
Chao Liu's avatar
Chao Liu committed
661
662
663
    using acc_data_t                 = float;
    using out_data_t                 = int8_t;
#elif 1
664
    constexpr index_t in_vector_size = 16;
665
    using in_data_t                  = typename vector_type<int8_t, in_vector_size>::type;
Chao Liu's avatar
Chao Liu committed
666
667
    using acc_data_t                 = int32_t;
    using out_data_t                 = int8_t;
Chao Liu's avatar
Chao Liu committed
668
669
#endif

670
671
672
673
674
675
    Tensor<in_data_t> in_nchw(HostTensorDescriptor(std::initializer_list<index_t>{N, C, Hi, Wi}));
    Tensor<in_data_t> wei_kcyx(HostTensorDescriptor(std::initializer_list<index_t>{K, C, Y, X}));
    Tensor<out_data_t> out_nkhw_host(
        HostTensorDescriptor(std::initializer_list<index_t>{N, K, Ho, Wo}));
    Tensor<out_data_t> out_nkhw_device(
        HostTensorDescriptor(std::initializer_list<index_t>{N, K, Ho, Wo}));
Chao Liu's avatar
Chao Liu committed
676

677
678
679
    ostream_HostTensorDescriptor(in_nchw.mDesc, std::cout << "in_nchw_desc: ");
    ostream_HostTensorDescriptor(wei_kcyx.mDesc, std::cout << "wei_kcyx_desc: ");
    ostream_HostTensorDescriptor(out_nkhw_host.mDesc, std::cout << "out_nkhw_desc: ");
Chao Liu's avatar
Chao Liu committed
680

681
682
683
684
    print_array("InLeftPads", InLeftPads{});
    print_array("InRightPads", InRightPads{});
    print_array("ConvStrides", ConvStrides{});
    print_array("ConvDilations", ConvDilations{});
Chao Liu's avatar
Chao Liu committed
685

686
    std::size_t num_thread = std::thread::hardware_concurrency();
687
688
689

    if(do_verification)
    {
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
        switch(init_method)
        {
        case 0:
            in_nchw.GenerateTensorValue(GeneratorTensor_1{}, num_thread);
            wei_kcyx.GenerateTensorValue(GeneratorTensor_1{}, num_thread);
            break;
        case 1:
            in_nchw.GenerateTensorValue(GeneratorTensor_1{}, num_thread);
            wei_kcyx.GenerateTensorValue(GeneratorTensor_2{-5, 5}, num_thread);
            break;
        case 2:
            in_nchw.GenerateTensorValue(GeneratorTensor_2{-5, 5}, num_thread);
            wei_kcyx.GenerateTensorValue(GeneratorTensor_1{}, num_thread);
            break;
        case 3:
            in_nchw.GenerateTensorValue(GeneratorTensor_2{-5, 5}, num_thread);
            wei_kcyx.GenerateTensorValue(GeneratorTensor_2{-5, 5}, num_thread);
            break;
        default:
            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);
        }
716
    }
Chao Liu's avatar
Chao Liu committed
717

718
719
720
721
722
    constexpr auto in_nchw_desc  = make_native_tensor_descriptor_packed(Sequence<N, C, Hi, Wi>{});
    constexpr auto wei_kcyx_desc = make_native_tensor_descriptor_packed(Sequence<K, C, Y, X>{});
    constexpr auto out_nkhw_desc = make_native_tensor_descriptor_packed(Sequence<N, K, Ho, Wo>{});

#if 1
Chao Liu's avatar
Chao Liu committed
723
724
725
726
727
728
729
730
    device_convolution_forward_implicit_gemm_v4r1_nchw_kcyx_nkhw(in_nchw_desc,
                                                                 in_nchw,
                                                                 wei_kcyx_desc,
                                                                 wei_kcyx,
                                                                 out_nkhw_desc,
                                                                 out_nkhw_device,
                                                                 ConvStrides{},
                                                                 ConvDilations{},
731
732
                                                                 InLeftPads{},
                                                                 InRightPads{},
Chao Liu's avatar
Chao Liu committed
733
734
735
736
737
738
739
740
741
742
                                                                 nrepeat);
#elif 0
    device_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{},
743
744
                                                                 InLeftPads{},
                                                                 InRightPads{},
Chao Liu's avatar
Chao Liu committed
745
746
747
748
749
750
751
752
753
754
                                                                 nrepeat);
#elif 0
    device_convolution_forward_implicit_gemm_v4r4_nhwc_kyxc_nhwk(in_nchw_desc,
                                                                 in_nchw,
                                                                 wei_kcyx_desc,
                                                                 wei_kcyx,
                                                                 out_nkhw_desc,
                                                                 out_nkhw_device,
                                                                 ConvStrides{},
                                                                 ConvDilations{},
755
756
                                                                 InLeftPads{},
                                                                 InRightPads{},
Chao Liu's avatar
Chao Liu committed
757
                                                                 nrepeat);
758
#endif
Chao Liu's avatar
Chao Liu committed
759

760
    if(do_verification)
761
    {
Chao Liu's avatar
Chao Liu committed
762
763
764
765
766
        host_direct_convolution(in_nchw,
                                wei_kcyx,
                                out_nkhw_host,
                                ConvStrides{},
                                ConvDilations{},
767
768
                                InLeftPads{},
                                InRightPads{});
Chao Liu's avatar
Chao Liu committed
769

770
        check_error(out_nkhw_host, out_nkhw_device);
Chao Liu's avatar
Chao Liu committed
771

Chao Liu's avatar
Chao Liu committed
772
773
774
775
776
777
778
        if(do_log)
        {
            LogRange(std::cout << "in_nchw : ", in_nchw.mData, ",") << std::endl;
            LogRange(std::cout << "wei_kcyx: ", wei_kcyx.mData, ",") << std::endl;
            LogRange(std::cout << "out_nkhw_host  : ", out_nkhw_host.mData, ",") << std::endl;
            LogRange(std::cout << "out_nkhw_device: ", out_nkhw_device.mData, ",") << std::endl;
        }
779
    }
780
}