ops_test.cpp 167 KB
Newer Older
Paul's avatar
Paul committed
1

2
#include <migraphx/env.hpp>
Paul's avatar
Paul committed
3
4
5
#include <migraphx/program.hpp>
#include <migraphx/operators.hpp>
#include <migraphx/generate.hpp>
6
#include <migraphx/ranges.hpp>
Paul's avatar
Paul committed
7
8
9
10
11
12
13
14
#include <migraphx/cpu/target.hpp>
#include <migraphx/gpu/target.hpp>
#include <migraphx/gpu/miopen.hpp>
#include <migraphx/gpu/hip.hpp>
#include <migraphx/manage_ptr.hpp>
#include <migraphx/type_name.hpp>
#include <migraphx/verify_args.hpp>
#include <migraphx/instruction.hpp>
15
#include <migraphx/quantization.hpp>
Paul's avatar
Paul committed
16
17
18

#include <miopen/miopen.h>

Paul's avatar
Paul committed
19
20
#include <future>
#include <thread>
21
#include <numeric>
Paul's avatar
Paul committed
22

Paul's avatar
Paul committed
23
#include <test.hpp>
Paul's avatar
Paul committed
24

Paul's avatar
Paul committed
25
26
27
28
#ifdef __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wglobal-constructors"
#endif
Paul's avatar
Paul committed
29

30
31
MIGRAPHX_DECLARE_ENV_VAR(MIGRAPHX_TRACE_GPU_COMPILE)

Paul's avatar
Paul committed
32
33
// An improved async, that doesn't block
template <class Function>
Paul's avatar
Paul committed
34
35
std::future<typename std::result_of<Function()>::type> detach_async(Function&& f,
                                                                    bool parallel = true)
Paul's avatar
Paul committed
36
{
Paul's avatar
Paul committed
37
38
39
40
41
42
43
44
    if(parallel)
    {
        using result_type = typename std::result_of<Function()>::type;
        std::packaged_task<result_type()> task(std::forward<Function>(f));
        auto fut = task.get_future();
        std::thread(std::move(task)).detach();
        return std::move(fut);
    }
45
    return std::async(std::launch::deferred, std::forward<Function>(f));
Paul's avatar
Paul committed
46
47
}

Paul's avatar
Paul committed
48
49
struct auto_print
{
Paul's avatar
Paul committed
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
    static void set_terminate_handler(const std::string& name)
    {
        static std::string pname;
        pname = name;
        std::set_terminate(+[] {
            std::cout << "FAILED: " << pname << std::endl;
            try
            {
                std::rethrow_exception(std::current_exception());
            }
            catch(const std::exception& e)
            {
                std::cout << "    what(): " << e.what() << std::endl;
            }
            std::cout << std::endl;
            for(auto&& handle : auto_print::handlers)
                handle();
        });
    }
Paul's avatar
Paul committed
69
    static std::array<std::function<void()>, 2> handlers;
Paul's avatar
Paul committed
70
    int index;
Paul's avatar
Paul committed
71
    template <class T>
Paul's avatar
Paul committed
72
    auto_print(T& x, int i) : index(i)
Paul's avatar
Paul committed
73
    {
Paul's avatar
Paul committed
74
        handlers[index] = [&x] { std::cout << x << std::endl; };
Paul's avatar
Paul committed
75
    }
Paul's avatar
Paul committed
76

Paul's avatar
Paul committed
77
    ~auto_print()
Paul's avatar
Paul committed
78
    {
Paul's avatar
Paul committed
79
        handlers[index] = [] {};
Paul's avatar
Paul committed
80
81
    }
};
Paul's avatar
Paul committed
82
std::array<std::function<void()>, 2> auto_print::handlers = {};
Paul's avatar
Paul committed
83

Paul's avatar
Paul committed
84
template <class T>
Paul's avatar
Latest  
Paul committed
85
86
87
88
89
auto get_hash(const T& x)
{
    return std::hash<T>{}(x);
}

90
void compile_check(migraphx::program& p, const migraphx::target& t, bool show_trace = false)
Paul's avatar
Paul committed
91
{
92
93
    auto name   = t.name();
    auto shapes = p.get_output_shapes();
Paul's avatar
Paul committed
94
    std::stringstream ss;
95
96
97
    migraphx::compile_options options;
    options.trace = migraphx::tracer{ss};
    p.compile(t, options);
98
    if(shapes.size() != p.get_output_shapes().size())
Paul's avatar
Paul committed
99
100
    {
        std::cout << ss.str() << std::endl;
101
102
        throw std::runtime_error("Compiling program with " + name +
                                 " alters its number of outputs");
Paul's avatar
Paul committed
103
    }
104
105
106
107
108
109
110
111
112
113
114

    auto num = shapes.size();
    for(std::size_t i = 0; i < num; ++i)
    {
        if(p.get_output_shapes()[i].lens() != shapes[i].lens())
        {
            std::cout << ss.str() << std::endl;
            throw std::runtime_error("Compiling program with " + name + " alters its shape");
        }
    }

115
116
117
118
    if(show_trace)
    {
        std::cout << ss.str() << std::endl;
    }
Paul's avatar
Paul committed
119
120
}

Paul's avatar
Paul committed
121
template <class V>
122
std::vector<migraphx::argument> run_cpu(migraphx::program& p)
Paul's avatar
Paul committed
123
{
Paul's avatar
Paul committed
124
    V v;
Paul's avatar
Paul committed
125
    p = v.create_program();
Paul's avatar
Paul committed
126
    auto_print pp{p, 0};
Paul's avatar
Paul committed
127
128
    compile_check(p, migraphx::cpu::target{});
    migraphx::program::parameter_map m;
Paul's avatar
Paul committed
129
    for(auto&& x : p.get_parameter_shapes())
Paul's avatar
Paul committed
130
    {
Paul's avatar
Paul committed
131
        m[x.first] = migraphx::generate_argument(x.second, get_hash(x.first));
Paul's avatar
Paul committed
132
    }
Paul's avatar
Paul committed
133
    return p.eval(m);
Paul's avatar
Paul committed
134
135
}

Paul's avatar
Paul committed
136
template <class V>
137
std::vector<migraphx::argument> run_gpu(migraphx::program& p)
Paul's avatar
Paul committed
138
{
Paul's avatar
Paul committed
139
    V v;
Paul's avatar
Paul committed
140
    p = v.create_program();
Paul's avatar
Paul committed
141
    auto_print pp{p, 1};
142
    compile_check(p, migraphx::gpu::target{}, migraphx::enabled(MIGRAPHX_TRACE_GPU_COMPILE{}));
Paul's avatar
Paul committed
143
    migraphx::program::parameter_map m;
Paul's avatar
Paul committed
144
    for(auto&& x : p.get_parameter_shapes())
Paul's avatar
Paul committed
145
    {
Paul's avatar
Paul committed
146
147
        m[x.first] =
            migraphx::gpu::to_gpu(migraphx::generate_argument(x.second, get_hash(x.first)));
Paul's avatar
Paul committed
148
    }
Paul's avatar
Paul committed
149
    // Program should have an output parameter
150
151
152
    EXPECT(std::any_of(
        m.begin(), m.end(), [](auto& x) { return migraphx::contains(x.first, "output"); }));

Paul's avatar
Paul committed
153
154
155
156
157
158
    // Ensure the program doesn't modify the context in a dry run
    auto ctx = p.get_context();
    assert(&ctx != &p.get_context());
    EXPECT(is_shared(ctx, p.get_context()));
    p.dry_run(m);
    EXPECT(is_shared(ctx, p.get_context()));
Shucai Xiao's avatar
Shucai Xiao committed
159
    p.eval(m);
160
161
162
163
164
165
166
167

    auto gpu_res = p.eval(m);
    std::vector<migraphx::argument> res(gpu_res.size());
    std::transform(gpu_res.begin(), gpu_res.end(), res.begin(), [&](auto& argu) {
        return migraphx::gpu::from_gpu(argu);
    });

    return res;
Paul's avatar
Paul committed
168
169
}

Paul's avatar
Paul committed
170
template <class V>
Paul's avatar
Paul committed
171
void run_verify_program()
Paul's avatar
Paul committed
172
{
Paul's avatar
Paul committed
173
174
175
176
    auto_print::set_terminate_handler(migraphx::get_type_name<V>());
    // std::cout << migraphx::get_type_name<V>() << std::endl;
    migraphx::program cpu_prog;
    migraphx::program gpu_prog;
Paul's avatar
Paul committed
177
178
    auto cpu_arg_f = detach_async([&] { return run_cpu<V>(cpu_prog); });
    auto gpu_arg   = run_gpu<V>(gpu_prog);
Paul's avatar
Paul committed
179
    auto cpu_arg   = cpu_arg_f.get();
180
181
182
183
184
185
186
187
188

    bool passed = true;
    passed &= (cpu_arg.size() == gpu_arg.size());
    std::size_t num = cpu_arg.size();
    for(std::size_t i = 0; ((i < num) and passed); ++i)
    {
        passed &= verify_args(migraphx::get_type_name<V>(), cpu_arg[i], gpu_arg[i]);
    }

Paul's avatar
Paul committed
189
190
191
192
193
194
195
196
197
    if(not passed)
    {
        V v;
        auto p = v.create_program();
        std::cout << p << std::endl;
        std::cout << "cpu:\n" << cpu_prog << std::endl;
        std::cout << "gpu:\n" << gpu_prog << std::endl;
        std::cout << std::endl;
    }
Paul's avatar
Paul committed
198
    std::set_terminate(nullptr);
Paul's avatar
Paul committed
199
200
}

Paul's avatar
Paul committed
201
template <class T>
Paul's avatar
Paul committed
202
203
204
205
206
207
int auto_register_verify_program()
{
    test::add_test_case(migraphx::get_type_name<T>(), [] { run_verify_program<T>(); });
    return 0;
}

Paul's avatar
Paul committed
208
template <class T>
Paul's avatar
Paul committed
209
210
211
212
213
struct verify_program
{
    static int static_register;
    // This typedef ensures that the static member will be instantiated if
    // the class itself is instantiated
Paul's avatar
Paul committed
214
215
    using static_register_type =
        std::integral_constant<decltype(&static_register), &static_register>;
Paul's avatar
Paul committed
216
217
};

Paul's avatar
Paul committed
218
template <class T>
Paul's avatar
Paul committed
219
int verify_program<T>::static_register = auto_register_verify_program<T>(); // NOLINT
Paul's avatar
Paul committed
220
221

struct test_literals : verify_program<test_literals>
Paul's avatar
Paul committed
222
{
Paul's avatar
Paul committed
223
    migraphx::program create_program() const
Paul's avatar
Paul committed
224
    {
Paul's avatar
Paul committed
225
        migraphx::program p;
Paul's avatar
Paul committed
226
        auto input = p.add_literal(
Paul's avatar
Paul committed
227
            generate_literal(migraphx::shape{migraphx::shape::float_type, {4, 3, 3, 3}}));
Paul's avatar
Paul committed
228
        auto weights = p.add_literal(
Paul's avatar
Paul committed
229
230
231
            generate_literal(migraphx::shape{migraphx::shape::float_type, {4, 3, 3, 3}}));
        auto conv = p.add_instruction(migraphx::op::convolution{}, input, weights);
        p.add_instruction(migraphx::op::relu{}, conv);
Paul's avatar
Paul committed
232
233
234
235
        return p;
    }
};

Paul's avatar
Paul committed
236
struct test_add : verify_program<test_add>
Paul's avatar
Paul committed
237
{
Paul's avatar
Paul committed
238
    migraphx::program create_program() const
Paul's avatar
Paul committed
239
    {
Paul's avatar
Paul committed
240
241
        migraphx::program p;
        migraphx::shape s{migraphx::shape::float_type, {3}};
Paul's avatar
Paul committed
242
243
        auto x = p.add_parameter("x", s);
        auto y = p.add_parameter("y", s);
Paul's avatar
Paul committed
244
        p.add_instruction(migraphx::op::add{}, x, y);
Paul's avatar
Paul committed
245
246
247
248
        return p;
    }
};

Paul's avatar
Paul committed
249
struct test_add_half : verify_program<test_add_half>
Paul's avatar
Paul committed
250
{
Paul's avatar
Paul committed
251
    migraphx::program create_program() const
Paul's avatar
Paul committed
252
    {
Paul's avatar
Paul committed
253
254
        migraphx::program p;
        migraphx::shape s{migraphx::shape::half_type, {3}};
Paul's avatar
Paul committed
255
256
        auto x = p.add_parameter("x", s);
        auto y = p.add_parameter("y", s);
Paul's avatar
Paul committed
257
        p.add_instruction(migraphx::op::add{}, x, y);
Paul's avatar
Paul committed
258
259
260
261
        return p;
    }
};

Paul's avatar
Paul committed
262
struct test_mul : verify_program<test_mul>
Khalique's avatar
Khalique committed
263
{
Paul's avatar
Paul committed
264
    migraphx::program create_program() const
Khalique's avatar
Khalique committed
265
    {
Paul's avatar
Paul committed
266
267
        migraphx::program p;
        migraphx::shape s{migraphx::shape::float_type, {3}};
Khalique's avatar
Khalique committed
268
269
        auto x = p.add_parameter("x", s);
        auto y = p.add_parameter("y", s);
Paul's avatar
Paul committed
270
        p.add_instruction(migraphx::op::mul{}, x, y);
Khalique's avatar
Khalique committed
271
272
273
274
        return p;
    }
};

Paul's avatar
Paul committed
275
struct test_exp : verify_program<test_exp>
Shucai Xiao's avatar
Shucai Xiao committed
276
277
278
279
280
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape s{migraphx::shape::float_type, {6}};
281
        auto x = p.add_instruction(migraphx::op::abs{}, p.add_parameter("x", s));
Shucai Xiao's avatar
Shucai Xiao committed
282
283
284
285
286
        p.add_instruction(migraphx::op::exp{}, x);
        return p;
    }
};

Shucai Xiao's avatar
Shucai Xiao committed
287
288
289
290
291
292
293
294
295
296
297
298
struct test_erf : verify_program<test_erf>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape s{migraphx::shape::float_type, {2, 3, 4, 6}};
        auto param = p.add_parameter("x", s);
        p.add_instruction(migraphx::op::erf{}, param);
        return p;
    }
};

Shucai Xiao's avatar
Shucai Xiao committed
299
300
301
302
303
304
struct test_sqrt : verify_program<test_sqrt>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape s{migraphx::shape::float_type, {2, 3, 4, 6}};
Shucai Xiao's avatar
Shucai Xiao committed
305
        auto param     = p.add_parameter("x", s);
Shucai Xiao's avatar
Shucai Xiao committed
306
307
308
309
310
311
        auto param_abs = p.add_instruction(migraphx::op::abs{}, param);
        p.add_instruction(migraphx::op::sqrt{}, param_abs);
        return p;
    }
};

312
313
314
315
316
317
struct test_sign : verify_program<test_sign>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape s{migraphx::shape::double_type, {2, 3, 4, 6}};
Shucai Xiao's avatar
Shucai Xiao committed
318
        auto param = p.add_parameter("x", s);
319
320
321
322
323
        p.add_instruction(migraphx::op::sign{}, param);
        return p;
    }
};

Paul's avatar
Paul committed
324
struct test_log : verify_program<test_log>
Shucai Xiao's avatar
Shucai Xiao committed
325
326
327
328
329
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape s{migraphx::shape::float_type, {6}};
330
        auto x = p.add_instruction(migraphx::op::abs{}, p.add_parameter("x", s));
Shucai Xiao's avatar
Shucai Xiao committed
331
332
333
334
335
        p.add_instruction(migraphx::op::log{}, x);
        return p;
    }
};

Shucai Xiao's avatar
Shucai Xiao committed
336
337
338
339
340
341
342
343
344
345
346
347
348
349
struct test_pow : verify_program<test_pow>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape s{migraphx::shape::float_type, {6}};
        std::vector<float> vec_e(s.elements(), 2.0f);
        auto b = p.add_parameter("x", s);
        auto e = p.add_literal(migraphx::literal(s, vec_e));
        p.add_instruction(migraphx::op::pow{}, b, e);
        return p;
    }
};

Shucai Xiao's avatar
Shucai Xiao committed
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
struct test_prelu_brcst : verify_program<test_prelu_brcst>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape s{migraphx::shape::float_type, {6}};
        auto x   = p.add_parameter("x", s);
        auto slp = p.add_parameter("slp", s);
        auto r   = p.add_instruction(migraphx::op::prelu{}, x, slp);
        p.add_return({r});

        return p;
    }
};

Paul's avatar
Paul committed
365
struct test_sin : verify_program<test_sin>
366
367
368
369
370
371
372
373
374
375
376
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape s{migraphx::shape::float_type, {10}};
        auto x = p.add_parameter("x", s);
        p.add_instruction(migraphx::op::sin{}, x);
        return p;
    }
};

Paul's avatar
Paul committed
377
struct test_cos : verify_program<test_cos>
Shucai Xiao's avatar
Shucai Xiao committed
378
379
380
381
382
383
384
385
386
387
388
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape s{migraphx::shape::double_type, {8}};
        auto x = p.add_parameter("x", s);
        p.add_instruction(migraphx::op::cos{}, x);
        return p;
    }
};

Paul's avatar
Paul committed
389
struct test_tan : verify_program<test_tan>
Shucai Xiao's avatar
Shucai Xiao committed
390
391
392
393
394
395
396
397
398
399
400
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape s{migraphx::shape::float_type, {16}};
        auto x = p.add_parameter("x", s);
        p.add_instruction(migraphx::op::tan{}, x);
        return p;
    }
};

Paul's avatar
Paul committed
401
struct test_sinh : verify_program<test_sinh>
402
403
404
405
406
407
408
409
410
411
412
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape s{migraphx::shape::double_type, {16}};
        auto x = p.add_parameter("x", s);
        p.add_instruction(migraphx::op::sinh{}, x);
        return p;
    }
};

Paul's avatar
Paul committed
413
struct test_cosh : verify_program<test_cosh>
414
415
416
417
418
419
420
421
422
423
424
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape s{migraphx::shape::double_type, {16}};
        auto x = p.add_parameter("x", s);
        p.add_instruction(migraphx::op::cosh{}, x);
        return p;
    }
};

Paul's avatar
Paul committed
425
struct test_tanh : verify_program<test_tanh>
426
427
428
429
430
431
432
433
434
435
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        auto x = p.add_parameter("x", migraphx::shape{migraphx::shape::float_type, {4, 3, 3, 3}});
        p.add_instruction(migraphx::op::tanh{}, x);
        return p;
    }
};

436
437
438
439
440
struct test_trans_tanh : verify_program<test_trans_tanh>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
Shucai Xiao's avatar
Shucai Xiao committed
441
        auto x  = p.add_parameter("x", migraphx::shape{migraphx::shape::float_type, {4, 3, 3, 3}});
442
443
        auto tx = p.add_instruction(migraphx::op::transpose{{0, 1, 3, 2}}, x);
        auto tanhx = p.add_instruction(migraphx::op::tanh{}, tx);
Shucai Xiao's avatar
Shucai Xiao committed
444
        auto r     = p.add_instruction(migraphx::op::add{}, tanhx, tanhx);
445
446
        p.add_instruction(migraphx::op::contiguous{}, r);

447
448
449
450
        return p;
    }
};

451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
struct test_trans_tanh1 : verify_program<test_trans_tanh1>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        auto x  = p.add_parameter("x", migraphx::shape{migraphx::shape::float_type, {4, 3, 3, 3}});
        auto tx = p.add_instruction(migraphx::op::transpose{{0, 1, 3, 2}}, x);
        auto tanhx = p.add_instruction(migraphx::op::tanh{}, tx);
        auto r     = p.add_instruction(migraphx::op::add{}, tanhx, tanhx);
        p.add_return({tx, r});

        return p;
    }
};

466
467
468
469
470
struct test_slice_sin : verify_program<test_slice_sin>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
Shucai Xiao's avatar
Shucai Xiao committed
471
472
        auto l = p.add_parameter("x", migraphx::shape{migraphx::shape::float_type, {2, 2}});
        auto t = p.add_instruction(migraphx::op::slice{{1}, {1}, {2}}, l);
473
474
        p.add_instruction(migraphx::op::sin{}, t);

475
476
477
478
        return p;
    }
};

Paul's avatar
Paul committed
479
struct test_asin : verify_program<test_asin>
480
481
482
483
484
485
486
487
488
489
490
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape s{migraphx::shape::double_type, {16}};
        auto x = p.add_parameter("x", s);
        p.add_instruction(migraphx::op::asin{}, x);
        return p;
    }
};

Paul's avatar
Paul committed
491
struct test_acos : verify_program<test_acos>
492
493
494
495
496
497
498
499
500
501
502
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape s{migraphx::shape::double_type, {16}};
        auto x = p.add_parameter("x", s);
        p.add_instruction(migraphx::op::acos{}, x);
        return p;
    }
};

Paul's avatar
Paul committed
503
struct test_atan : verify_program<test_atan>
504
505
506
507
508
509
510
511
512
513
514
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape s{migraphx::shape::double_type, {16}};
        auto x = p.add_parameter("x", s);
        p.add_instruction(migraphx::op::atan{}, x);
        return p;
    }
};

515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
struct test_asinh : verify_program<test_asinh>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape s{migraphx::shape::double_type, {16}};
        auto x = p.add_parameter("x", s);
        p.add_instruction(migraphx::op::asinh{}, x);
        return p;
    }
};

struct test_acosh : verify_program<test_acosh>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape s{migraphx::shape::float_type, {16}};
kahmed10's avatar
kahmed10 committed
533
534
535
536
537
538
        auto x       = p.add_parameter("x", s);
        auto min_val = p.add_literal(1.1f);
        auto max_val = p.add_literal(100.0f);
        min_val      = p.add_instruction(migraphx::op::multibroadcast{{16}}, min_val);
        max_val      = p.add_instruction(migraphx::op::multibroadcast{{16}}, max_val);
        auto cx      = p.add_instruction(migraphx::op::clip{}, x, min_val, max_val);
539
540
541
542
543
544
545
546
547
548
549
        p.add_instruction(migraphx::op::acosh{}, cx);
        return p;
    }
};

struct test_atanh : verify_program<test_atanh>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape s{migraphx::shape::double_type, {16}};
kahmed10's avatar
kahmed10 committed
550
551
552
553
554
555
        auto x       = p.add_parameter("x", s);
        auto min_val = p.add_literal(-0.95);
        auto max_val = p.add_literal(0.95);
        min_val      = p.add_instruction(migraphx::op::multibroadcast{{16}}, min_val);
        max_val      = p.add_instruction(migraphx::op::multibroadcast{{16}}, max_val);
        auto cx      = p.add_instruction(migraphx::op::clip{}, x, min_val, max_val);
556
557
558
559
560
        p.add_instruction(migraphx::op::atanh{}, cx);
        return p;
    }
};

Paul's avatar
Paul committed
561
struct test_scale : verify_program<test_scale>
Khalique's avatar
Khalique committed
562
{
Paul's avatar
Paul committed
563
    migraphx::program create_program() const
Khalique's avatar
Khalique committed
564
    {
Paul's avatar
Paul committed
565
566
        migraphx::program p;
        migraphx::shape s{migraphx::shape::float_type, {3}};
Khalique's avatar
Khalique committed
567
        auto x     = p.add_parameter("x", s);
Paul's avatar
Paul committed
568
        auto y     = p.add_parameter("y", migraphx::shape::float_type);
569
        auto scale = p.add_instruction(migraphx::op::scalar{s.lens()}, y);
Paul's avatar
Paul committed
570
        p.add_instruction(migraphx::op::mul{}, x, scale);
Khalique's avatar
Khalique committed
571
572
573
574
        return p;
    }
};

Paul's avatar
Paul committed
575
struct test_slice : verify_program<test_slice>
576
{
Paul's avatar
Paul committed
577
    migraphx::program create_program() const
578
    {
Paul's avatar
Paul committed
579
580
        migraphx::program p;
        migraphx::shape s{migraphx::shape::int32_type, {2, 2, 4}};
581
        auto x      = p.add_parameter("x", s);
Paul's avatar
Paul committed
582
583
584
        auto y      = p.add_parameter("y", {migraphx::shape::int32_type, {2, 2, 2}});
        auto slice0 = p.add_instruction(migraphx::op::slice{{2}, {0}, {2}}, x);
        p.add_instruction(migraphx::op::add{}, y, slice0);
585
586
587
588
589

        return p;
    }
};

Paul's avatar
Paul committed
590
struct test_triadd : verify_program<test_triadd>
Paul's avatar
Paul committed
591
{
Paul's avatar
Paul committed
592
    migraphx::program create_program() const
Paul's avatar
Paul committed
593
    {
Paul's avatar
Paul committed
594
595
        migraphx::program p;
        migraphx::shape s{migraphx::shape::float_type, {3}};
Paul's avatar
Paul committed
596
597
598
        auto x   = p.add_parameter("x", s);
        auto y   = p.add_parameter("y", s);
        auto z   = p.add_parameter("z", s);
Paul's avatar
Paul committed
599
600
        auto sum = p.add_instruction(migraphx::op::add{}, x, y);
        p.add_instruction(migraphx::op::add{}, sum, z);
Paul's avatar
Paul committed
601
602
603
604
        return p;
    }
};

Paul's avatar
Paul committed
605
struct test_triadd2 : verify_program<test_triadd2>
Paul's avatar
Paul committed
606
{
Paul's avatar
Paul committed
607
    migraphx::program create_program() const
Paul's avatar
Paul committed
608
    {
Paul's avatar
Paul committed
609
610
611
        migraphx::program p;
        migraphx::shape s{migraphx::shape::float_type, {2, 3}};
        migraphx::shape b{migraphx::shape::float_type, {3}};
Paul's avatar
Paul committed
612
613
614
        auto x   = p.add_parameter("x", s);
        auto y   = p.add_parameter("y", s);
        auto z   = p.add_parameter("z", b);
615
        auto zb  = p.add_instruction(migraphx::op::broadcast{1, s.lens()}, z);
Paul's avatar
Paul committed
616
617
        auto sum = p.add_instruction(migraphx::op::add{}, x, y);
        p.add_instruction(migraphx::op::add{}, sum, zb);
Paul's avatar
Paul committed
618
619
620
621
        return p;
    }
};

Paul's avatar
Paul committed
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
struct test_mul_add : verify_program<test_mul_add>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape s{migraphx::shape::float_type, {2, 3}};
        migraphx::shape bs{migraphx::shape::float_type, {3}};
        auto x   = p.add_parameter("x", s);
        auto a   = p.add_parameter("a", bs);
        auto b   = p.add_parameter("b", bs);
        auto ab  = p.add_instruction(migraphx::op::broadcast{1, s.lens()}, a);
        auto bb  = p.add_instruction(migraphx::op::broadcast{1, s.lens()}, b);
        auto mul = p.add_instruction(migraphx::op::mul{}, x, ab);
        p.add_instruction(migraphx::op::add{}, mul, bb);
        return p;
    }
};

Paul's avatar
Paul committed
640
struct test_add_broadcast : verify_program<test_add_broadcast>
Paul's avatar
Paul committed
641
{
Paul's avatar
Paul committed
642
    migraphx::program create_program() const
Paul's avatar
Paul committed
643
    {
Paul's avatar
Paul committed
644
645
646
647
        migraphx::program p;
        migraphx::shape s{migraphx::shape::float_type, {3}};
        auto x  = p.add_parameter("x", {migraphx::shape::float_type, {2, 2, 3}});
        auto y  = p.add_parameter("y", {migraphx::shape::float_type, {2, 2}});
648
        auto by = p.add_instruction(migraphx::op::broadcast{0, x->get_shape().lens()}, y);
Paul's avatar
Paul committed
649
        p.add_instruction(migraphx::op::add{}, x, by);
Paul's avatar
Paul committed
650
651
652
653
        return p;
    }
};

Paul's avatar
Paul committed
654
struct test_add_broadcast2 : verify_program<test_add_broadcast2>
Paul's avatar
Paul committed
655
{
Paul's avatar
Paul committed
656
    migraphx::program create_program() const
Paul's avatar
Paul committed
657
    {
Paul's avatar
Paul committed
658
659
660
661
        migraphx::program p;
        migraphx::shape s{migraphx::shape::float_type, {3}};
        auto x  = p.add_parameter("x", {migraphx::shape::float_type, {2, 3, 4}});
        auto y  = p.add_parameter("y", {migraphx::shape::float_type, {3}});
662
        auto by = p.add_instruction(migraphx::op::broadcast{1, x->get_shape().lens()}, y);
Paul's avatar
Paul committed
663
        p.add_instruction(migraphx::op::add{}, x, by);
Paul's avatar
Paul committed
664
665
666
667
        return p;
    }
};

Paul's avatar
Paul committed
668
struct test_add_broadcast3 : verify_program<test_add_broadcast3>
Paul's avatar
Latest  
Paul committed
669
{
Paul's avatar
Paul committed
670
    migraphx::program create_program() const
Paul's avatar
Latest  
Paul committed
671
    {
Paul's avatar
Paul committed
672
673
674
675
        migraphx::program p;
        migraphx::shape s{migraphx::shape::float_type, {3}};
        auto x  = p.add_parameter("x", {migraphx::shape::float_type, {2, 4, 5}});
        auto y  = p.add_parameter("y", {migraphx::shape::float_type, {4}});
676
        auto by = p.add_instruction(migraphx::op::broadcast{1, x->get_shape().lens()}, y);
Paul's avatar
Paul committed
677
        p.add_instruction(migraphx::op::add{}, x, by);
Paul's avatar
Latest  
Paul committed
678
679
680
681
        return p;
    }
};

Paul's avatar
Paul committed
682
struct test_add_broadcast4 : verify_program<test_add_broadcast4>
Paul's avatar
Latest  
Paul committed
683
{
Paul's avatar
Paul committed
684
    migraphx::program create_program() const
Paul's avatar
Latest  
Paul committed
685
    {
Paul's avatar
Paul committed
686
687
688
689
        migraphx::program p;
        migraphx::shape s{migraphx::shape::float_type, {3}};
        auto x  = p.add_parameter("x", {migraphx::shape::float_type, {2, 3, 5}});
        auto y  = p.add_parameter("y", {migraphx::shape::float_type, {3}});
690
        auto by = p.add_instruction(migraphx::op::broadcast{1, x->get_shape().lens()}, y);
Paul's avatar
Paul committed
691
        p.add_instruction(migraphx::op::add{}, x, by);
Paul's avatar
Latest  
Paul committed
692
693
694
695
        return p;
    }
};

Paul's avatar
Paul committed
696
struct test_add_broadcast5 : verify_program<test_add_broadcast5>
Paul's avatar
Paul committed
697
{
Paul's avatar
Paul committed
698
    migraphx::program create_program() const
Paul's avatar
Paul committed
699
    {
Paul's avatar
Paul committed
700
701
702
703
        migraphx::program p;
        migraphx::shape s{migraphx::shape::float_type, {3}};
        auto x  = p.add_parameter("x", {migraphx::shape::float_type, {2, 4, 8}});
        auto y  = p.add_parameter("y", {migraphx::shape::float_type, {4}});
704
        auto by = p.add_instruction(migraphx::op::broadcast{1, x->get_shape().lens()}, y);
Paul's avatar
Paul committed
705
        p.add_instruction(migraphx::op::add{}, x, by);
Paul's avatar
Paul committed
706
707
708
709
        return p;
    }
};

Paul's avatar
Paul committed
710
struct test_triadd_broadcast : verify_program<test_triadd_broadcast>
Paul's avatar
Paul committed
711
{
Paul's avatar
Paul committed
712
    migraphx::program create_program() const
Paul's avatar
Paul committed
713
    {
Paul's avatar
Paul committed
714
715
716
717
718
        migraphx::program p;
        migraphx::shape s{migraphx::shape::float_type, {3}};
        auto x   = p.add_parameter("x", {migraphx::shape::float_type, {2, 2, 3}});
        auto y   = p.add_parameter("y", {migraphx::shape::float_type, {2, 2}});
        auto z   = p.add_parameter("z", {migraphx::shape::float_type, {2, 2, 3}});
719
        auto by  = p.add_instruction(migraphx::op::broadcast{0, x->get_shape().lens()}, y);
Paul's avatar
Paul committed
720
721
        auto sum = p.add_instruction(migraphx::op::add{}, x, by);
        p.add_instruction(migraphx::op::add{}, sum, z);
Paul's avatar
Paul committed
722
723
724
725
        return p;
    }
};

Paul's avatar
Paul committed
726
struct test_sub : verify_program<test_sub>
727
728
729
730
731
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape s{migraphx::shape::float_type, {3}};
Shucai Xiao's avatar
Shucai Xiao committed
732
733
734
        auto x    = p.add_parameter("x", s);
        auto y    = p.add_parameter("y", s);
        auto z    = p.add_parameter("z", s);
735
736
737
738
739
740
        auto diff = p.add_instruction(migraphx::op::sub{}, x, y);
        p.add_instruction(migraphx::op::sub{}, diff, z);
        return p;
    }
};

Paul's avatar
Paul committed
741
struct test_sub2 : verify_program<test_sub2>
742
743
744
745
746
747
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape s{migraphx::shape::float_type, {2, 3}};
        migraphx::shape b{migraphx::shape::float_type, {3}};
Shucai Xiao's avatar
Shucai Xiao committed
748
749
750
        auto x    = p.add_parameter("x", s);
        auto y    = p.add_parameter("y", s);
        auto z    = p.add_parameter("z", b);
751
        auto zb   = p.add_instruction(migraphx::op::broadcast{1, s.lens()}, z);
752
753
754
755
756
757
        auto diff = p.add_instruction(migraphx::op::sub{}, x, y);
        p.add_instruction(migraphx::op::sub{}, diff, zb);
        return p;
    }
};

758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
struct test_div : verify_program<test_div>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape s{migraphx::shape::float_type, {3}};
        auto x    = p.add_parameter("x", s);
        auto y    = p.add_parameter("y", s);
        auto z    = p.add_parameter("z", s);
        auto diff = p.add_instruction(migraphx::op::div{}, x, y);
        p.add_instruction(migraphx::op::div{}, diff, z);
        return p;
    }
};

struct test_div2 : verify_program<test_div2>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape s{migraphx::shape::float_type, {2, 3}};
        migraphx::shape b{migraphx::shape::float_type, {3}};
        auto x    = p.add_parameter("x", s);
        auto y    = p.add_parameter("y", s);
        auto z    = p.add_parameter("z", b);
        auto zb   = p.add_instruction(migraphx::op::broadcast{1, s.lens()}, z);
        auto diff = p.add_instruction(migraphx::op::div{}, x, y);
        p.add_instruction(migraphx::op::div{}, diff, zb);
        return p;
    }
};

790
struct test_softmax1 : verify_program<test_softmax1>
Paul's avatar
Paul committed
791
{
Paul's avatar
Paul committed
792
    migraphx::program create_program() const
Paul's avatar
Paul committed
793
    {
Paul's avatar
Paul committed
794
        migraphx::program p;
795
796
        auto x = p.add_parameter("x", migraphx::shape{migraphx::shape::float_type, {5, 3, 3, 4}});
        p.add_instruction(migraphx::op::softmax{0}, x);
Paul's avatar
Paul committed
797
798
799
800
        return p;
    }
};

Paul's avatar
Paul committed
801
struct test_softmax2 : verify_program<test_softmax2>
Paul's avatar
Paul committed
802
{
Paul's avatar
Paul committed
803
    migraphx::program create_program() const
Paul's avatar
Paul committed
804
    {
Paul's avatar
Paul committed
805
        migraphx::program p;
Paul's avatar
Paul committed
806
807
        auto x =
            p.add_parameter("x", migraphx::shape{migraphx::shape::float_type, {1, 1000, 1, 1}});
Paul's avatar
Paul committed
808
        p.add_instruction(migraphx::op::softmax{}, x);
Paul's avatar
Paul committed
809
810
811
812
        return p;
    }
};

Shucai Xiao's avatar
Shucai Xiao committed
813
814
template <int Axis, migraphx::shape::type_t T>
struct test_softmax : verify_program<test_softmax<Axis, T>>
815
816
817
818
{
    migraphx::program create_program() const
    {
        migraphx::program p;
Shucai Xiao's avatar
Shucai Xiao committed
819
        migraphx::shape s{T, {512, 4, 1067, 6}};
820
821
822
823
824
825
826
        auto param = p.add_parameter("0", s);
        p.add_instruction(migraphx::op::softmax{Axis}, param);

        return p;
    }
};

Shucai Xiao's avatar
Shucai Xiao committed
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
template struct test_softmax<0, migraphx::shape::float_type>;
template struct test_softmax<2, migraphx::shape::float_type>;
template struct test_softmax<1, migraphx::shape::double_type>;
template struct test_softmax<3, migraphx::shape::double_type>;
template struct test_softmax<0, migraphx::shape::half_type>;
template struct test_softmax<1, migraphx::shape::half_type>;
template struct test_softmax<2, migraphx::shape::half_type>;
template struct test_softmax<3, migraphx::shape::half_type>;

template <class T, int Axis>
struct test_arg_ops : verify_program<test_arg_ops<T, Axis>>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape s{migraphx::shape::float_type, {2, 3, 4, 1025}};
        auto param = p.add_parameter("data", s);
        p.add_instruction(T{Axis}, param);

        return p;
    }
};

template struct test_arg_ops<migraphx::op::argmax, 0>;
template struct test_arg_ops<migraphx::op::argmax, 1>;
template struct test_arg_ops<migraphx::op::argmax, 2>;
template struct test_arg_ops<migraphx::op::argmax, 3>;
854
855
template struct test_arg_ops<migraphx::op::argmax, -1>;
template struct test_arg_ops<migraphx::op::argmax, -2>;
Shucai Xiao's avatar
Shucai Xiao committed
856
857
858
859
860

template struct test_arg_ops<migraphx::op::argmin, 0>;
template struct test_arg_ops<migraphx::op::argmin, 1>;
template struct test_arg_ops<migraphx::op::argmin, 2>;
template struct test_arg_ops<migraphx::op::argmin, 3>;
861
862
template struct test_arg_ops<migraphx::op::argmin, -3>;
template struct test_arg_ops<migraphx::op::argmin, -4>;
863

Paul's avatar
Paul committed
864
struct test_conv : verify_program<test_conv>
Paul's avatar
Paul committed
865
{
Paul's avatar
Paul committed
866
    migraphx::program create_program() const
Paul's avatar
Paul committed
867
    {
Paul's avatar
Paul committed
868
        migraphx::program p;
Paul's avatar
Paul committed
869
870
        auto input =
            p.add_parameter("x", migraphx::shape{migraphx::shape::float_type, {4, 3, 3, 3}});
Paul's avatar
Paul committed
871
        auto weights =
Paul's avatar
Paul committed
872
873
            p.add_parameter("w", migraphx::shape{migraphx::shape::float_type, {4, 3, 3, 3}});
        p.add_instruction(migraphx::op::convolution{}, input, weights);
Paul's avatar
Paul committed
874
875
876
877
        return p;
    }
};

Paul's avatar
Paul committed
878
struct test_conv2 : verify_program<test_conv2>
Paul's avatar
Paul committed
879
{
Paul's avatar
Paul committed
880
    migraphx::program create_program() const
Paul's avatar
Paul committed
881
    {
Paul's avatar
Paul committed
882
        migraphx::program p;
Paul's avatar
Paul committed
883
        auto input =
Paul's avatar
Paul committed
884
            p.add_parameter("x", migraphx::shape{migraphx::shape::float_type, {1, 512, 28, 28}});
Paul's avatar
Paul committed
885
        auto weights =
Paul's avatar
Paul committed
886
887
            p.add_parameter("w", migraphx::shape{migraphx::shape::float_type, {256, 512, 1, 1}});
        p.add_instruction(migraphx::op::convolution{{0, 0}, {1, 1}, {1, 1}}, input, weights);
Paul's avatar
Paul committed
888
889
890
891
        return p;
    }
};

Paul's avatar
Paul committed
892
struct test_group_conv : verify_program<test_group_conv>
Khalique's avatar
Khalique committed
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        auto input =
            p.add_parameter("x", migraphx::shape{migraphx::shape::float_type, {1, 4, 16, 16}});
        auto weights =
            p.add_parameter("w", migraphx::shape{migraphx::shape::float_type, {4, 1, 3, 3}});
        migraphx::op::convolution op;
        op.group = 4;
        p.add_instruction(op, input, weights);
        return p;
    }
};

Paul's avatar
Paul committed
908
struct test_conv_relu : verify_program<test_conv_relu>
Paul's avatar
Paul committed
909
{
Paul's avatar
Paul committed
910
    migraphx::program create_program() const
Paul's avatar
Paul committed
911
    {
Paul's avatar
Paul committed
912
        migraphx::program p;
Paul's avatar
Paul committed
913
914
        auto input =
            p.add_parameter("x", migraphx::shape{migraphx::shape::float_type, {4, 3, 3, 3}});
Paul's avatar
Paul committed
915
        auto weights =
Paul's avatar
Paul committed
916
917
918
            p.add_parameter("w", migraphx::shape{migraphx::shape::float_type, {4, 3, 3, 3}});
        auto conv = p.add_instruction(migraphx::op::convolution{}, input, weights);
        p.add_instruction(migraphx::op::relu{}, conv);
Paul's avatar
Paul committed
919
920
921
922
        return p;
    }
};

Paul's avatar
Paul committed
923
struct test_conv_relu_half : verify_program<test_conv_relu_half>
Paul's avatar
Paul committed
924
{
Paul's avatar
Paul committed
925
    migraphx::program create_program() const
Paul's avatar
Paul committed
926
    {
Paul's avatar
Paul committed
927
        migraphx::program p;
Paul's avatar
Paul committed
928
929
        auto input =
            p.add_parameter("x", migraphx::shape{migraphx::shape::half_type, {4, 3, 3, 3}});
Paul's avatar
Paul committed
930
        auto weights =
Paul's avatar
Paul committed
931
932
933
            p.add_parameter("w", migraphx::shape{migraphx::shape::half_type, {4, 3, 3, 3}});
        auto conv = p.add_instruction(migraphx::op::convolution{}, input, weights);
        p.add_instruction(migraphx::op::relu{}, conv);
Paul's avatar
Paul committed
934
935
936
937
        return p;
    }
};

kahmed10's avatar
kahmed10 committed
938
939
940
941
942
struct test_conv_bias_clipped_relu : verify_program<test_conv_bias_clipped_relu>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
kahmed10's avatar
kahmed10 committed
943
        std::vector<size_t> input_lens{4, 3, 3, 3};
kahmed10's avatar
kahmed10 committed
944
945
946
947
948
949
950
951
952
953
954
        auto input =
            p.add_parameter("x", migraphx::shape{migraphx::shape::float_type, {4, 3, 3, 3}});
        auto weights =
            p.add_parameter("w", migraphx::shape{migraphx::shape::float_type, {4, 3, 3, 3}});
        auto l0   = migraphx::literal{migraphx::shape{migraphx::shape::float_type, {4}},
                                    {2.0f, 2.0f, 2.0f, 2.0f}};
        auto bias = p.add_literal(l0);
        auto conv = p.add_instruction(migraphx::op::convolution{}, input, weights);
        auto bcast_add =
            p.add_instruction(migraphx::op::broadcast{1, conv->get_shape().lens()}, bias);
        auto bias_add = p.add_instruction(migraphx::op::add{}, conv, bcast_add);
kahmed10's avatar
kahmed10 committed
955
956
957
958
959
        auto min_val  = p.add_literal(0.0f);
        auto max_val  = p.add_literal(6.0f);
        min_val       = p.add_instruction(migraphx::op::multibroadcast{input_lens}, min_val);
        max_val       = p.add_instruction(migraphx::op::multibroadcast{input_lens}, max_val);
        p.add_instruction(migraphx::op::clip{}, bias_add, min_val, max_val);
kahmed10's avatar
kahmed10 committed
960
961
962
963
        return p;
    }
};

964
965
966
967
968
969
struct test_conv_add : verify_program<test_conv_add>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        auto x = p.add_parameter("x", {migraphx::shape::float_type, {1, 8, 4, 4}});
970
971
        auto w = p.add_literal(
            migraphx::generate_literal({migraphx::shape::float_type, {2, 8, 3, 3}}, 1));
972
        auto y = p.add_parameter("y", {migraphx::shape::float_type, {1, 8, 4, 4}});
973
974
        auto v = p.add_literal(
            migraphx::generate_literal({migraphx::shape::float_type, {2, 8, 3, 3}}, 2));
975
976
977
978
979
980
981
982
983
984
985
986
987
988
        auto conv1 = p.add_instruction(migraphx::op::convolution{}, x, w);
        auto conv2 = p.add_instruction(migraphx::op::convolution{}, y, v);
        auto sum   = p.add_instruction(migraphx::op::add{}, conv1, conv2);
        p.add_instruction(migraphx::op::exp{}, sum);
        return p;
    }
};

struct test_conv_add_1x1_diff_strides : verify_program<test_conv_add_1x1_diff_strides>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        auto x = p.add_parameter("x", {migraphx::shape::float_type, {1, 8, 2, 2}});
989
990
        auto w = p.add_literal(
            migraphx::generate_literal({migraphx::shape::float_type, {2, 8, 1, 1}}, 1));
991
        auto y = p.add_parameter("y", {migraphx::shape::float_type, {1, 8, 4, 4}});
992
993
        auto v = p.add_literal(
            migraphx::generate_literal({migraphx::shape::float_type, {2, 8, 1, 1}}, 2));
994
995
996
997
998
999
1000
1001
        auto conv1 = p.add_instruction(migraphx::op::convolution{}, x, w);
        auto conv2 = p.add_instruction(migraphx::op::convolution{{0, 0}, {2, 2}}, y, v);
        auto sum   = p.add_instruction(migraphx::op::add{}, conv1, conv2);
        p.add_instruction(migraphx::op::exp{}, sum);
        return p;
    }
};

1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
struct test_conv_bn_add : verify_program<test_conv_bn_add>
{
    static migraphx::instruction_ref add_bn(migraphx::program& p,
                                            migraphx::instruction_ref x,
                                            std::size_t channels,
                                            std::size_t seed = 1)
    {
        migraphx::shape vars{migraphx::shape::float_type, {channels}};
        auto scale    = p.add_literal(migraphx::abs(migraphx::generate_literal(vars, 1 + seed)));
        auto bias     = p.add_literal(migraphx::abs(migraphx::generate_literal(vars, 2 + seed)));
        auto mean     = p.add_literal(migraphx::abs(migraphx::generate_literal(vars, 3 + seed)));
        auto variance = p.add_literal(migraphx::abs(migraphx::generate_literal(vars, 4 + seed)));
        return p.add_instruction(
            migraphx::op::batch_norm_inference{}, x, scale, bias, mean, variance);
    }

    migraphx::program create_program() const
    {
        migraphx::program p;
        std::size_t ichannels = 64;
        std::size_t ochannels = 256;
        auto x     = p.add_parameter("x", {migraphx::shape::float_type, {1, ichannels, 56, 56}});
        auto w     = p.add_literal(migraphx::generate_literal(
            {migraphx::shape::float_type, {ochannels, ichannels, 1, 1}}, 1));
        auto y     = p.add_parameter("y", {migraphx::shape::float_type, {1, ichannels, 56, 56}});
        auto v     = p.add_literal(migraphx::generate_literal(
            {migraphx::shape::float_type, {ochannels, ichannels, 1, 1}}, 2));
        auto relu1 = p.add_instruction(migraphx::op::relu{}, x);
        auto conv1 = p.add_instruction(migraphx::op::convolution{}, relu1, w);
        auto bn1   = add_bn(p, conv1, ochannels, 1);
        auto relu2 = p.add_instruction(migraphx::op::relu{}, y);
        auto conv2 = p.add_instruction(migraphx::op::convolution{}, relu2, v);
        auto bn2   = add_bn(p, conv2, ochannels, 1);
        auto sum   = p.add_instruction(migraphx::op::add{}, bn1, bn2);
        p.add_instruction(migraphx::op::relu{}, sum);
        return p;
    }
};

Paul's avatar
Paul committed
1041
struct test_add_relu : verify_program<test_add_relu>
Paul's avatar
Paul committed
1042
{
Paul's avatar
Paul committed
1043
    migraphx::program create_program() const
Paul's avatar
Paul committed
1044
    {
Paul's avatar
Paul committed
1045
1046
1047
1048
1049
        migraphx::program p;
        auto x   = p.add_parameter("x", migraphx::shape{migraphx::shape::float_type, {4, 3, 3, 3}});
        auto y   = p.add_parameter("y", migraphx::shape{migraphx::shape::float_type, {4, 3, 3, 3}});
        auto add = p.add_instruction(migraphx::op::add{}, x, y);
        p.add_instruction(migraphx::op::relu{}, add);
Paul's avatar
Paul committed
1050
1051
1052
1053
        return p;
    }
};

1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
struct test_add_sigmoid : verify_program<test_add_sigmoid>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        auto x   = p.add_parameter("x", migraphx::shape{migraphx::shape::float_type, {4, 3, 3, 3}});
        auto y   = p.add_parameter("y", migraphx::shape{migraphx::shape::float_type, {4, 3, 3, 3}});
        auto add = p.add_instruction(migraphx::op::add{}, x, y);
        p.add_instruction(migraphx::op::sigmoid{}, add);
        return p;
    }
};

struct test_add_tanh : verify_program<test_add_tanh>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        auto x   = p.add_parameter("x", migraphx::shape{migraphx::shape::float_type, {4, 3, 3, 3}});
        auto y   = p.add_parameter("y", migraphx::shape{migraphx::shape::float_type, {4, 3, 3, 3}});
        auto add = p.add_instruction(migraphx::op::add{}, x, y);
        p.add_instruction(migraphx::op::tanh{}, add);
        return p;
    }
};

struct test_triadd_relu : verify_program<test_triadd_relu>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        auto x   = p.add_parameter("x", migraphx::shape{migraphx::shape::float_type, {4, 3, 3, 3}});
        auto y   = p.add_parameter("y", migraphx::shape{migraphx::shape::float_type, {4, 3, 3, 3}});
        auto z   = p.add_parameter("z", migraphx::shape{migraphx::shape::float_type, {4, 3, 3, 3}});
        auto sum = p.add_instruction(migraphx::op::add{}, x, y);
        auto triadd = p.add_instruction(migraphx::op::add{}, sum, z);
        p.add_instruction(migraphx::op::relu{}, triadd);
        return p;
    }
};

struct test_triadd_sigmoid : verify_program<test_triadd_sigmoid>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        auto x   = p.add_parameter("x", migraphx::shape{migraphx::shape::float_type, {4, 3, 3, 3}});
        auto y   = p.add_parameter("y", migraphx::shape{migraphx::shape::float_type, {4, 3, 3, 3}});
        auto z   = p.add_parameter("z", migraphx::shape{migraphx::shape::float_type, {4, 3, 3, 3}});
        auto sum = p.add_instruction(migraphx::op::add{}, x, y);
        auto triadd = p.add_instruction(migraphx::op::add{}, sum, z);
        p.add_instruction(migraphx::op::sigmoid{}, triadd);
        return p;
    }
};

struct test_triadd_tanh : verify_program<test_triadd_tanh>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        auto x   = p.add_parameter("x", migraphx::shape{migraphx::shape::float_type, {4, 3, 3, 3}});
        auto y   = p.add_parameter("y", migraphx::shape{migraphx::shape::float_type, {4, 3, 3, 3}});
        auto z   = p.add_parameter("z", migraphx::shape{migraphx::shape::float_type, {4, 3, 3, 3}});
        auto sum = p.add_instruction(migraphx::op::add{}, x, y);
        auto triadd = p.add_instruction(migraphx::op::add{}, sum, z);
        p.add_instruction(migraphx::op::tanh{}, triadd);
        return p;
    }
};

Paul's avatar
Paul committed
1125
struct test_sigmoid : verify_program<test_sigmoid>
Khalique's avatar
Khalique committed
1126
1127
1128
1129
{
    migraphx::program create_program() const
    {
        migraphx::program p;
Khalique's avatar
Khalique committed
1130
        auto x = p.add_parameter("x", migraphx::shape{migraphx::shape::float_type, {4, 3, 3, 3}});
Khalique's avatar
Khalique committed
1131
1132
1133
1134
1135
        p.add_instruction(migraphx::op::sigmoid{}, x);
        return p;
    }
};

Paul's avatar
Paul committed
1136
struct test_abs : verify_program<test_abs>
Khalique's avatar
Khalique committed
1137
1138
1139
1140
{
    migraphx::program create_program() const
    {
        migraphx::program p;
Khalique's avatar
Khalique committed
1141
        auto x = p.add_parameter("x", migraphx::shape{migraphx::shape::float_type, {4, 3, 3, 3}});
Khalique's avatar
Khalique committed
1142
1143
1144
1145
1146
        p.add_instruction(migraphx::op::abs{}, x);
        return p;
    }
};

1147
1148
1149
1150
1151
struct test_trans_abs : verify_program<test_trans_abs>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
Shucai Xiao's avatar
Shucai Xiao committed
1152
        auto x  = p.add_parameter("x", migraphx::shape{migraphx::shape::float_type, {4, 3, 3, 3}});
1153
        auto tx = p.add_instruction(migraphx::op::transpose{{0, 1, 3, 2}}, x);
1154
        auto absx = p.add_instruction(migraphx::op::abs{}, tx);
Shucai Xiao's avatar
Shucai Xiao committed
1155
        auto r    = p.add_instruction(migraphx::op::add{}, absx, absx);
1156
        p.add_instruction(migraphx::op::contiguous{}, r);
Shucai Xiao's avatar
Shucai Xiao committed
1157

1158
1159
1160
1161
        return p;
    }
};

Paul's avatar
Paul committed
1162
struct test_leaky_relu : verify_program<test_leaky_relu>
1163
{
Paul's avatar
Paul committed
1164
    migraphx::program create_program() const
1165
    {
Paul's avatar
Paul committed
1166
1167
1168
        migraphx::program p;
        auto x = p.add_parameter("x", migraphx::shape{migraphx::shape::float_type, {4, 3, 3, 3}});
        p.add_instruction(migraphx::op::leaky_relu{0.01}, x);
1169
1170
1171
1172
        return p;
    }
};

Paul's avatar
Paul committed
1173
struct test_elu : verify_program<test_elu>
Khalique's avatar
Khalique committed
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        auto x = p.add_parameter("x", migraphx::shape{migraphx::shape::float_type, {4, 3, 3, 3}});
        p.add_instruction(migraphx::op::leaky_relu{1.0}, x);
        return p;
    }
};

Paul's avatar
Paul committed
1184
struct test_relu_lrn : verify_program<test_relu_lrn>
Khalique's avatar
Khalique committed
1185
{
Khalique's avatar
Khalique committed
1186
    migraphx::program create_program() const
Khalique's avatar
Khalique committed
1187
    {
Khalique's avatar
Khalique committed
1188
1189
1190
1191
        migraphx::program p;
        auto x = p.add_parameter("x", migraphx::shape{migraphx::shape::float_type, {1, 5, 2, 2}});
        auto y = p.add_instruction(migraphx::op::relu{}, x);
        p.add_instruction(migraphx::op::lrn{0.0001, 0.75, 1.0, 5}, y);
Khalique's avatar
Khalique committed
1192
1193
1194
1195
        return p;
    }
};

Paul's avatar
Paul committed
1196
struct test_conv_pooling : verify_program<test_conv_pooling>
Paul's avatar
Paul committed
1197
{
Paul's avatar
Paul committed
1198
    migraphx::program create_program() const
Paul's avatar
Paul committed
1199
    {
Paul's avatar
Paul committed
1200
        migraphx::program p;
Paul's avatar
Paul committed
1201
        auto input =
Paul's avatar
Paul committed
1202
            p.add_parameter("x", migraphx::shape{migraphx::shape::float_type, {4, 3, 32, 32}});
Paul's avatar
Paul committed
1203
        auto weights =
Paul's avatar
Paul committed
1204
1205
1206
1207
            p.add_parameter("w", migraphx::shape{migraphx::shape::float_type, {4, 3, 3, 3}});
        auto conv    = p.add_instruction(migraphx::op::convolution{}, input, weights);
        auto pooling = p.add_instruction(migraphx::op::pooling{"max"}, conv);
        p.add_instruction(migraphx::op::relu{}, pooling);
Paul's avatar
Paul committed
1208
1209
1210
1211
        return p;
    }
};

1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
struct test_concat_pooling : verify_program<test_concat_pooling>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        auto input =
            p.add_parameter("x", migraphx::shape{migraphx::shape::float_type, {1, 256, 8, 8}});
        auto transpose = p.add_instruction(migraphx::op::transpose{{0, 2, 3, 1}}, input);
        auto concat    = p.add_instruction(migraphx::op::concat{3}, transpose);
        auto concat_t  = p.add_instruction(migraphx::op::transpose{{0, 3, 1, 2}}, concat);

        auto pooling =
            p.add_instruction(migraphx::op::pooling{"average", {0, 0}, {1, 1}, {8, 8}}, concat_t);
        p.add_instruction(migraphx::op::relu{}, pooling);
        return p;
    }
};

Paul's avatar
Paul committed
1230
struct test_global_avg_pooling : verify_program<test_global_avg_pooling>
1231
{
Paul's avatar
Paul committed
1232
    migraphx::program create_program() const
1233
    {
Paul's avatar
Paul committed
1234
        migraphx::program p;
1235
        auto input =
Paul's avatar
Paul committed
1236
1237
            p.add_parameter("x", migraphx::shape{migraphx::shape::float_type, {1, 3, 16, 16}});
        auto op    = migraphx::op::pooling{"average"};
1238
        auto lens  = input->get_shape().lens();
Khalique's avatar
Khalique committed
1239
        op.lengths = {lens[2], lens[3]};
1240
1241
1242
1243
1244
        p.add_instruction(op, input);
        return p;
    }
};

Paul's avatar
Paul committed
1245
struct test_global_max_pooling : verify_program<test_global_max_pooling>
1246
{
Paul's avatar
Paul committed
1247
    migraphx::program create_program() const
1248
    {
Paul's avatar
Paul committed
1249
        migraphx::program p;
1250
        auto input =
Paul's avatar
Paul committed
1251
1252
            p.add_parameter("x", migraphx::shape{migraphx::shape::float_type, {1, 3, 16, 16}});
        auto op    = migraphx::op::pooling{"max"};
1253
        auto lens  = input->get_shape().lens();
Khalique's avatar
Khalique committed
1254
        op.lengths = {lens[2], lens[3]};
1255
1256
1257
1258
1259
        p.add_instruction(op, input);
        return p;
    }
};

Paul's avatar
Paul committed
1260
struct test_gemm : verify_program<test_gemm>
Paul's avatar
Paul committed
1261
{
Paul's avatar
Paul committed
1262
    migraphx::program create_program() const
Paul's avatar
Paul committed
1263
    {
Paul's avatar
Paul committed
1264
1265
1266
1267
        migraphx::program p;
        auto a = p.add_parameter("a", migraphx::shape{migraphx::shape::float_type, {4, 5}});
        auto b = p.add_parameter("b", migraphx::shape{migraphx::shape::float_type, {5, 3}});
        p.add_instruction(migraphx::op::dot{}, a, b);
Paul's avatar
Paul committed
1268
1269
1270
1271
        return p;
    }
};

Shucai Xiao's avatar
Shucai Xiao committed
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
struct test_gemm_copy : verify_program<test_gemm_copy>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape sa{migraphx::shape::float_type, {2, 16}};
        migraphx::shape sb{migraphx::shape::float_type, {16, 8}};
        migraphx::shape sc{migraphx::shape::float_type, {2, 8}};
        auto pa = p.add_parameter("a", sa);
        auto pb = p.add_parameter("b", sb);
        auto pc = p.add_parameter("c", sc);
        auto dr = p.add_instruction(migraphx::op::dot{}, pa, pb, pc);
        p.add_instruction(migraphx::op::add{}, dr, dr);

        return p;
    }
};

Paul's avatar
Paul committed
1290
struct test_gemm_ex : verify_program<test_gemm_ex>
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        auto a = p.add_parameter("a", migraphx::shape{migraphx::shape::float_type, {1, 1, 4, 5}});
        auto b = p.add_parameter("b", migraphx::shape{migraphx::shape::float_type, {1, 1, 5, 3}});
        p.add_instruction(migraphx::op::dot{}, a, b);
        return p;
    }
};

Paul's avatar
Paul committed
1302
struct test_gemm_half : verify_program<test_gemm_half>
Paul's avatar
Paul committed
1303
{
Paul's avatar
Paul committed
1304
    migraphx::program create_program() const
Paul's avatar
Paul committed
1305
    {
Paul's avatar
Paul committed
1306
1307
1308
1309
        migraphx::program p;
        auto a = p.add_parameter("a", migraphx::shape{migraphx::shape::half_type, {4, 5}});
        auto b = p.add_parameter("b", migraphx::shape{migraphx::shape::half_type, {5, 3}});
        p.add_instruction(migraphx::op::dot{}, a, b);
Paul's avatar
Paul committed
1310
1311
1312
1313
        return p;
    }
};

Paul's avatar
Paul committed
1314
struct test_gemm_ld //: verify_program<test_gemm_ld>
Paul's avatar
Paul committed
1315
{
Paul's avatar
Paul committed
1316
    migraphx::program create_program() const
Paul's avatar
Paul committed
1317
    {
Paul's avatar
Paul committed
1318
        migraphx::program p;
Paul's avatar
Paul committed
1319
1320
1321
1322
        auto a =
            p.add_parameter("a", migraphx::shape{migraphx::shape::float_type, {4, 5}, {10, 1}});
        auto b =
            p.add_parameter("b", migraphx::shape{migraphx::shape::float_type, {5, 3}, {20, 1}});
Paul's avatar
Paul committed
1323
        p.add_instruction(migraphx::op::dot{}, a, b);
Paul's avatar
Paul committed
1324
1325
1326
1327
        return p;
    }
};

Paul's avatar
Paul committed
1328
struct test_gemm_transposeb : verify_program<test_gemm_transposeb>
1329
{
Paul's avatar
Paul committed
1330
    migraphx::program create_program() const
1331
    {
Paul's avatar
Paul committed
1332
1333
1334
1335
1336
        migraphx::program p;
        auto a  = p.add_parameter("a", migraphx::shape{migraphx::shape::float_type, {4, 5}});
        auto b  = p.add_parameter("b", migraphx::shape{migraphx::shape::float_type, {3, 5}});
        auto bt = p.add_instruction(migraphx::op::transpose{{1, 0}}, b);
        p.add_instruction(migraphx::op::dot{}, a, bt);
1337
1338
1339
1340
        return p;
    }
};

Paul's avatar
Paul committed
1341
struct test_gemm_transposeb_ex : verify_program<test_gemm_transposeb_ex>
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        auto a  = p.add_parameter("a", migraphx::shape{migraphx::shape::float_type, {1, 4, 5}});
        auto b  = p.add_parameter("b", migraphx::shape{migraphx::shape::float_type, {1, 3, 5}});
        auto bt = p.add_instruction(migraphx::op::transpose{{0, 2, 1}}, b);
        p.add_instruction(migraphx::op::dot{}, a, bt);
        return p;
    }
};

Paul's avatar
Paul committed
1354
struct test_gemm_transposea : verify_program<test_gemm_transposea>
1355
{
Paul's avatar
Paul committed
1356
    migraphx::program create_program() const
1357
    {
Paul's avatar
Paul committed
1358
1359
1360
1361
1362
        migraphx::program p;
        auto a  = p.add_parameter("a", migraphx::shape{migraphx::shape::float_type, {5, 4}});
        auto b  = p.add_parameter("b", migraphx::shape{migraphx::shape::float_type, {5, 3}});
        auto at = p.add_instruction(migraphx::op::transpose{{1, 0}}, a);
        p.add_instruction(migraphx::op::dot{}, at, b);
1363
1364
1365
1366
        return p;
    }
};

Paul's avatar
Paul committed
1367
struct test_gemm_transposea_ex : verify_program<test_gemm_transposea_ex>
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        auto a  = p.add_parameter("a", migraphx::shape{migraphx::shape::float_type, {1, 1, 5, 4}});
        auto b  = p.add_parameter("b", migraphx::shape{migraphx::shape::float_type, {1, 1, 5, 3}});
        auto at = p.add_instruction(migraphx::op::transpose{{0, 1, 3, 2}}, a);
        p.add_instruction(migraphx::op::dot{}, at, b);
        return p;
    }
};

Paul's avatar
Paul committed
1380
struct test_gemm_transposeab : verify_program<test_gemm_transposeab>
1381
{
Paul's avatar
Paul committed
1382
    migraphx::program create_program() const
1383
    {
Paul's avatar
Paul committed
1384
1385
1386
1387
1388
1389
        migraphx::program p;
        auto a  = p.add_parameter("a", migraphx::shape{migraphx::shape::float_type, {5, 4}});
        auto b  = p.add_parameter("b", migraphx::shape{migraphx::shape::float_type, {3, 5}});
        auto at = p.add_instruction(migraphx::op::transpose{{1, 0}}, a);
        auto bt = p.add_instruction(migraphx::op::transpose{{1, 0}}, b);
        p.add_instruction(migraphx::op::dot{}, at, bt);
1390
1391
1392
1393
        return p;
    }
};

1394
struct gemm_multi_dim_2 : verify_program<gemm_multi_dim_2>
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape m1_shape{migraphx::shape::float_type, {2, 2, 3}};
        migraphx::shape m2_shape{migraphx::shape::float_type, {2, 3, 4}};
        auto l1 = p.add_parameter("1", m1_shape);
        auto l2 = p.add_parameter("2", m2_shape);

        p.add_instruction(migraphx::op::dot{}, l1, l2);

        return p;
    }
};

1410
1411
1412
1413
1414
1415
1416
struct gemm_2args_mm_1 : verify_program<gemm_2args_mm_1>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape m1_shape{migraphx::shape::float_type, {2, 2, 3}};
        migraphx::shape m2_shape{migraphx::shape::float_type, {1, 3, 4}};
Shucai Xiao's avatar
Shucai Xiao committed
1417
1418
        auto l1  = p.add_parameter("1", m1_shape);
        auto l2  = p.add_parameter("2", m2_shape);
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
        auto bl2 = p.add_instruction(migraphx::op::multibroadcast{{2, 3, 4}}, l2);

        p.add_instruction(migraphx::op::dot{}, l1, bl2);

        return p;
    }
};

struct gemm_2args_mm_2 : verify_program<gemm_2args_mm_2>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape m1_shape{migraphx::shape::float_type, {2, 2, 3}};
        migraphx::shape m2_shape{migraphx::shape::float_type, {3, 4}};
Shucai Xiao's avatar
Shucai Xiao committed
1434
1435
        auto l1  = p.add_parameter("1", m1_shape);
        auto l2  = p.add_parameter("2", m2_shape);
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
        auto bl2 = p.add_instruction(migraphx::op::multibroadcast{{2, 3, 4}}, l2);

        p.add_instruction(migraphx::op::dot{}, l1, bl2);

        return p;
    }
};

struct gemm_2args_mm_3 : verify_program<gemm_2args_mm_3>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape m1_shape{migraphx::shape::float_type, {1, 2, 3}};
        migraphx::shape m2_shape{migraphx::shape::float_type, {3, 3, 4}};
Shucai Xiao's avatar
Shucai Xiao committed
1451
        auto l1  = p.add_parameter("1", m1_shape);
1452
        auto bl1 = p.add_instruction(migraphx::op::multibroadcast{{3, 2, 3}}, l1);
Shucai Xiao's avatar
Shucai Xiao committed
1453
        auto l2  = p.add_parameter("2", m2_shape);
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467

        p.add_instruction(migraphx::op::dot{}, bl1, l2);

        return p;
    }
};

struct gemm_2args_mm_4 : verify_program<gemm_2args_mm_4>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape m1_shape{migraphx::shape::float_type, {2, 3}};
        migraphx::shape m2_shape{migraphx::shape::float_type, {3, 3, 4}};
Shucai Xiao's avatar
Shucai Xiao committed
1468
        auto l1  = p.add_parameter("1", m1_shape);
1469
        auto bl1 = p.add_instruction(migraphx::op::multibroadcast{{3, 2, 3}}, l1);
Shucai Xiao's avatar
Shucai Xiao committed
1470
        auto l2  = p.add_parameter("2", m2_shape);
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484

        p.add_instruction(migraphx::op::dot{}, bl1, l2);

        return p;
    }
};

struct gemm_2args_mm_5 : verify_program<gemm_2args_mm_5>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape m1_shape{migraphx::shape::float_type, {2, 1, 2, 3}};
        migraphx::shape m2_shape{migraphx::shape::float_type, {2, 3, 3, 4}};
Shucai Xiao's avatar
Shucai Xiao committed
1485
        auto l1  = p.add_parameter("1", m1_shape);
1486
        auto bl1 = p.add_instruction(migraphx::op::multibroadcast{{2, 3, 2, 3}}, l1);
Shucai Xiao's avatar
Shucai Xiao committed
1487
        auto l2  = p.add_parameter("2", m2_shape);
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501

        p.add_instruction(migraphx::op::dot{}, bl1, l2);

        return p;
    }
};

struct gemm_2args_mm_6 : verify_program<gemm_2args_mm_6>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape m1_shape{migraphx::shape::float_type, {2, 1, 2, 3}};
        migraphx::shape m2_shape{migraphx::shape::float_type, {1, 3, 3, 4}};
Shucai Xiao's avatar
Shucai Xiao committed
1502
        auto l1  = p.add_parameter("1", m1_shape);
1503
        auto bl1 = p.add_instruction(migraphx::op::multibroadcast{{2, 3, 2, 3}}, l1);
Shucai Xiao's avatar
Shucai Xiao committed
1504
        auto l2  = p.add_parameter("2", m2_shape);
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
        auto bl2 = p.add_instruction(migraphx::op::multibroadcast{{2, 3, 3, 4}}, l2);

        p.add_instruction(migraphx::op::dot{}, bl1, bl2);

        return p;
    }
};

struct gemm_2args_mm_7 : verify_program<gemm_2args_mm_7>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape m1_shape{migraphx::shape::float_type, {2, 3}};
        migraphx::shape m2_shape{migraphx::shape::float_type, {2, 3, 3, 4}};
Shucai Xiao's avatar
Shucai Xiao committed
1520
        auto l1  = p.add_parameter("1", m1_shape);
1521
        auto bl1 = p.add_instruction(migraphx::op::multibroadcast{{2, 3, 2, 3}}, l1);
Shucai Xiao's avatar
Shucai Xiao committed
1522
        auto l2  = p.add_parameter("2", m2_shape);
1523
1524
1525
1526
1527
1528
1529
1530

        p.add_instruction(migraphx::op::dot{}, bl1, l2);

        return p;
    }
};

struct gemm_multi_dim_2_3 : verify_program<gemm_multi_dim_2_3>
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape m1_shape{migraphx::shape::float_type, {2, 3, 2, 3}};
        migraphx::shape m2_shape{migraphx::shape::float_type, {2, 3, 3, 2}};
        auto l1 = p.add_parameter("1", m1_shape);
        auto l2 = p.add_parameter("2", m2_shape);

        p.add_instruction(migraphx::op::dot{}, l1, l2);

        return p;
    }
};

1546
1547
1548
1549
1550
1551
1552
1553
struct gemm_2args_vv : verify_program<gemm_2args_vv>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape m1_shape{migraphx::shape::float_type, {8}};
        migraphx::shape m2_shape{migraphx::shape::float_type, {8}};
        auto l1     = p.add_parameter("1", m1_shape);
Shucai Xiao's avatar
Shucai Xiao committed
1554
        auto ul1    = p.add_instruction(migraphx::op::unsqueeze{{0}}, l1);
1555
        auto l2     = p.add_parameter("2", m2_shape);
Shucai Xiao's avatar
Shucai Xiao committed
1556
        auto ul2    = p.add_instruction(migraphx::op::unsqueeze{{1}}, l2);
1557
1558
        float alpha = 0.23f;

Shucai Xiao's avatar
Shucai Xiao committed
1559
        auto res  = p.add_instruction(migraphx::op::dot{alpha}, ul1, ul2);
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
        auto sres = p.add_instruction(migraphx::op::squeeze{{0}}, res);
        p.add_instruction(migraphx::op::squeeze{{0}}, sres);

        return p;
    }
};

struct gemm_2args_mv : verify_program<gemm_2args_mv>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape m1_shape{migraphx::shape::float_type, {3, 5}};
        migraphx::shape m2_shape{migraphx::shape::float_type, {5}};
Shucai Xiao's avatar
Shucai Xiao committed
1574
1575
        auto l1  = p.add_parameter("1", m1_shape);
        auto l2  = p.add_parameter("2", m2_shape);
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
        auto ul2 = p.add_instruction(migraphx::op::unsqueeze{{1}}, l2);

        p.add_instruction(migraphx::op::dot{}, l1, ul2);

        return p;
    }
};

struct gemm_2args_bmv : verify_program<gemm_2args_bmv>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape m1_shape{migraphx::shape::float_type, {2, 3, 3, 5}};
        migraphx::shape m2_shape{migraphx::shape::float_type, {5}};
Shucai Xiao's avatar
Shucai Xiao committed
1591
1592
1593
        auto l1   = p.add_parameter("1", m1_shape);
        auto l2   = p.add_parameter("2", m2_shape);
        auto ul2  = p.add_instruction(migraphx::op::unsqueeze{{1}}, l2);
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
        auto bul2 = p.add_instruction(migraphx::op::multibroadcast{{2, 3, 5, 1}}, ul2);

        p.add_instruction(migraphx::op::dot{}, l1, bul2);

        return p;
    }
};

struct gemm_2args_vm : verify_program<gemm_2args_vm>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape m1_shape{migraphx::shape::float_type, {5}};
        migraphx::shape m2_shape{migraphx::shape::float_type, {5, 4}};
Shucai Xiao's avatar
Shucai Xiao committed
1609
        auto l1  = p.add_parameter("1", m1_shape);
1610
        auto ul1 = p.add_instruction(migraphx::op::unsqueeze{{0}}, l1);
Shucai Xiao's avatar
Shucai Xiao committed
1611
        auto l2  = p.add_parameter("2", m2_shape);
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626

        auto res = p.add_instruction(migraphx::op::dot{}, ul1, l2);
        p.add_instruction(migraphx::op::squeeze{{0}}, res);

        return p;
    }
};

struct gemm_2args_vbm : verify_program<gemm_2args_vbm>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape m1_shape{migraphx::shape::float_type, {5}};
        migraphx::shape m2_shape{migraphx::shape::float_type, {2, 2, 5, 4}};
Shucai Xiao's avatar
Shucai Xiao committed
1627
1628
        auto l1   = p.add_parameter("1", m1_shape);
        auto ul1  = p.add_instruction(migraphx::op::unsqueeze{{0}}, l1);
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
        auto bul1 = p.add_instruction(migraphx::op::multibroadcast{{2, 2, 1, 5}}, ul1);

        auto l2 = p.add_parameter("2", m2_shape);

        auto res = p.add_instruction(migraphx::op::dot{}, bul1, l2);
        p.add_instruction(migraphx::op::squeeze{{2}}, res);

        return p;
    }
};

struct gemm_multi_3args : verify_program<gemm_multi_3args>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape m1_shape{migraphx::shape::float_type, {2, 3, 2, 3}};
        migraphx::shape m2_shape{migraphx::shape::float_type, {2, 3, 3, 2}};
        migraphx::shape m3_shape{migraphx::shape::float_type, {2, 3, 2, 2}};

        auto l1     = p.add_parameter("1", m1_shape);
        auto l2     = p.add_parameter("2", m2_shape);
        auto l3     = p.add_parameter("3", m3_shape);
        float alpha = 0.35;
        float beta  = 0.41;
        p.add_instruction(migraphx::op::dot{alpha, beta}, l1, l2, l3);

        return p;
    }
};

struct gemm_multi_3args_c25 : verify_program<gemm_multi_3args_c25>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape m1_shape{migraphx::shape::float_type, {2, 3}};
        migraphx::shape m2_shape{migraphx::shape::float_type, {3, 5}};
        migraphx::shape m3_shape{migraphx::shape::float_type, {2, 5}};

        auto l1     = p.add_parameter("1", m1_shape);
        auto l2     = p.add_parameter("2", m2_shape);
        auto l3     = p.add_parameter("3", m3_shape);
        float alpha = 0.35;
        float beta  = 0.41;
        p.add_instruction(migraphx::op::dot{alpha, beta}, l1, l2, l3);

        return p;
    }
};

struct gemm_multi_3args_beta0 : verify_program<gemm_multi_3args_beta0>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape m1_shape{migraphx::shape::float_type, {1, 2, 3}};
        migraphx::shape m2_shape{migraphx::shape::float_type, {1, 3, 4}};
        migraphx::shape m3_shape{migraphx::shape::float_type, {1, 2, 4}};
        auto l1 = p.add_parameter("1", m1_shape);
        auto l2 = p.add_parameter("2", m2_shape);
        auto l3 = p.add_parameter("3", m3_shape);

        float alpha = 1.0f;
        float beta  = 0.0f;
        p.add_instruction(migraphx::op::dot{alpha, beta}, l1, l2, l3);

        return p;
    }
};

struct gemm_multi_3args_alpha0 : verify_program<gemm_multi_3args_alpha0>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape m1_shape{migraphx::shape::float_type, {1, 2, 3}};
        migraphx::shape m2_shape{migraphx::shape::float_type, {1, 3, 4}};
        migraphx::shape m3_shape{migraphx::shape::float_type, {1, 2, 4}};
        auto l1 = p.add_parameter("1", m1_shape);
        auto l2 = p.add_parameter("2", m2_shape);
        auto l3 = p.add_parameter("3", m3_shape);

        float alpha = 0.0f;
        float beta  = 1.0f;
        p.add_instruction(migraphx::op::dot{alpha, beta}, l1, l2, l3);

        return p;
    }
};

Shucai Xiao's avatar
Shucai Xiao committed
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
struct gemm_multi_transpose : verify_program<gemm_multi_transpose>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape m1_shape{migraphx::shape::float_type, {2, 2, 3}};
        migraphx::shape m2_shape{migraphx::shape::float_type, {3, 2, 4}};
        auto l1  = p.add_parameter("1", m1_shape);
        auto l2  = p.add_parameter("2", m2_shape);
        auto tl2 = p.add_instruction(migraphx::op::transpose{{1, 0, 2}}, l2);

        float alpha = 1.0f;
        float beta  = 1.0f;
        p.add_instruction(migraphx::op::dot{alpha, beta}, l1, tl2);

        return p;
    }
};

Shucai Xiao's avatar
Shucai Xiao committed
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
struct quant_dot_3args_1 : verify_program<quant_dot_3args_1>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape m1_shape{migraphx::shape::int8_type, {2, 8}};
        migraphx::shape m2_shape{migraphx::shape::int8_type, {8, 7}};
        migraphx::shape m3_shape{migraphx::shape::int32_type, {2, 7}};

        auto l1 = p.add_parameter("a", m1_shape);
        auto l2 = p.add_parameter("b", m2_shape);
        auto l3 = p.add_parameter("c", m3_shape);
        p.add_instruction(migraphx::op::quant_dot{}, l1, l2, l3);
        return p;
    }
};

struct quant_dot_3args_2 : verify_program<quant_dot_3args_2>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape m1_shape{migraphx::shape::int8_type, {8, 2}};
        migraphx::shape m2_shape{migraphx::shape::int8_type, {8, 7}};
        migraphx::shape m3_shape{migraphx::shape::int32_type, {2, 7}};

Shucai Xiao's avatar
Shucai Xiao committed
1765
        auto l1  = p.add_parameter("a", m1_shape);
Shucai Xiao's avatar
Shucai Xiao committed
1766
        auto tl1 = p.add_instruction(migraphx::op::transpose{{1, 0}}, l1);
Shucai Xiao's avatar
Shucai Xiao committed
1767
        auto l2  = p.add_parameter("b", m2_shape);
1768
        auto l3  = p.add_parameter("c", m3_shape);
Shucai Xiao's avatar
Shucai Xiao committed
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
        p.add_instruction(migraphx::op::quant_dot{1, 3}, tl1, l2, l3);
        return p;
    }
};

struct quant_dot_3args_3 : verify_program<quant_dot_3args_3>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape m1_shape{migraphx::shape::int8_type, {2, 8}};
        migraphx::shape m2_shape{migraphx::shape::int8_type, {7, 8}};
        migraphx::shape m3_shape{migraphx::shape::int32_type, {2, 7}};

Shucai Xiao's avatar
Shucai Xiao committed
1783
1784
        auto l1  = p.add_parameter("a", m1_shape);
        auto l2  = p.add_parameter("b", m2_shape);
Shucai Xiao's avatar
Shucai Xiao committed
1785
        auto tl2 = p.add_instruction(migraphx::op::transpose{{1, 0}}, l2);
1786
        auto l3  = p.add_parameter("c", m3_shape);
Shucai Xiao's avatar
Shucai Xiao committed
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
        p.add_instruction(migraphx::op::quant_dot{2, 3}, l1, tl2, l3);
        return p;
    }
};

struct quant_dot_3args_4 : verify_program<quant_dot_3args_4>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape m1_shape{migraphx::shape::int8_type, {8, 2}};
        migraphx::shape m2_shape{migraphx::shape::int8_type, {7, 8}};
        migraphx::shape m3_shape{migraphx::shape::int32_type, {2, 7}};

Shucai Xiao's avatar
Shucai Xiao committed
1801
        auto l1  = p.add_parameter("a", m1_shape);
Shucai Xiao's avatar
Shucai Xiao committed
1802
        auto tl1 = p.add_instruction(migraphx::op::transpose{{1, 0}}, l1);
Shucai Xiao's avatar
Shucai Xiao committed
1803
        auto l2  = p.add_parameter("b", m2_shape);
Shucai Xiao's avatar
Shucai Xiao committed
1804
        auto tl2 = p.add_instruction(migraphx::op::transpose{{1, 0}}, l2);
1805
        auto l3  = p.add_parameter("c", m3_shape);
Shucai Xiao's avatar
Shucai Xiao committed
1806
1807
1808
1809
1810
        p.add_instruction(migraphx::op::quant_dot{3, 2}, tl1, tl2, l3);
        return p;
    }
};

1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
struct batch_quant_dot_1 : verify_program<batch_quant_dot_1>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape m1_shape{migraphx::shape::int8_type, {3, 2, 8, 2}};
        migraphx::shape m2_shape{migraphx::shape::int8_type, {3, 2, 7, 8}};
        migraphx::shape m3_shape{migraphx::shape::int32_type, {3, 2, 2, 7}};

        auto l1  = p.add_parameter("a", m1_shape);
        auto tl1 = p.add_instruction(migraphx::op::transpose{{0, 1, 3, 2}}, l1);
        auto l2  = p.add_parameter("b", m2_shape);
        auto tl2 = p.add_instruction(migraphx::op::transpose{{0, 1, 3, 2}}, l2);
        auto l3  = p.add_parameter("c", m3_shape);
        p.add_instruction(migraphx::op::quant_dot{3, 2}, tl1, tl2, l3);
        return p;
    }
};

struct batch_quant_dot_2 : verify_program<batch_quant_dot_2>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape m1_shape{migraphx::shape::int8_type, {3, 2, 2, 8}};
        migraphx::shape m2_shape{migraphx::shape::int8_type, {3, 2, 8, 7}};
        migraphx::shape m3_shape{migraphx::shape::int32_type, {3, 2, 2, 7}};

Shucai Xiao's avatar
Shucai Xiao committed
1839
1840
1841
        auto l1 = p.add_parameter("a", m1_shape);
        auto l2 = p.add_parameter("b", m2_shape);
        auto l3 = p.add_parameter("c", m3_shape);
1842
1843
1844
1845
1846
        p.add_instruction(migraphx::op::quant_dot{1, 3}, l1, l2, l3);
        return p;
    }
};

Paul's avatar
Paul committed
1847
struct test_contiguous : verify_program<test_contiguous>
1848
{
Paul's avatar
Paul committed
1849
    migraphx::program create_program() const
1850
    {
Paul's avatar
Paul committed
1851
1852
        migraphx::program p;
        migraphx::shape s{migraphx::shape::float_type, {4, 4, 4, 3}, {48, 4, 1, 16}};
1853
        auto x = p.add_parameter("x", s);
Paul's avatar
Paul committed
1854
        p.add_instruction(migraphx::op::contiguous{}, x);
1855
        EXPECT(p.get_output_shapes().back().standard());
1856
1857
1858
1859
        return p;
    }
};

1860
1861
1862
1863
1864
1865
1866
1867
struct test_contiguous_broadcast : verify_program<test_contiguous_broadcast>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape s{migraphx::shape::float_type, {1, 2}, {0, 1}};
        auto x = p.add_parameter("x", s);
        p.add_instruction(migraphx::op::contiguous{}, x);
1868
        EXPECT(p.get_output_shapes().back().standard());
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
        return p;
    }
};

struct test_contiguous_broadcast_transpose : verify_program<test_contiguous_broadcast_transpose>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape s{migraphx::shape::float_type, {1, 3072, 768}, {0, 1, 3072}};
        auto x = p.add_parameter("x", s);
        p.add_instruction(migraphx::op::contiguous{}, x);
1881
        EXPECT(p.get_output_shapes().back().standard());
1882
1883
1884
1885
        return p;
    }
};

Paul's avatar
Paul committed
1886
struct test_transpose : verify_program<test_transpose>
1887
{
Paul's avatar
Paul committed
1888
    migraphx::program create_program() const
1889
    {
Paul's avatar
Paul committed
1890
1891
        migraphx::program p;
        migraphx::shape s{migraphx::shape::float_type, {4, 3, 4, 4}};
1892
1893
        auto x                    = p.add_parameter("x", s);
        std::vector<int64_t> perm = {0, 2, 3, 1};
Paul's avatar
Paul committed
1894
1895
        auto l                    = p.add_instruction(migraphx::op::transpose{perm}, x);
        p.add_instruction(migraphx::op::contiguous{}, l);
1896
1897
1898
        return p;
    }
};
1899

1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
struct test_trans_ret : verify_program<test_trans_ret>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        auto x  = p.add_parameter("x", migraphx::shape{migraphx::shape::float_type, {4, 3, 3, 3}});
        auto tx = p.add_instruction(migraphx::op::transpose{{0, 1, 3, 2}}, x);
        p.add_return({tx});

        return p;
    }
};

Paul's avatar
Paul committed
1913
struct test_batchnorm_inference_2 : verify_program<test_batchnorm_inference_2>
Paul's avatar
Paul committed
1914
1915
1916
1917
1918
1919
{
    const size_t width    = 14;
    const size_t height   = 14;
    const size_t channels = 256;
    const size_t batches  = 1;

Paul's avatar
Paul committed
1920
    migraphx::program create_program() const
Paul's avatar
Paul committed
1921
    {
Paul's avatar
Paul committed
1922
        migraphx::program p;
Paul's avatar
Paul committed
1923

Paul's avatar
Paul committed
1924
1925
        migraphx::shape s{migraphx::shape::float_type, {batches, channels, height, width}};
        migraphx::shape vars{migraphx::shape::float_type, {channels}};
Paul's avatar
Paul committed
1926
        auto x        = p.add_parameter("x", s);
Paul's avatar
Paul committed
1927
1928
1929
1930
1931
        auto scale    = p.add_literal(migraphx::abs(migraphx::generate_literal(vars, 1)));
        auto bias     = p.add_literal(migraphx::abs(migraphx::generate_literal(vars, 2)));
        auto mean     = p.add_literal(migraphx::abs(migraphx::generate_literal(vars, 3)));
        auto variance = p.add_literal(migraphx::abs(migraphx::generate_literal(vars, 4)));
        p.add_instruction(migraphx::op::batch_norm_inference{}, x, scale, bias, mean, variance);
Paul's avatar
Paul committed
1932
1933
1934
1935
        return p;
    }
};

Paul's avatar
Paul committed
1936
struct test_batchnorm_inference : verify_program<test_batchnorm_inference>
wsttiger's avatar
wsttiger committed
1937
1938
1939
1940
1941
1942
{
    const size_t width    = 3;
    const size_t height   = 3;
    const size_t channels = 3;
    const size_t batches  = 4;

Paul's avatar
Paul committed
1943
    migraphx::program create_program() const
wsttiger's avatar
wsttiger committed
1944
    {
Paul's avatar
Paul committed
1945
        migraphx::program p;
wsttiger's avatar
wsttiger committed
1946

Paul's avatar
Paul committed
1947
1948
        migraphx::shape s{migraphx::shape::float_type, {batches, channels, height, width}};
        migraphx::shape vars{migraphx::shape::float_type, {channels}};
wsttiger's avatar
wsttiger committed
1949
        auto x        = p.add_parameter("x", s);
Paul's avatar
Paul committed
1950
1951
1952
1953
1954
        auto scale    = p.add_literal(migraphx::abs(migraphx::generate_literal(vars, 1)));
        auto bias     = p.add_literal(migraphx::abs(migraphx::generate_literal(vars, 2)));
        auto mean     = p.add_literal(migraphx::abs(migraphx::generate_literal(vars, 3)));
        auto variance = p.add_literal(migraphx::abs(migraphx::generate_literal(vars, 4)));
        p.add_instruction(migraphx::op::batch_norm_inference{}, x, scale, bias, mean, variance);
wsttiger's avatar
wsttiger committed
1955
1956
1957
1958
        return p;
    }
};

Khalique's avatar
Khalique committed
1959
1960
1961
1962
1963
struct test_clip : verify_program<test_clip>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
kahmed10's avatar
kahmed10 committed
1964
1965
1966
1967
1968
1969
        auto x       = p.add_parameter("x", migraphx::shape{migraphx::shape::float_type, {3}});
        auto min_val = p.add_literal(0.0f);
        auto max_val = p.add_literal(6.0f);
        min_val      = p.add_instruction(migraphx::op::multibroadcast{{3}}, min_val);
        max_val      = p.add_instruction(migraphx::op::multibroadcast{{3}}, max_val);
        p.add_instruction(migraphx::op::clip{}, x, min_val, max_val);
Khalique's avatar
Khalique committed
1970
1971
1972
1973
        return p;
    }
};

Paul's avatar
Paul committed
1974
struct test_conv_bn : verify_program<test_conv_bn>
Paul's avatar
Paul committed
1975
{
Paul's avatar
Paul committed
1976
    migraphx::program create_program() const
Paul's avatar
Paul committed
1977
    {
Paul's avatar
Paul committed
1978
        migraphx::program p;
Paul's avatar
Paul committed
1979

Paul's avatar
Paul committed
1980
1981
1982
        migraphx::shape xs{migraphx::shape::float_type, {1, 3, 224, 224}};
        migraphx::shape ws{migraphx::shape::float_type, {64, 3, 7, 7}};
        migraphx::shape vars{migraphx::shape::float_type, {64}};
Paul's avatar
Paul committed
1983
1984
        auto x        = p.add_parameter("x", xs);
        auto w        = p.add_parameter("w", ws);
Paul's avatar
Paul committed
1985
1986
1987
1988
1989
1990
        auto conv     = p.add_instruction(migraphx::op::convolution{{3, 3}, {2, 2}, {1, 1}}, x, w);
        auto scale    = p.add_literal(migraphx::abs(migraphx::generate_literal(vars, 1)));
        auto bias     = p.add_literal(migraphx::abs(migraphx::generate_literal(vars, 2)));
        auto mean     = p.add_literal(migraphx::abs(migraphx::generate_literal(vars, 3)));
        auto variance = p.add_literal(migraphx::abs(migraphx::generate_literal(vars, 4)));
        p.add_instruction(migraphx::op::batch_norm_inference{}, conv, scale, bias, mean, variance);
Paul's avatar
Paul committed
1991
1992
1993
1994
        return p;
    }
};

Paul's avatar
Paul committed
1995
struct test_conv_bn_relu_pooling : verify_program<test_conv_bn_relu_pooling>
Paul's avatar
Paul committed
1996
{
Paul's avatar
Paul committed
1997
    migraphx::program create_program() const
Paul's avatar
Paul committed
1998
    {
Paul's avatar
Paul committed
1999
        migraphx::program p;
Paul's avatar
Paul committed
2000

Paul's avatar
Paul committed
2001
2002
2003
        migraphx::shape xs{migraphx::shape::float_type, {1, 3, 224, 224}};
        migraphx::shape ws{migraphx::shape::float_type, {64, 3, 7, 7}};
        migraphx::shape vars{migraphx::shape::float_type, {64}};
Paul's avatar
Paul committed
2004
2005
        auto x        = p.add_parameter("x", xs);
        auto w        = p.add_parameter("w", ws);
Paul's avatar
Paul committed
2006
2007
2008
2009
2010
        auto conv     = p.add_instruction(migraphx::op::convolution{{3, 3}, {2, 2}, {1, 1}}, x, w);
        auto scale    = p.add_literal(migraphx::abs(migraphx::generate_literal(vars, 1)));
        auto bias     = p.add_literal(migraphx::abs(migraphx::generate_literal(vars, 2)));
        auto mean     = p.add_literal(migraphx::abs(migraphx::generate_literal(vars, 3)));
        auto variance = p.add_literal(migraphx::abs(migraphx::generate_literal(vars, 4)));
wsttiger's avatar
wsttiger committed
2011
        auto bn       = p.add_instruction(
Paul's avatar
Paul committed
2012
2013
2014
            migraphx::op::batch_norm_inference{}, conv, scale, bias, mean, variance);
        auto relu = p.add_instruction(migraphx::op::relu{}, bn);
        p.add_instruction(migraphx::op::pooling{"average", {1, 1}, {2, 2}, {3, 3}}, relu);
Paul's avatar
Paul committed
2015
2016
2017
2018
        return p;
    }
};

2019
2020
struct quant_conv : verify_program<quant_conv>
{
Shucai Xiao's avatar
Shucai Xiao committed
2021
2022
    migraphx::program create_program()
    {
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
        migraphx::program p;
        migraphx::shape a_shape{migraphx::shape::int8_type, {2, 3, 4, 4}};
        auto pa = p.add_parameter("a", a_shape);
        migraphx::shape c_shape{migraphx::shape::int8_type, {2, 3, 3, 3}};
        auto pc = p.add_parameter("c", c_shape);
        p.add_instruction(migraphx::op::quant_convolution{}, pa, pc);
        return p;
    }
};

struct quant_conv_default_mode : verify_program<quant_conv_default_mode>
{
Shucai Xiao's avatar
Shucai Xiao committed
2035
2036
    migraphx::program create_program()
    {
2037
2038
2039
2040
2041
        migraphx::program p;
        migraphx::shape a_shape{migraphx::shape::int8_type, {2, 3, 4, 4}};
        auto pa = p.add_parameter("a", a_shape);
        migraphx::shape c_shape{migraphx::shape::int8_type, {2, 3, 3, 3}};
        auto pc = p.add_parameter("c", c_shape);
Shucai Xiao's avatar
Shucai Xiao committed
2042
2043
2044
2045
        p.add_instruction(
            migraphx::op::quant_convolution{{{0, 0}}, {{1, 1}}, {{1, 1}}, migraphx::op::same},
            pa,
            pc);
2046
2047
2048
2049
2050
2051
        return p;
    }
};

struct quant_conv_valid_mode : verify_program<quant_conv_valid_mode>
{
Shucai Xiao's avatar
Shucai Xiao committed
2052
2053
    migraphx::program create_program()
    {
2054
2055
2056
2057
2058
        migraphx::program p;
        migraphx::shape a_shape{migraphx::shape::int8_type, {2, 3, 4, 4}};
        auto pa = p.add_parameter("a", a_shape);
        migraphx::shape c_shape{migraphx::shape::int8_type, {2, 3, 3, 3}};
        auto pc = p.add_parameter("c", c_shape);
Shucai Xiao's avatar
Shucai Xiao committed
2059
2060
2061
2062
        p.add_instruction(
            migraphx::op::quant_convolution{{{0, 0}}, {{1, 1}}, {{1, 1}}, migraphx::op::valid},
            pa,
            pc);
2063
2064
2065
2066
2067
2068
        return p;
    }
};

struct quant_conv_padding : verify_program<quant_conv_padding>
{
Shucai Xiao's avatar
Shucai Xiao committed
2069
2070
    migraphx::program create_program()
    {
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
        migraphx::program p;
        migraphx::shape a_shape{migraphx::shape::int8_type, {2, 3, 4, 4}};
        auto pa = p.add_parameter("a", a_shape);
        migraphx::shape c_shape{migraphx::shape::int8_type, {2, 3, 3, 3}};
        auto pc = p.add_parameter("c", c_shape);
        p.add_instruction(migraphx::op::quant_convolution{{{1, 1}}, {{1, 1}}}, pa, pc);
        return p;
    }
};

struct quant_conv_padding_stride : verify_program<quant_conv_padding_stride>
{
Shucai Xiao's avatar
Shucai Xiao committed
2083
2084
    migraphx::program create_program()
    {
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
        migraphx::program p;
        migraphx::shape a_shape{migraphx::shape::int8_type, {2, 3, 4, 4}};
        auto pa = p.add_parameter("a", a_shape);
        migraphx::shape c_shape{migraphx::shape::int8_type, {2, 3, 3, 3}};
        auto pc = p.add_parameter("c", c_shape);
        p.add_instruction(migraphx::op::quant_convolution{{{1, 1}}, {{2, 2}}}, pa, pc);

        return p;
    }
};

Shucai Xiao's avatar
Shucai Xiao committed
2096
struct test_concat_axis_1 : verify_program<test_concat_axis_1>
2097
{
Paul's avatar
Paul committed
2098
    migraphx::program create_program() const
2099
    {
Paul's avatar
Paul committed
2100
        migraphx::program p;
Shucai Xiao's avatar
Shucai Xiao committed
2101
        int axis = 1;
Paul's avatar
Paul committed
2102
2103
2104
        migraphx::shape s0{migraphx::shape::int32_type, {2, 2}};
        migraphx::shape s1{migraphx::shape::int32_type, {2, 3}};
        migraphx::shape s2{migraphx::shape::int32_type, {2, 1}};
2105
2106
2107
        auto l0 = p.add_parameter("x", s0);
        auto l1 = p.add_parameter("y", s1);
        auto l2 = p.add_parameter("z", s2);
Paul's avatar
Paul committed
2108
        p.add_instruction(migraphx::op::concat{axis}, l0, l1, l2);
2109
2110
2111
2112
        return p;
    }
};

Shucai Xiao's avatar
Shucai Xiao committed
2113
struct test_concat_axis_neg_1 : verify_program<test_concat_axis_neg_1>
2114
{
Paul's avatar
Paul committed
2115
    migraphx::program create_program() const
2116
    {
Paul's avatar
Paul committed
2117
        migraphx::program p;
Shucai Xiao's avatar
Shucai Xiao committed
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
        int axis = -1;
        migraphx::shape s0{migraphx::shape::int32_type, {2, 2}};
        migraphx::shape s1{migraphx::shape::int32_type, {2, 3}};
        migraphx::shape s2{migraphx::shape::int32_type, {2, 1}};
        auto l0 = p.add_parameter("x", s0);
        auto l1 = p.add_parameter("y", s1);
        auto l2 = p.add_parameter("z", s2);
        p.add_instruction(migraphx::op::concat{axis}, l0, l1, l2);
        return p;
    }
};

struct test_concat_axis_0 : verify_program<test_concat_axis_0>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        int axis = 0;
Paul's avatar
Paul committed
2136
2137
2138
        migraphx::shape s0{migraphx::shape::int32_type, {2, 2}};
        migraphx::shape s1{migraphx::shape::int32_type, {3, 2}};
        migraphx::shape s2{migraphx::shape::int32_type, {1, 2}};
2139
2140
2141
        auto l0 = p.add_parameter("x", s0);
        auto l1 = p.add_parameter("y", s1);
        auto l2 = p.add_parameter("z", s2);
Paul's avatar
Paul committed
2142
        p.add_instruction(migraphx::op::concat{axis}, l0, l1, l2);
2143
2144
2145
2146
2147
2148
2149
2150
2151
        return p;
    }
};

struct test_concat_transpose : verify_program<test_concat_transpose>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
Shucai Xiao's avatar
Shucai Xiao committed
2152
        int axis = 1;
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
        migraphx::shape s0{migraphx::shape::int32_type, {2, 2}};
        migraphx::shape s1{migraphx::shape::int32_type, {3, 2}};
        migraphx::shape s2{migraphx::shape::int32_type, {2, 4}};
        auto l0  = p.add_parameter("x", s0);
        auto lp1 = p.add_parameter("y", s1);
        auto l1  = p.add_instruction(migraphx::op::transpose{{1, 0}}, lp1);
        auto l2  = p.add_parameter("z", s2);
        p.add_instruction(migraphx::op::concat{axis}, l0, l1, l2);
        return p;
    }
};

struct test_concat_transpose2 : verify_program<test_concat_transpose2>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
Shucai Xiao's avatar
Shucai Xiao committed
2170
        int axis = 1;
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
        migraphx::shape s0{migraphx::shape::int32_type, {2, 2}};
        migraphx::shape s1{migraphx::shape::int32_type, {2, 3}};
        migraphx::shape s2{migraphx::shape::int32_type, {5, 2}};
        auto l0  = p.add_parameter("x", s0);
        auto l1  = p.add_parameter("y", s1);
        auto lp2 = p.add_parameter("z", s2);
        auto l2  = p.add_instruction(migraphx::op::transpose{{1, 0}}, lp2);
        p.add_instruction(migraphx::op::concat{axis}, l0, l1, l2);
        return p;
    }
};

struct test_concat_transpose3 : verify_program<test_concat_transpose3>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
Shucai Xiao's avatar
Shucai Xiao committed
2188
        int axis = 1;
2189
2190
2191
2192
2193
2194
2195
2196
2197
        migraphx::shape s0{migraphx::shape::int32_type, {2, 2}};
        migraphx::shape s1{migraphx::shape::int32_type, {3, 2}};
        migraphx::shape s2{migraphx::shape::int32_type, {5, 2}};
        auto l0  = p.add_parameter("x", s0);
        auto lp1 = p.add_parameter("y", s1);
        auto l1  = p.add_instruction(migraphx::op::transpose{{1, 0}}, lp1);
        auto lp2 = p.add_parameter("z", s2);
        auto l2  = p.add_instruction(migraphx::op::transpose{{1, 0}}, lp2);
        p.add_instruction(migraphx::op::concat{axis}, l0, l1, l2);
2198
2199
2200
2201
        return p;
    }
};

Paul's avatar
Paul committed
2202
struct test_concat_relu : verify_program<test_concat_relu>
wsttiger's avatar
wsttiger committed
2203
{
Paul's avatar
Paul committed
2204
    migraphx::program create_program() const
wsttiger's avatar
wsttiger committed
2205
    {
Paul's avatar
Paul committed
2206
        migraphx::program p;
Shucai Xiao's avatar
Shucai Xiao committed
2207
        int axis = 0;
Paul's avatar
Paul committed
2208
2209
2210
        migraphx::shape s0{migraphx::shape::float_type, {2, 2}};
        migraphx::shape s1{migraphx::shape::float_type, {3, 2}};
        migraphx::shape s2{migraphx::shape::float_type, {1, 2}};
wsttiger's avatar
wsttiger committed
2211
2212
2213
        auto l0 = p.add_parameter("x", s0);
        auto l1 = p.add_parameter("y", s1);
        auto l2 = p.add_parameter("z", s2);
Paul's avatar
Paul committed
2214
2215
2216
2217
2218
        auto r0 = p.add_instruction(migraphx::op::relu{}, l0);
        auto r1 = p.add_instruction(migraphx::op::relu{}, l1);
        auto r2 = p.add_instruction(migraphx::op::relu{}, l2);
        auto c0 = p.add_instruction(migraphx::op::concat{axis}, r0, r1, r2);
        p.add_instruction(migraphx::op::relu{}, c0);
wsttiger's avatar
wsttiger committed
2219
2220
2221
2222
        return p;
    }
};

Paul's avatar
Paul committed
2223
struct test_pad : verify_program<test_pad>
2224
2225
2226
2227
2228
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape s0{migraphx::shape::int32_type, {1, 96, 165, 165}};
Khalique's avatar
Khalique committed
2229
2230
2231
2232
        std::vector<int64_t> pads0 = {0, 0, 0, 0, 0, 0, 1, 1};
        std::vector<int64_t> pads1 = {0, 0, 0, 0, 1, 1, 1, 1};
        std::vector<int64_t> pads2 = {1, 1, 1, 1, 0, 0, 0, 0};
        std::vector<int64_t> pads3 = {1, 0, 1, 0, 1, 0, 2, 0};
Khalique's avatar
Khalique committed
2233
        auto l0                    = p.add_parameter("x", s0);
Khalique's avatar
Khalique committed
2234
2235
2236
        p.add_instruction(migraphx::op::pad{pads0}, l0);
        p.add_instruction(migraphx::op::pad{pads1}, l0);
        p.add_instruction(migraphx::op::pad{pads2}, l0);
Khalique's avatar
Khalique committed
2237
        p.add_instruction(migraphx::op::pad{pads3}, l0);
Khalique's avatar
Khalique committed
2238
        return p;
Khalique's avatar
Khalique committed
2239
    }
Khalique's avatar
Khalique committed
2240
};
Khalique's avatar
Khalique committed
2241

2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
struct test_pad_transposed : verify_program<test_pad_transposed>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape s{migraphx::shape::int32_type, {1, 224, 224, 3}};
        auto x = p.add_parameter("x", s);
        auto t = p.add_instruction(migraphx::op::transpose{{0, 3, 1, 2}}, x);
        p.add_instruction(migraphx::op::pad{{0, 0, 2, 2, 0, 0, 3, 3}}, t);
        return p;
    }
};

Khalique's avatar
Khalique committed
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
struct test_pad_int8 : verify_program<test_pad_int8>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        std::vector<int8_t> data0 = {0, 1, 2, 3};
        migraphx::shape s0{migraphx::shape::float_type, {2, 2}};
        auto l0 = p.add_literal(migraphx::literal{s0, data0});
        migraphx::op::pad op{};
        op.value = std::numeric_limits<int8_t>::lowest();
        op.pads  = {0, 0, 1, 1};
        p.add_instruction(op, l0);
        return p;
    }
};

2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
struct test_pad_lowest : verify_program<test_pad_lowest>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        std::vector<migraphx::half> data0(4);
        std::iota(data0.begin(), data0.end(), 0);
        migraphx::shape s0{migraphx::shape::half_type, {2, 2}};
        auto l0 = p.add_literal(migraphx::literal{s0, data0});
        migraphx::op::pad op{};
        op.value = std::numeric_limits<float>::lowest();
        op.pads  = {0, 0, 1, 1};
        p.add_instruction(op, l0);
        return p;
    }
};

struct test_pad_highest : verify_program<test_pad_highest>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        std::vector<migraphx::half> data0(4);
        std::iota(data0.begin(), data0.end(), 0);
        migraphx::shape s0{migraphx::shape::half_type, {2, 2}};
        auto l0 = p.add_literal(migraphx::literal{s0, data0});
        migraphx::op::pad op{};
        op.value = std::numeric_limits<float>::max();
        op.pads  = {0, 0, 1, 1};
        p.add_instruction(op, l0);
        return p;
    }
};

Paul's avatar
Paul committed
2305
struct test_pooling_autopad : verify_program<test_pooling_autopad>
2306
2307
2308
2309
2310
2311
2312
2313
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape s0{migraphx::shape::float_type, {1, 3, 63, 63}};
        auto l0 = p.add_parameter("x", s0);
        migraphx::op::pooling op{"max"};
        op.padding_mode = migraphx::op::padding_mode_t::same;
Khalique's avatar
Khalique committed
2314
2315
        op.lengths      = {2, 2};
        op.stride       = {2, 2};
2316
2317
2318
2319
2320
        p.add_instruction(op, l0);
        return p;
    }
};

Paul's avatar
Paul committed
2321
struct test_gather : verify_program<test_gather>
2322
2323
2324
2325
2326
2327
2328
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape s{migraphx::shape::float_type, {3, 3}};
        migraphx::shape s_indices{migraphx::shape::int32_type, {2, 2}};
        std::vector<int> indices{1, 2, 2, 1};
Shucai Xiao's avatar
Shucai Xiao committed
2329
2330
        auto a0  = p.add_parameter("data", s);
        auto a1  = p.add_literal(migraphx::literal{s_indices, indices});
2331
        int axis = 0;
2332
        p.add_instruction(migraphx::op::gather{axis}, a0, a1);
2333
2334
2335
2336
        return p;
    }
};

Paul's avatar
Paul committed
2337
struct test_gather_neg_axis : verify_program<test_gather_neg_axis>
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape s{migraphx::shape::float_type, {3, 3}};
        migraphx::shape s_indices{migraphx::shape::int32_type, {2, 2}};
        std::vector<int> indices{1, 2, 2, 1};
        auto a0  = p.add_parameter("data", s);
        auto a1  = p.add_literal(migraphx::literal{s_indices, indices});
        int axis = -1;
        p.add_instruction(migraphx::op::gather{axis}, a0, a1);
        return p;
    }
};

Shucai Xiao's avatar
Shucai Xiao committed
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
struct test_gather_neg_indices : verify_program<test_gather_neg_indices>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape s{migraphx::shape::float_type, {3, 3}};
        migraphx::shape s_indices{migraphx::shape::int32_type, {2, 2}};
        std::vector<int> indices{-2, -1, -1, -2};
        auto a0  = p.add_parameter("data", s);
        auto a1  = p.add_literal(migraphx::literal{s_indices, indices});
        int axis = -1;
        p.add_instruction(migraphx::op::gather{axis}, a0, a1);
        return p;
    }
};

Paul's avatar
Paul committed
2369
struct test_gather_scalar_output : verify_program<test_gather_scalar_output>
2370
2371
2372
2373
2374
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape s{migraphx::shape::float_type, {3}};
2375
        migraphx::shape s_indices{migraphx::shape::int32_type};
2376
2377
2378
2379
2380
2381
2382
2383
2384
        std::vector<int> indices{1};
        auto a0  = p.add_parameter("data", s);
        auto a1  = p.add_literal(migraphx::literal{s_indices, indices});
        int axis = 0;
        p.add_instruction(migraphx::op::gather{axis}, a0, a1);
        return p;
    }
};

Paul's avatar
Paul committed
2385
struct test_gather_scalar_index : verify_program<test_gather_scalar_index>
2386
2387
2388
2389
2390
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape s{migraphx::shape::float_type, {3, 3}};
2391
        migraphx::shape s_indices{migraphx::shape::int32_type};
2392
2393
2394
2395
2396
2397
2398
2399
2400
        std::vector<int> indices{1};
        auto a0  = p.add_parameter("data", s);
        auto a1  = p.add_literal(migraphx::literal{s_indices, indices});
        int axis = -1;
        p.add_instruction(migraphx::op::gather{axis}, a0, a1);
        return p;
    }
};

Paul's avatar
Paul committed
2401
struct test_gather_1d_index : verify_program<test_gather_1d_index>
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape s{migraphx::shape::float_type, {3, 3}};
        migraphx::shape s_indices{migraphx::shape::int32_type, {1}};
        std::vector<int> indices{1};
        auto a0  = p.add_parameter("data", s);
        auto a1  = p.add_literal(migraphx::literal{s_indices, indices});
        int axis = -1;
        p.add_instruction(migraphx::op::gather{axis}, a0, a1);
        return p;
    }
};

wsttiger's avatar
wsttiger committed
2417
2418
void manual_identity()
{
Paul's avatar
Paul committed
2419
    migraphx::program p;
wsttiger's avatar
wsttiger committed
2420
    std::vector<float> data0 = {0, 1, 2, 3};
Paul's avatar
Paul committed
2421
2422
2423
2424
2425
    migraphx::shape s0{migraphx::shape::float_type, {2, 2}};
    auto l0 = p.add_literal(migraphx::literal{s0, data0});
    p.add_instruction(migraphx::op::identity{}, l0);
    p.compile(migraphx::gpu::target{});
    migraphx::program::parameter_map m;
wsttiger's avatar
wsttiger committed
2426
2427
    for(auto&& x : p.get_parameter_shapes())
    {
Paul's avatar
Paul committed
2428
        m[x.first] = migraphx::gpu::to_gpu(migraphx::generate_argument(x.second));
wsttiger's avatar
wsttiger committed
2429
    }
2430
    auto result = migraphx::gpu::from_gpu(p.eval(m).back());
wsttiger's avatar
wsttiger committed
2431
2432
2433
2434
2435
    std::cout << result << std::endl;
}

void manual_test_concat_relu()
{
Paul's avatar
Paul committed
2436
    migraphx::program p;
Shucai Xiao's avatar
Shucai Xiao committed
2437
    int axis                 = 0;
wsttiger's avatar
wsttiger committed
2438
2439
2440
    std::vector<float> data0 = {0, 1, 2, 3};
    std::vector<float> data1 = {4, 5, 6, 7, 8, 9};
    std::vector<float> data2 = {10, 11};
Paul's avatar
Paul committed
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
    migraphx::shape s0{migraphx::shape::float_type, {2, 2}};
    migraphx::shape s1{migraphx::shape::float_type, {3, 2}};
    migraphx::shape s2{migraphx::shape::float_type, {1, 2}};
    auto l0 = p.add_literal(migraphx::literal{s0, data0});
    auto l1 = p.add_literal(migraphx::literal{s1, data1});
    auto l2 = p.add_literal(migraphx::literal{s2, data2});
    auto r0 = p.add_instruction(migraphx::op::relu{}, l0);
    auto r1 = p.add_instruction(migraphx::op::relu{}, l1);
    auto r2 = p.add_instruction(migraphx::op::relu{}, l2);
    auto c0 = p.add_instruction(migraphx::op::concat{axis}, r0, r1, r2);
    p.add_instruction(migraphx::op::relu{}, c0);

    p.compile(migraphx::gpu::target{});
    migraphx::program::parameter_map m;
wsttiger's avatar
wsttiger committed
2455
2456
    for(auto&& x : p.get_parameter_shapes())
    {
Paul's avatar
Paul committed
2457
        m[x.first] = migraphx::gpu::to_gpu(migraphx::generate_argument(x.second));
wsttiger's avatar
wsttiger committed
2458
    }
2459
    auto result = migraphx::gpu::from_gpu(p.eval(m).back());
wsttiger's avatar
wsttiger committed
2460
2461
2462
    std::cout << result << std::endl;
}

Paul's avatar
Paul committed
2463
struct test_conv_bn_relu_pooling2 : verify_program<test_conv_bn_relu_pooling2>
Paul's avatar
Paul committed
2464
{
Paul's avatar
Paul committed
2465
2466
    static migraphx::instruction_ref
    add_bn(migraphx::program& p, migraphx::instruction_ref x, std::size_t channels)
Paul's avatar
Paul committed
2467
    {
Paul's avatar
Paul committed
2468
        migraphx::shape vars{migraphx::shape::float_type, {channels}};
Paul's avatar
Paul committed
2469
2470
2471
2472
2473
        auto scale = p.add_literal(migraphx::abs(migraphx::generate_literal(vars, 1 + channels)));
        auto bias  = p.add_literal(migraphx::abs(migraphx::generate_literal(vars, 2 + channels)));
        auto mean  = p.add_literal(migraphx::abs(migraphx::generate_literal(vars, 3 + channels)));
        auto variance =
            p.add_literal(migraphx::abs(migraphx::generate_literal(vars, 4 + channels)));
wsttiger's avatar
wsttiger committed
2474
        return p.add_instruction(
Paul's avatar
Paul committed
2475
            migraphx::op::batch_norm_inference{}, x, scale, bias, mean, variance);
Paul's avatar
Paul committed
2476
    }
Paul's avatar
Paul committed
2477
    migraphx::program create_program() const
Paul's avatar
Paul committed
2478
    {
Paul's avatar
Paul committed
2479
        migraphx::program p;
Paul's avatar
Paul committed
2480

Paul's avatar
Paul committed
2481
2482
2483
2484
        migraphx::shape xs1{migraphx::shape::float_type, {1, 512, 7, 7}};
        migraphx::shape xs2{migraphx::shape::float_type, {1, 1024, 14, 14}};
        migraphx::shape ws1{migraphx::shape::float_type, {2048, 512, 1, 1}};
        migraphx::shape ws2{migraphx::shape::float_type, {2048, 1024, 1, 1}};
Paul's avatar
Paul committed
2485
2486
        auto x1    = p.add_parameter("x1", xs1);
        auto w1    = p.add_parameter("w1", ws1);
Paul's avatar
Paul committed
2487
        auto conv1 = p.add_instruction(migraphx::op::convolution{{0, 0}, {1, 1}, {1, 1}}, x1, w1);
Paul's avatar
Paul committed
2488
2489
2490
        auto bn1   = add_bn(p, conv1, 2048);
        auto x2    = p.add_parameter("x2", xs2);
        auto w2    = p.add_parameter("w2", ws2);
Paul's avatar
Paul committed
2491
        auto conv2 = p.add_instruction(migraphx::op::convolution{{0, 0}, {2, 2}, {1, 1}}, x2, w2);
Paul's avatar
Paul committed
2492
        auto bn2   = add_bn(p, conv2, 2048);
Paul's avatar
Paul committed
2493
2494
2495
        auto add   = p.add_instruction(migraphx::op::add{}, bn1, bn2);
        auto relu  = p.add_instruction(migraphx::op::relu{}, add);
        p.add_instruction(migraphx::op::pooling{"average", {1, 1}, {2, 2}, {3, 3}}, relu);
Paul's avatar
Paul committed
2496
2497
2498
2499
        return p;
    }
};

Paul's avatar
Paul committed
2500
struct test_rnn_forward : verify_program<test_rnn_forward>
2501
2502
2503
2504
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
2505
        std::size_t seq_len     = 1;
2506
2507
2508
        std::size_t hidden_size = 4;
        std::size_t input_size  = 3;
        std::size_t num_dirct   = 1;
Shucai Xiao's avatar
Shucai Xiao committed
2509
        float clip              = 0.0f;
2510
2511
2512
2513
2514
2515

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
        migraphx::shape w_shape{migraphx::shape::float_type, {num_dirct, hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type, {num_dirct, hidden_size, hidden_size}};
        migraphx::shape b_shape{migraphx::shape::float_type, {num_dirct, 2 * hidden_size}};
2516
        migraphx::shape ih_shape{migraphx::shape::float_type, {num_dirct, batch_size, hidden_size}};
2517

Shucai Xiao's avatar
Shucai Xiao committed
2518
        auto seq  = p.add_parameter("seq", in_shape);
2519
2520
2521
        auto w    = p.add_parameter("w", w_shape);
        auto r    = p.add_parameter("r", r_shape);
        auto bias = p.add_parameter("bias", b_shape);
Shucai Xiao's avatar
Shucai Xiao committed
2522
        auto ih   = p.add_parameter("ih", ih_shape);
2523
        auto und  = p.add_instruction(migraphx::op::undefined{});
Shucai Xiao's avatar
Shucai Xiao committed
2524

2525
2526
2527
        auto output =
            p.add_instruction(migraphx::op::rnn{hidden_size,
                                                {migraphx::op::tanh{}, migraphx::op::tanh{}},
2528
                                                migraphx::op::rnn_direction::forward,
2529
2530
2531
2532
2533
                                                clip},
                              seq,
                              w,
                              r,
                              bias,
2534
                              und,
2535
2536
2537
2538
2539
2540
2541
                              ih);
        p.add_instruction(migraphx::op::rnn_last_output{}, output);

        return p;
    }
};

Paul's avatar
Paul committed
2542
struct test_rnn_forward10 : verify_program<test_rnn_forward10>
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
        std::size_t seq_len     = 10;
        std::size_t hidden_size = 4;
        std::size_t input_size  = 3;
        std::size_t num_dirct   = 1;
        float clip              = 0.0f;

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
        migraphx::shape w_shape{migraphx::shape::float_type, {num_dirct, hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type, {num_dirct, hidden_size, hidden_size}};
        migraphx::shape b_shape{migraphx::shape::float_type, {num_dirct, 2 * hidden_size}};
        migraphx::shape ih_shape{migraphx::shape::float_type, {num_dirct, batch_size, hidden_size}};

        auto seq  = p.add_parameter("seq", in_shape);
Shucai Xiao's avatar
Shucai Xiao committed
2561
2562
        auto w    = p.add_parameter("w", w_shape);
        auto r    = p.add_parameter("r", r_shape);
2563
        auto bias = p.add_parameter("bias", b_shape);
2564
        auto ih   = p.add_parameter("ih", ih_shape);
2565
        auto und  = p.add_instruction(migraphx::op::undefined{});
2566

Shucai Xiao's avatar
Shucai Xiao committed
2567
2568
2569
        auto output =
            p.add_instruction(migraphx::op::rnn{hidden_size,
                                                {migraphx::op::tanh{}, migraphx::op::tanh{}},
2570
                                                migraphx::op::rnn_direction::forward,
Shucai Xiao's avatar
Shucai Xiao committed
2571
2572
2573
2574
2575
                                                clip},
                              seq,
                              w,
                              r,
                              bias,
2576
                              und,
Shucai Xiao's avatar
Shucai Xiao committed
2577
                              ih);
Shucai Xiao's avatar
Shucai Xiao committed
2578
        p.add_instruction(migraphx::op::rnn_last_output{}, output);
2579
2580
2581
2582
2583

        return p;
    }
};

2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
struct test_rnn_two_outputs : verify_program<test_rnn_two_outputs>
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
        std::size_t seq_len     = 10;
        std::size_t hidden_size = 4;
        std::size_t input_size  = 3;
        std::size_t num_dirct   = 1;
        float clip              = 0.0f;

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
        migraphx::shape w_shape{migraphx::shape::float_type, {num_dirct, hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type, {num_dirct, hidden_size, hidden_size}};
        migraphx::shape b_shape{migraphx::shape::float_type, {num_dirct, 2 * hidden_size}};
        migraphx::shape ih_shape{migraphx::shape::float_type, {num_dirct, batch_size, hidden_size}};

        auto seq  = p.add_parameter("seq", in_shape);
        auto w    = p.add_parameter("w", w_shape);
        auto r    = p.add_parameter("r", r_shape);
        auto bias = p.add_parameter("bias", b_shape);
        auto ih   = p.add_parameter("ih", ih_shape);
        auto und  = p.add_instruction(migraphx::op::undefined{});

        auto hs      = p.add_instruction(migraphx::op::rnn{hidden_size,
                                                      {migraphx::op::tanh{}, migraphx::op::tanh{}},
                                                      migraphx::op::rnn_direction::forward,
                                                      clip},
                                    seq,
                                    w,
                                    r,
                                    bias,
                                    und,
                                    ih);
        auto last_hs = p.add_instruction(migraphx::op::rnn_last_output{}, hs);
        p.add_return({hs, last_hs});

        return p;
    }
};

Paul's avatar
Paul committed
2626
struct test_rnn_reverse : verify_program<test_rnn_reverse>
2627
2628
2629
2630
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
2631
        std::size_t seq_len     = 1;
2632
2633
2634
        std::size_t hidden_size = 4;
        std::size_t input_size  = 3;
        std::size_t num_dirct   = 1;
Shucai Xiao's avatar
Shucai Xiao committed
2635
        float clip              = 0.0f;
2636
2637
2638
2639
2640
2641

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
        migraphx::shape w_shape{migraphx::shape::float_type, {num_dirct, hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type, {num_dirct, hidden_size, hidden_size}};
        migraphx::shape b_shape{migraphx::shape::float_type, {num_dirct, 2 * hidden_size}};
2642
        migraphx::shape ih_shape{migraphx::shape::float_type, {num_dirct, batch_size, hidden_size}};
2643

Shucai Xiao's avatar
Shucai Xiao committed
2644
        auto seq  = p.add_parameter("seq", in_shape);
2645
2646
2647
        auto w    = p.add_parameter("w", w_shape);
        auto r    = p.add_parameter("r", r_shape);
        auto bias = p.add_parameter("bias", b_shape);
Shucai Xiao's avatar
Shucai Xiao committed
2648
        auto ih   = p.add_parameter("ih", ih_shape);
2649
        auto und  = p.add_instruction(migraphx::op::undefined{});
2650
2651
2652

        p.add_instruction(migraphx::op::rnn{hidden_size,
                                            {migraphx::op::tanh{}, migraphx::op::tanh{}},
2653
                                            migraphx::op::rnn_direction::reverse,
2654
2655
2656
2657
2658
                                            clip},
                          seq,
                          w,
                          r,
                          bias,
2659
                          und,
2660
2661
2662
2663
2664
2665
                          ih);

        return p;
    }
};

Paul's avatar
Paul committed
2666
struct test_rnn_reverse2 : verify_program<test_rnn_reverse2>
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
        std::size_t seq_len     = 2;
        std::size_t hidden_size = 4;
        std::size_t input_size  = 3;
        std::size_t num_dirct   = 1;
        float clip              = 0.0f;

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
        migraphx::shape w_shape{migraphx::shape::float_type, {num_dirct, hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type, {num_dirct, hidden_size, hidden_size}};
        migraphx::shape b_shape{migraphx::shape::float_type, {num_dirct, 2 * hidden_size}};
        migraphx::shape ih_shape{migraphx::shape::float_type, {num_dirct, batch_size, hidden_size}};

        auto seq  = p.add_parameter("seq", in_shape);
Shucai Xiao's avatar
Shucai Xiao committed
2685
2686
        auto w    = p.add_parameter("w", w_shape);
        auto r    = p.add_parameter("r", r_shape);
2687
        auto bias = p.add_parameter("bias", b_shape);
2688
        auto ih   = p.add_parameter("ih", ih_shape);
2689
        auto und  = p.add_instruction(migraphx::op::undefined{});
2690

Shucai Xiao's avatar
Shucai Xiao committed
2691
2692
        p.add_instruction(migraphx::op::rnn{hidden_size,
                                            {migraphx::op::tanh{}, migraphx::op::tanh{}},
2693
                                            migraphx::op::rnn_direction::reverse,
Shucai Xiao's avatar
Shucai Xiao committed
2694
2695
2696
2697
2698
                                            clip},
                          seq,
                          w,
                          r,
                          bias,
2699
                          und,
Shucai Xiao's avatar
Shucai Xiao committed
2700
                          ih);
Shucai Xiao's avatar
Shucai Xiao committed
2701

2702
2703
2704
2705
        return p;
    }
};

Paul's avatar
Paul committed
2706
struct test_rnn_3args : verify_program<test_rnn_3args>
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
        std::size_t seq_len     = 1;
        std::size_t hidden_size = 4;
        std::size_t input_size  = 3;
        std::size_t num_dirct   = 1;
        float clip              = 0.0f;

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
        migraphx::shape w_shape{migraphx::shape::float_type, {num_dirct, hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type, {num_dirct, hidden_size, hidden_size}};

Shucai Xiao's avatar
Shucai Xiao committed
2722
2723
2724
        auto seq = p.add_parameter("seq", in_shape);
        auto w   = p.add_parameter("w", w_shape);
        auto r   = p.add_parameter("r", r_shape);
2725
2726
2727

        p.add_instruction(migraphx::op::rnn{hidden_size,
                                            {migraphx::op::tanh{}, migraphx::op::tanh{}},
2728
                                            migraphx::op::rnn_direction::reverse,
2729
2730
2731
2732
2733
2734
2735
2736
2737
                                            clip},
                          seq,
                          w,
                          r);

        return p;
    }
};

Paul's avatar
Paul committed
2738
struct test_rnn_4args : verify_program<test_rnn_4args>
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
        std::size_t seq_len     = 5;
        std::size_t hidden_size = 4;
        std::size_t input_size  = 3;
        std::size_t num_dirct   = 1;
        float clip              = 0.0f;

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
        migraphx::shape w_shape{migraphx::shape::float_type, {num_dirct, hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type, {num_dirct, hidden_size, hidden_size}};
        migraphx::shape b_shape{migraphx::shape::float_type, {num_dirct, 2 * hidden_size}};

        auto seq  = p.add_parameter("seq", in_shape);
        auto w    = p.add_parameter("w", w_shape);
        auto r    = p.add_parameter("r", r_shape);
        auto bias = p.add_parameter("bias", b_shape);

        p.add_instruction(migraphx::op::rnn{hidden_size,
                                            {migraphx::op::tanh{}, migraphx::op::tanh{}},
2762
                                            migraphx::op::rnn_direction::reverse,
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
                                            clip},
                          seq,
                          w,
                          r,
                          bias);

        return p;
    }
};

Paul's avatar
Paul committed
2773
struct test_rnn_5args : verify_program<test_rnn_5args>
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
        std::size_t seq_len     = 10;
        std::size_t hidden_size = 4;
        std::size_t input_size  = 3;
        std::size_t num_dirct   = 1;
        float clip              = 0.0f;

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
        migraphx::shape w_shape{migraphx::shape::float_type, {num_dirct, hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type, {num_dirct, hidden_size, hidden_size}};
        migraphx::shape b_shape{migraphx::shape::float_type, {num_dirct, 2 * hidden_size}};

        auto seq  = p.add_parameter("seq", in_shape);
        auto w    = p.add_parameter("w", w_shape);
        auto r    = p.add_parameter("r", r_shape);
        auto bias = p.add_parameter("bias", b_shape);
2794
        auto und  = p.add_instruction(migraphx::op::undefined{});
2795
2796
2797
2798

        auto output =
            p.add_instruction(migraphx::op::rnn{hidden_size,
                                                {migraphx::op::tanh{}, migraphx::op::tanh{}},
2799
                                                migraphx::op::rnn_direction::forward,
2800
2801
2802
2803
                                                clip},
                              seq,
                              w,
                              r,
2804
2805
                              bias,
                              und);
2806
2807
2808
2809
2810
2811
        p.add_instruction(migraphx::op::rnn_last_output{}, output);

        return p;
    }
};

Paul's avatar
Paul committed
2812
struct test_rnn_bidirectional : verify_program<test_rnn_bidirectional>
2813
2814
2815
2816
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
2817
        std::size_t seq_len     = 1;
2818
2819
2820
        std::size_t hidden_size = 4;
        std::size_t input_size  = 3;
        std::size_t num_dirct   = 2;
Shucai Xiao's avatar
Shucai Xiao committed
2821
        float clip              = 0.0f;
2822
2823
2824
2825
2826
2827

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
        migraphx::shape w_shape{migraphx::shape::float_type, {num_dirct, hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type, {num_dirct, hidden_size, hidden_size}};
        migraphx::shape b_shape{migraphx::shape::float_type, {num_dirct, 2 * hidden_size}};
2828
        migraphx::shape ih_shape{migraphx::shape::float_type, {num_dirct, batch_size, hidden_size}};
2829

Shucai Xiao's avatar
Shucai Xiao committed
2830
        auto seq  = p.add_parameter("seq", in_shape);
2831
2832
2833
        auto w    = p.add_parameter("w", w_shape);
        auto r    = p.add_parameter("r", r_shape);
        auto bias = p.add_parameter("bias", b_shape);
Shucai Xiao's avatar
Shucai Xiao committed
2834
        auto ih   = p.add_parameter("ih", ih_shape);
2835
        auto und  = p.add_instruction(migraphx::op::undefined{});
2836
2837
2838
2839

        auto output =
            p.add_instruction(migraphx::op::rnn{hidden_size,
                                                {migraphx::op::tanh{}, migraphx::op::tanh{}},
2840
                                                migraphx::op::rnn_direction::bidirectional,
2841
2842
2843
2844
2845
                                                clip},
                              seq,
                              w,
                              r,
                              bias,
2846
                              und,
2847
2848
2849
2850
2851
2852
2853
                              ih);
        p.add_instruction(migraphx::op::rnn_last_output{}, output);

        return p;
    }
};

Paul's avatar
Paul committed
2854
struct test_rnn_bidirectional10 : verify_program<test_rnn_bidirectional10>
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
        std::size_t seq_len     = 10;
        std::size_t hidden_size = 4;
        std::size_t input_size  = 3;
        std::size_t num_dirct   = 2;
        float clip              = 0.0f;

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
        migraphx::shape w_shape{migraphx::shape::float_type, {num_dirct, hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type, {num_dirct, hidden_size, hidden_size}};
        migraphx::shape b_shape{migraphx::shape::float_type, {num_dirct, 2 * hidden_size}};
        migraphx::shape ih_shape{migraphx::shape::float_type, {num_dirct, batch_size, hidden_size}};

        auto seq  = p.add_parameter("seq", in_shape);
Shucai Xiao's avatar
Shucai Xiao committed
2873
2874
        auto w    = p.add_parameter("w", w_shape);
        auto r    = p.add_parameter("r", r_shape);
2875
        auto bias = p.add_parameter("bias", b_shape);
2876
        auto ih   = p.add_parameter("ih", ih_shape);
2877
        auto und  = p.add_instruction(migraphx::op::undefined{});
Shucai Xiao's avatar
Shucai Xiao committed
2878
2879
2880
        auto output =
            p.add_instruction(migraphx::op::rnn{hidden_size,
                                                {migraphx::op::tanh{}, migraphx::op::tanh{}},
2881
                                                migraphx::op::rnn_direction::bidirectional,
Shucai Xiao's avatar
Shucai Xiao committed
2882
2883
2884
2885
2886
                                                clip},
                              seq,
                              w,
                              r,
                              bias,
2887
                              und,
Shucai Xiao's avatar
Shucai Xiao committed
2888
                              ih);
Shucai Xiao's avatar
Shucai Xiao committed
2889
        p.add_instruction(migraphx::op::rnn_last_output{}, output);
Shucai Xiao's avatar
Shucai Xiao committed
2890

2891
2892
2893
2894
        return p;
    }
};

Paul's avatar
Paul committed
2895
struct test_rnn_bi_3args : verify_program<test_rnn_bi_3args>
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
        std::size_t seq_len     = 10;
        std::size_t hidden_size = 4;
        std::size_t input_size  = 3;
        std::size_t num_dirct   = 2;
        float clip              = 0.0f;

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
        migraphx::shape w_shape{migraphx::shape::float_type, {num_dirct, hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type, {num_dirct, hidden_size, hidden_size}};
2910
2911
        migraphx::shape b_shape{migraphx::shape::float_type, {num_dirct, 2 * hidden_size}};
        migraphx::shape ih_shape{migraphx::shape::float_type, {num_dirct, batch_size, hidden_size}};
2912

Shucai Xiao's avatar
Shucai Xiao committed
2913
2914
2915
        auto seq = p.add_parameter("seq", in_shape);
        auto w   = p.add_parameter("w", w_shape);
        auto r   = p.add_parameter("r", r_shape);
2916
2917
2918
        auto output =
            p.add_instruction(migraphx::op::rnn{hidden_size,
                                                {migraphx::op::tanh{}, migraphx::op::tanh{}},
2919
                                                migraphx::op::rnn_direction::bidirectional,
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
                                                clip},
                              seq,
                              w,
                              r);
        p.add_instruction(migraphx::op::rnn_last_output{}, output);

        return p;
    }
};

Paul's avatar
Paul committed
2930
struct test_gru_forward_last : verify_program<test_gru_forward_last>
Shucai Xiao's avatar
Shucai Xiao committed
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
        std::size_t seq_len     = 3;
        std::size_t hidden_size = 5;
        std::size_t input_size  = 8;
        std::size_t num_dirct   = 1;
        float clip              = 0.0f;

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
Shucai Xiao's avatar
Shucai Xiao committed
2943
2944
2945
2946
        migraphx::shape w_shape{migraphx::shape::float_type,
                                {num_dirct, 3 * hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type,
                                {num_dirct, 3 * hidden_size, hidden_size}};
Shucai Xiao's avatar
Shucai Xiao committed
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
        migraphx::shape b_shape{migraphx::shape::float_type, {num_dirct, 6 * hidden_size}};
        migraphx::shape ih_shape{migraphx::shape::float_type, {num_dirct, batch_size, hidden_size}};

        auto seq  = p.add_parameter("seq", in_shape);
        auto w    = p.add_parameter("w", w_shape);
        auto r    = p.add_parameter("r", r_shape);
        auto bias = p.add_parameter("bias", b_shape);
        auto ih   = p.add_parameter("ih", ih_shape);
        auto und  = p.add_instruction(migraphx::op::undefined{});

        auto output =
            p.add_instruction(migraphx::op::gru{hidden_size,
                                                {migraphx::op::sigmoid{}, migraphx::op::tanh{}},
2960
                                                migraphx::op::rnn_direction::forward,
Shucai Xiao's avatar
Shucai Xiao committed
2961
2962
2963
2964
2965
2966
2967
                                                clip},
                              seq,
                              w,
                              r,
                              bias,
                              und,
                              ih);
2968
        p.add_instruction(migraphx::op::rnn_last_output{}, output);
Shucai Xiao's avatar
Shucai Xiao committed
2969
2970
2971
2972
2973

        return p;
    }
};

Paul's avatar
Paul committed
2974
struct test_gru_forward_hs : verify_program<test_gru_forward_hs>
Shucai Xiao's avatar
Shucai Xiao committed
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
        std::size_t seq_len     = 3;
        std::size_t hidden_size = 5;
        std::size_t input_size  = 8;
        std::size_t num_dirct   = 1;
        float clip              = 0.0f;

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
Shucai Xiao's avatar
Shucai Xiao committed
2987
2988
2989
2990
        migraphx::shape w_shape{migraphx::shape::float_type,
                                {num_dirct, 3 * hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type,
                                {num_dirct, 3 * hidden_size, hidden_size}};
Shucai Xiao's avatar
Shucai Xiao committed
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
        migraphx::shape b_shape{migraphx::shape::float_type, {num_dirct, 6 * hidden_size}};
        migraphx::shape ih_shape{migraphx::shape::float_type, {num_dirct, batch_size, hidden_size}};

        auto seq  = p.add_parameter("seq", in_shape);
        auto w    = p.add_parameter("w", w_shape);
        auto r    = p.add_parameter("r", r_shape);
        auto bias = p.add_parameter("bias", b_shape);
        auto ih   = p.add_parameter("ih", ih_shape);
        auto und  = p.add_instruction(migraphx::op::undefined{});

        p.add_instruction(migraphx::op::gru{hidden_size,
Shucai Xiao's avatar
Shucai Xiao committed
3002
                                            {migraphx::op::sigmoid{}, migraphx::op::tanh{}},
3003
                                            migraphx::op::rnn_direction::forward,
Shucai Xiao's avatar
Shucai Xiao committed
3004
3005
3006
3007
3008
3009
3010
                                            clip},
                          seq,
                          w,
                          r,
                          bias,
                          und,
                          ih);
Shucai Xiao's avatar
Shucai Xiao committed
3011
3012
3013
3014
3015

        return p;
    }
};

Paul's avatar
Paul committed
3016
struct test_gru_forward_3args_und : verify_program<test_gru_forward_3args_und>
Shucai Xiao's avatar
Shucai Xiao committed
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
        std::size_t seq_len     = 3;
        std::size_t hidden_size = 5;
        std::size_t input_size  = 8;
        std::size_t num_dirct   = 1;
        float clip              = 0.0f;

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
Shucai Xiao's avatar
Shucai Xiao committed
3029
3030
3031
3032
3033
3034
3035
3036
        migraphx::shape w_shape{migraphx::shape::float_type,
                                {num_dirct, 3 * hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type,
                                {num_dirct, 3 * hidden_size, hidden_size}};
        auto seq = p.add_parameter("seq", in_shape);
        auto w   = p.add_parameter("w", w_shape);
        auto r   = p.add_parameter("r", r_shape);
        auto und = p.add_instruction(migraphx::op::undefined{});
Shucai Xiao's avatar
Shucai Xiao committed
3037
        p.add_instruction(migraphx::op::gru{hidden_size,
Shucai Xiao's avatar
Shucai Xiao committed
3038
                                            {migraphx::op::sigmoid{}, migraphx::op::tanh{}},
3039
                                            migraphx::op::rnn_direction::forward,
Shucai Xiao's avatar
Shucai Xiao committed
3040
3041
3042
3043
3044
3045
3046
                                            clip},
                          seq,
                          w,
                          r,
                          und,
                          und,
                          und);
Shucai Xiao's avatar
Shucai Xiao committed
3047
3048
3049
3050
3051

        return p;
    }
};

Paul's avatar
Paul committed
3052
struct test_gru_forward_3args : verify_program<test_gru_forward_3args>
Shucai Xiao's avatar
Shucai Xiao committed
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
        std::size_t seq_len     = 3;
        std::size_t hidden_size = 5;
        std::size_t input_size  = 8;
        std::size_t num_dirct   = 1;
        float clip              = 0.0f;

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
Shucai Xiao's avatar
Shucai Xiao committed
3065
3066
3067
3068
3069
3070
3071
        migraphx::shape w_shape{migraphx::shape::float_type,
                                {num_dirct, 3 * hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type,
                                {num_dirct, 3 * hidden_size, hidden_size}};
        auto seq = p.add_parameter("seq", in_shape);
        auto w   = p.add_parameter("w", w_shape);
        auto r   = p.add_parameter("r", r_shape);
Shucai Xiao's avatar
Shucai Xiao committed
3072
        p.add_instruction(migraphx::op::gru{hidden_size,
Shucai Xiao's avatar
Shucai Xiao committed
3073
                                            {migraphx::op::sigmoid{}, migraphx::op::tanh{}},
3074
                                            migraphx::op::rnn_direction::forward,
Shucai Xiao's avatar
Shucai Xiao committed
3075
3076
3077
3078
                                            clip},
                          seq,
                          w,
                          r);
Shucai Xiao's avatar
Shucai Xiao committed
3079
3080
3081
3082
3083

        return p;
    }
};

Paul's avatar
Paul committed
3084
struct test_gru_forward_seq1 : verify_program<test_gru_forward_seq1>
Shucai Xiao's avatar
Shucai Xiao committed
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
        std::size_t seq_len     = 1;
        std::size_t hidden_size = 5;
        std::size_t input_size  = 8;
        std::size_t num_dirct   = 1;
        float clip              = 0.0f;

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
Shucai Xiao's avatar
Shucai Xiao committed
3097
3098
3099
3100
3101
3102
3103
        migraphx::shape w_shape{migraphx::shape::float_type,
                                {num_dirct, 3 * hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type,
                                {num_dirct, 3 * hidden_size, hidden_size}};
        auto seq = p.add_parameter("seq", in_shape);
        auto w   = p.add_parameter("w", w_shape);
        auto r   = p.add_parameter("r", r_shape);
Shucai Xiao's avatar
Shucai Xiao committed
3104
        p.add_instruction(migraphx::op::gru{hidden_size,
Shucai Xiao's avatar
Shucai Xiao committed
3105
                                            {migraphx::op::sigmoid{}, migraphx::op::tanh{}},
3106
                                            migraphx::op::rnn_direction::forward,
Shucai Xiao's avatar
Shucai Xiao committed
3107
3108
3109
3110
                                            clip},
                          seq,
                          w,
                          r);
Shucai Xiao's avatar
Shucai Xiao committed
3111
3112
3113
3114
3115

        return p;
    }
};

Paul's avatar
Paul committed
3116
struct test_gru_forward_default_actv : verify_program<test_gru_forward_default_actv>
Shucai Xiao's avatar
Shucai Xiao committed
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
        std::size_t seq_len     = 1;
        std::size_t hidden_size = 5;
        std::size_t input_size  = 8;
        std::size_t num_dirct   = 1;
        float clip              = 0.0f;

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
Shucai Xiao's avatar
Shucai Xiao committed
3129
3130
3131
3132
3133
3134
3135
3136
        migraphx::shape w_shape{migraphx::shape::float_type,
                                {num_dirct, 3 * hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type,
                                {num_dirct, 3 * hidden_size, hidden_size}};
        auto seq = p.add_parameter("seq", in_shape);
        auto w   = p.add_parameter("w", w_shape);
        auto r   = p.add_parameter("r", r_shape);
        p.add_instruction(
Shucai Xiao's avatar
Shucai Xiao committed
3137
3138
3139
3140
            migraphx::op::gru{hidden_size, {}, migraphx::op::rnn_direction::forward, clip},
            seq,
            w,
            r);
Shucai Xiao's avatar
Shucai Xiao committed
3141
3142
3143
3144
3145

        return p;
    }
};

3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
struct test_gru_two_outputs : verify_program<test_gru_two_outputs>
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
        std::size_t seq_len     = 1;
        std::size_t hidden_size = 5;
        std::size_t input_size  = 8;
        std::size_t num_dirct   = 1;
        float clip              = 0.0f;

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
        migraphx::shape w_shape{migraphx::shape::float_type,
                                {num_dirct, 3 * hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type,
                                {num_dirct, 3 * hidden_size, hidden_size}};
        auto seq = p.add_parameter("seq", in_shape);
        auto w   = p.add_parameter("w", w_shape);
        auto r   = p.add_parameter("r", r_shape);
        auto hs  = p.add_instruction(
            migraphx::op::gru{hidden_size, {}, migraphx::op::rnn_direction::forward, clip},
            seq,
            w,
            r);
        auto last_hs = p.add_instruction(migraphx::op::rnn_last_output{}, hs);
        p.add_return({hs, last_hs});

        return p;
    }
};

Paul's avatar
Paul committed
3178
struct test_gru_forward_default_actv1 : verify_program<test_gru_forward_default_actv1>
Shucai Xiao's avatar
Shucai Xiao committed
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
        std::size_t seq_len     = 3;
        std::size_t hidden_size = 5;
        std::size_t input_size  = 8;
        std::size_t num_dirct   = 1;
        float clip              = 0.0f;

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
Shucai Xiao's avatar
Shucai Xiao committed
3191
3192
3193
3194
        migraphx::shape w_shape{migraphx::shape::float_type,
                                {num_dirct, 3 * hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type,
                                {num_dirct, 3 * hidden_size, hidden_size}};
Shucai Xiao's avatar
Shucai Xiao committed
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
        migraphx::shape b_shape{migraphx::shape::float_type, {num_dirct, 6 * hidden_size}};
        migraphx::shape ih_shape{migraphx::shape::float_type, {num_dirct, batch_size, hidden_size}};

        auto seq  = p.add_parameter("seq", in_shape);
        auto w    = p.add_parameter("w", w_shape);
        auto r    = p.add_parameter("r", r_shape);
        auto bias = p.add_parameter("bias", b_shape);
        auto ih   = p.add_parameter("ih", ih_shape);
        auto und  = p.add_instruction(migraphx::op::undefined{});

Shucai Xiao's avatar
Shucai Xiao committed
3205
3206
        p.add_instruction(
            migraphx::op::gru{
3207
                hidden_size, {migraphx::op::sigmoid{}}, migraphx::op::rnn_direction::forward, clip},
Shucai Xiao's avatar
Shucai Xiao committed
3208
3209
3210
3211
3212
3213
            seq,
            w,
            r,
            bias,
            und,
            ih);
Shucai Xiao's avatar
Shucai Xiao committed
3214
3215
3216
3217
3218

        return p;
    }
};

Paul's avatar
Paul committed
3219
struct test_gru_reverse_last : verify_program<test_gru_reverse_last>
Shucai Xiao's avatar
Shucai Xiao committed
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
        std::size_t seq_len     = 3;
        std::size_t hidden_size = 5;
        std::size_t input_size  = 8;
        std::size_t num_dirct   = 1;
        float clip              = 0.0f;

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
Shucai Xiao's avatar
Shucai Xiao committed
3232
3233
3234
3235
        migraphx::shape w_shape{migraphx::shape::float_type,
                                {num_dirct, 3 * hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type,
                                {num_dirct, 3 * hidden_size, hidden_size}};
Shucai Xiao's avatar
Shucai Xiao committed
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
        migraphx::shape b_shape{migraphx::shape::float_type, {num_dirct, 6 * hidden_size}};
        migraphx::shape ih_shape{migraphx::shape::float_type, {num_dirct, batch_size, hidden_size}};

        auto seq  = p.add_parameter("seq", in_shape);
        auto w    = p.add_parameter("w", w_shape);
        auto r    = p.add_parameter("r", r_shape);
        auto bias = p.add_parameter("bias", b_shape);
        auto ih   = p.add_parameter("ih", ih_shape);
        auto und  = p.add_instruction(migraphx::op::undefined{});

        auto output =
            p.add_instruction(migraphx::op::gru{hidden_size,
                                                {migraphx::op::sigmoid{}, migraphx::op::tanh{}},
3249
                                                migraphx::op::rnn_direction::reverse,
Shucai Xiao's avatar
Shucai Xiao committed
3250
3251
3252
3253
3254
3255
3256
                                                clip},
                              seq,
                              w,
                              r,
                              bias,
                              und,
                              ih);
3257
        p.add_instruction(migraphx::op::rnn_last_output{}, output);
Shucai Xiao's avatar
Shucai Xiao committed
3258
3259
3260
3261
3262

        return p;
    }
};

Paul's avatar
Paul committed
3263
struct test_gru_reverse_3args : verify_program<test_gru_reverse_3args>
Shucai Xiao's avatar
Shucai Xiao committed
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
        std::size_t seq_len     = 3;
        std::size_t hidden_size = 5;
        std::size_t input_size  = 8;
        std::size_t num_dirct   = 1;
        float clip              = 0.0f;

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
Shucai Xiao's avatar
Shucai Xiao committed
3276
3277
3278
3279
3280
3281
3282
        migraphx::shape w_shape{migraphx::shape::float_type,
                                {num_dirct, 3 * hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type,
                                {num_dirct, 3 * hidden_size, hidden_size}};
        auto seq = p.add_parameter("seq", in_shape);
        auto w   = p.add_parameter("w", w_shape);
        auto r   = p.add_parameter("r", r_shape);
Shucai Xiao's avatar
Shucai Xiao committed
3283
        p.add_instruction(migraphx::op::gru{hidden_size,
Shucai Xiao's avatar
Shucai Xiao committed
3284
                                            {migraphx::op::sigmoid{}, migraphx::op::tanh{}},
3285
                                            migraphx::op::rnn_direction::reverse,
Shucai Xiao's avatar
Shucai Xiao committed
3286
3287
3288
3289
                                            clip},
                          seq,
                          w,
                          r);
Shucai Xiao's avatar
Shucai Xiao committed
3290
3291
3292
3293
3294

        return p;
    }
};

Paul's avatar
Paul committed
3295
struct test_gru_bidirct_last : verify_program<test_gru_bidirct_last>
Shucai Xiao's avatar
Shucai Xiao committed
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
        std::size_t seq_len     = 3;
        std::size_t hidden_size = 5;
        std::size_t input_size  = 8;
        std::size_t num_dirct   = 2;
        float clip              = 0.0f;

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
Shucai Xiao's avatar
Shucai Xiao committed
3308
3309
3310
3311
        migraphx::shape w_shape{migraphx::shape::float_type,
                                {num_dirct, 3 * hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type,
                                {num_dirct, 3 * hidden_size, hidden_size}};
Shucai Xiao's avatar
Shucai Xiao committed
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
        migraphx::shape b_shape{migraphx::shape::float_type, {num_dirct, 6 * hidden_size}};
        migraphx::shape ih_shape{migraphx::shape::float_type, {num_dirct, batch_size, hidden_size}};

        auto seq  = p.add_parameter("seq", in_shape);
        auto w    = p.add_parameter("w", w_shape);
        auto r    = p.add_parameter("r", r_shape);
        auto bias = p.add_parameter("bias", b_shape);
        auto ih   = p.add_parameter("ih", ih_shape);
        auto und  = p.add_instruction(migraphx::op::undefined{});

        auto output =
            p.add_instruction(migraphx::op::gru{hidden_size,
                                                {migraphx::op::sigmoid{}, migraphx::op::tanh{}},
3325
                                                migraphx::op::rnn_direction::bidirectional,
Shucai Xiao's avatar
Shucai Xiao committed
3326
3327
3328
3329
3330
3331
3332
                                                clip},
                              seq,
                              w,
                              r,
                              bias,
                              und,
                              ih);
3333
        p.add_instruction(migraphx::op::rnn_last_output{}, output);
Shucai Xiao's avatar
Shucai Xiao committed
3334
3335
3336
3337
3338

        return p;
    }
};

Paul's avatar
Paul committed
3339
struct test_gru_bidirct_hs : verify_program<test_gru_bidirct_hs>
Shucai Xiao's avatar
Shucai Xiao committed
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
        std::size_t seq_len     = 3;
        std::size_t hidden_size = 5;
        std::size_t input_size  = 8;
        std::size_t num_dirct   = 2;
        float clip              = 0.0f;

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
Shucai Xiao's avatar
Shucai Xiao committed
3352
3353
3354
3355
        migraphx::shape w_shape{migraphx::shape::float_type,
                                {num_dirct, 3 * hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type,
                                {num_dirct, 3 * hidden_size, hidden_size}};
Shucai Xiao's avatar
Shucai Xiao committed
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
        migraphx::shape b_shape{migraphx::shape::float_type, {num_dirct, 6 * hidden_size}};
        migraphx::shape ih_shape{migraphx::shape::float_type, {num_dirct, batch_size, hidden_size}};

        auto seq  = p.add_parameter("seq", in_shape);
        auto w    = p.add_parameter("w", w_shape);
        auto r    = p.add_parameter("r", r_shape);
        auto bias = p.add_parameter("bias", b_shape);
        auto ih   = p.add_parameter("ih", ih_shape);
        auto und  = p.add_instruction(migraphx::op::undefined{});

        p.add_instruction(migraphx::op::gru{hidden_size,
Shucai Xiao's avatar
Shucai Xiao committed
3367
                                            {migraphx::op::sigmoid{}, migraphx::op::tanh{}},
3368
                                            migraphx::op::rnn_direction::bidirectional,
Shucai Xiao's avatar
Shucai Xiao committed
3369
3370
3371
3372
3373
3374
3375
                                            clip},
                          seq,
                          w,
                          r,
                          bias,
                          und,
                          ih);
Shucai Xiao's avatar
Shucai Xiao committed
3376
3377
3378
3379
3380

        return p;
    }
};

Paul's avatar
Paul committed
3381
struct test_gru_bidirct_3args_und : verify_program<test_gru_bidirct_3args_und>
Shucai Xiao's avatar
Shucai Xiao committed
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
        std::size_t seq_len     = 3;
        std::size_t hidden_size = 5;
        std::size_t input_size  = 8;
        std::size_t num_dirct   = 2;
        float clip              = 0.0f;

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
Shucai Xiao's avatar
Shucai Xiao committed
3394
3395
3396
3397
3398
3399
3400
3401
        migraphx::shape w_shape{migraphx::shape::float_type,
                                {num_dirct, 3 * hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type,
                                {num_dirct, 3 * hidden_size, hidden_size}};
        auto seq = p.add_parameter("seq", in_shape);
        auto w   = p.add_parameter("w", w_shape);
        auto r   = p.add_parameter("r", r_shape);
        auto und = p.add_instruction(migraphx::op::undefined{});
Shucai Xiao's avatar
Shucai Xiao committed
3402
        p.add_instruction(migraphx::op::gru{hidden_size,
Shucai Xiao's avatar
Shucai Xiao committed
3403
                                            {migraphx::op::sigmoid{}, migraphx::op::tanh{}},
3404
                                            migraphx::op::rnn_direction::bidirectional,
Shucai Xiao's avatar
Shucai Xiao committed
3405
3406
3407
3408
3409
3410
3411
                                            clip},
                          seq,
                          w,
                          r,
                          und,
                          und,
                          und);
Shucai Xiao's avatar
Shucai Xiao committed
3412
3413
3414
3415
3416

        return p;
    }
};

Paul's avatar
Paul committed
3417
struct test_gru_bidirct_3args : verify_program<test_gru_bidirct_3args>
Shucai Xiao's avatar
Shucai Xiao committed
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
        std::size_t seq_len     = 3;
        std::size_t hidden_size = 5;
        std::size_t input_size  = 8;
        std::size_t num_dirct   = 2;
        float clip              = 0.0f;

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
Shucai Xiao's avatar
Shucai Xiao committed
3430
3431
3432
3433
3434
3435
3436
        migraphx::shape w_shape{migraphx::shape::float_type,
                                {num_dirct, 3 * hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type,
                                {num_dirct, 3 * hidden_size, hidden_size}};
        auto seq = p.add_parameter("seq", in_shape);
        auto w   = p.add_parameter("w", w_shape);
        auto r   = p.add_parameter("r", r_shape);
Shucai Xiao's avatar
Shucai Xiao committed
3437
        p.add_instruction(migraphx::op::gru{hidden_size,
Shucai Xiao's avatar
Shucai Xiao committed
3438
                                            {migraphx::op::sigmoid{}, migraphx::op::tanh{}},
3439
                                            migraphx::op::rnn_direction::bidirectional,
Shucai Xiao's avatar
Shucai Xiao committed
3440
3441
3442
3443
                                            clip},
                          seq,
                          w,
                          r);
Shucai Xiao's avatar
Shucai Xiao committed
3444
3445
3446
3447
3448

        return p;
    }
};

Paul's avatar
Paul committed
3449
struct test_gru_bidirct_seq1 : verify_program<test_gru_bidirct_seq1>
Shucai Xiao's avatar
Shucai Xiao committed
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
        std::size_t seq_len     = 1;
        std::size_t hidden_size = 5;
        std::size_t input_size  = 8;
        std::size_t num_dirct   = 2;
        float clip              = 0.0f;

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
Shucai Xiao's avatar
Shucai Xiao committed
3462
3463
3464
3465
3466
3467
3468
        migraphx::shape w_shape{migraphx::shape::float_type,
                                {num_dirct, 3 * hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type,
                                {num_dirct, 3 * hidden_size, hidden_size}};
        auto seq = p.add_parameter("seq", in_shape);
        auto w   = p.add_parameter("w", w_shape);
        auto r   = p.add_parameter("r", r_shape);
Shucai Xiao's avatar
Shucai Xiao committed
3469
        p.add_instruction(migraphx::op::gru{hidden_size,
Shucai Xiao's avatar
Shucai Xiao committed
3470
                                            {migraphx::op::sigmoid{}, migraphx::op::tanh{}},
3471
                                            migraphx::op::rnn_direction::bidirectional,
Shucai Xiao's avatar
Shucai Xiao committed
3472
3473
3474
3475
                                            clip},
                          seq,
                          w,
                          r);
Shucai Xiao's avatar
Shucai Xiao committed
3476
3477
3478
3479
3480

        return p;
    }
};

Paul's avatar
Paul committed
3481
struct test_gru_bidirct_default_actv : verify_program<test_gru_bidirct_default_actv>
Shucai Xiao's avatar
Shucai Xiao committed
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
        std::size_t seq_len     = 1;
        std::size_t hidden_size = 5;
        std::size_t input_size  = 8;
        std::size_t num_dirct   = 2;
        float clip              = 0.0f;

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
Shucai Xiao's avatar
Shucai Xiao committed
3494
3495
3496
3497
3498
3499
3500
3501
        migraphx::shape w_shape{migraphx::shape::float_type,
                                {num_dirct, 3 * hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type,
                                {num_dirct, 3 * hidden_size, hidden_size}};
        auto seq = p.add_parameter("seq", in_shape);
        auto w   = p.add_parameter("w", w_shape);
        auto r   = p.add_parameter("r", r_shape);
        p.add_instruction(
Shucai Xiao's avatar
Shucai Xiao committed
3502
3503
3504
3505
            migraphx::op::gru{hidden_size, {}, migraphx::op::rnn_direction::bidirectional, clip},
            seq,
            w,
            r);
Shucai Xiao's avatar
Shucai Xiao committed
3506
3507
3508
3509
3510

        return p;
    }
};

Paul's avatar
Paul committed
3511
struct test_gru_bidirct_default_actv1 : verify_program<test_gru_bidirct_default_actv1>
Shucai Xiao's avatar
Shucai Xiao committed
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
        std::size_t seq_len     = 3;
        std::size_t hidden_size = 5;
        std::size_t input_size  = 8;
        std::size_t num_dirct   = 2;
        float clip              = 0.0f;

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
Shucai Xiao's avatar
Shucai Xiao committed
3524
3525
3526
3527
        migraphx::shape w_shape{migraphx::shape::float_type,
                                {num_dirct, 3 * hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type,
                                {num_dirct, 3 * hidden_size, hidden_size}};
Shucai Xiao's avatar
Shucai Xiao committed
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
        migraphx::shape b_shape{migraphx::shape::float_type, {num_dirct, 6 * hidden_size}};
        migraphx::shape ih_shape{migraphx::shape::float_type, {num_dirct, batch_size, hidden_size}};

        auto seq  = p.add_parameter("seq", in_shape);
        auto w    = p.add_parameter("w", w_shape);
        auto r    = p.add_parameter("r", r_shape);
        auto bias = p.add_parameter("bias", b_shape);
        auto ih   = p.add_parameter("ih", ih_shape);
        auto und  = p.add_instruction(migraphx::op::undefined{});

Shucai Xiao's avatar
Shucai Xiao committed
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
        p.add_instruction(migraphx::op::gru{hidden_size,
                                            {migraphx::op::sigmoid{}},
                                            migraphx::op::rnn_direction::bidirectional,
                                            clip},
                          seq,
                          w,
                          r,
                          bias,
                          und,
                          ih);
Shucai Xiao's avatar
Shucai Xiao committed
3548
3549
3550
3551
3552

        return p;
    }
};

Paul's avatar
Paul committed
3553
struct test_lstm_forward_last : verify_program<test_lstm_forward_last>
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
        std::size_t seq_len     = 3;
        std::size_t hidden_size = 5;
        std::size_t input_size  = 8;
        std::size_t num_dirct   = 1;
        float clip              = 0.0f;

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
        migraphx::shape w_shape{migraphx::shape::float_type,
                                {num_dirct, 4 * hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type,
                                {num_dirct, 4 * hidden_size, hidden_size}};
        migraphx::shape b_shape{migraphx::shape::float_type, {num_dirct, 8 * hidden_size}};
        migraphx::shape ih_shape{migraphx::shape::float_type, {num_dirct, batch_size, hidden_size}};
        migraphx::shape ic_shape{migraphx::shape::float_type, {num_dirct, batch_size, hidden_size}};
        migraphx::shape pph_shape{migraphx::shape::float_type, {num_dirct, 3 * hidden_size}};

        auto seq  = p.add_parameter("seq", in_shape);
        auto w    = p.add_parameter("w", w_shape);
        auto r    = p.add_parameter("r", r_shape);
        auto bias = p.add_parameter("bias", b_shape);
        auto ih   = p.add_parameter("ih", ih_shape);
        auto ic   = p.add_parameter("ic", ic_shape);
        auto pph  = p.add_parameter("pph", pph_shape);
        auto und  = p.add_instruction(migraphx::op::undefined{});

Shucai Xiao's avatar
Shucai Xiao committed
3584
        auto output = p.add_instruction(
Shucai Xiao's avatar
Shucai Xiao committed
3585
3586
3587
3588
3589
            migraphx::op::lstm{
                hidden_size,
                {migraphx::op::sigmoid{}, migraphx::op::tanh{}, migraphx::op::tanh{}},
                migraphx::op::rnn_direction::forward,
                clip},
Shucai Xiao's avatar
Shucai Xiao committed
3590
3591
3592
3593
3594
3595
3596
3597
            seq,
            w,
            r,
            bias,
            und,
            ih,
            ic,
            pph);
3598
3599
3600
3601
3602
3603
        p.add_instruction(migraphx::op::rnn_last_output{}, output);

        return p;
    }
};

Paul's avatar
Paul committed
3604
struct test_lstm_forward_hs : verify_program<test_lstm_forward_hs>
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
        std::size_t seq_len     = 3;
        std::size_t hidden_size = 5;
        std::size_t input_size  = 8;
        std::size_t num_dirct   = 1;
        float clip              = 0.0f;

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
        migraphx::shape w_shape{migraphx::shape::float_type,
                                {num_dirct, 4 * hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type,
                                {num_dirct, 4 * hidden_size, hidden_size}};
        migraphx::shape b_shape{migraphx::shape::float_type, {num_dirct, 8 * hidden_size}};
        migraphx::shape ih_shape{migraphx::shape::float_type, {num_dirct, batch_size, hidden_size}};
        migraphx::shape ic_shape{migraphx::shape::float_type, {num_dirct, batch_size, hidden_size}};
        migraphx::shape pph_shape{migraphx::shape::float_type, {num_dirct, 3 * hidden_size}};

        auto seq  = p.add_parameter("seq", in_shape);
        auto w    = p.add_parameter("w", w_shape);
        auto r    = p.add_parameter("r", r_shape);
        auto bias = p.add_parameter("bias", b_shape);
        auto ih   = p.add_parameter("ih", ih_shape);
        auto ic   = p.add_parameter("ic", ic_shape);
        auto pph  = p.add_parameter("pph", pph_shape);
        auto und  = p.add_instruction(migraphx::op::undefined{});

Shucai Xiao's avatar
Shucai Xiao committed
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
        p.add_instruction(
            migraphx::op::lstm{
                hidden_size,
                {migraphx::op::sigmoid{}, migraphx::op::tanh{}, migraphx::op::tanh{}},
                migraphx::op::rnn_direction::forward,
                clip},
            seq,
            w,
            r,
            bias,
            und,
            ih,
            ic,
            pph);
3649
3650
3651
3652
3653

        return p;
    }
};

Paul's avatar
Paul committed
3654
struct test_lstm_forward_3args_und : verify_program<test_lstm_forward_3args_und>
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
        std::size_t seq_len     = 3;
        std::size_t hidden_size = 5;
        std::size_t input_size  = 8;
        std::size_t num_dirct   = 1;
        float clip              = 0.0f;

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
        migraphx::shape w_shape{migraphx::shape::float_type,
                                {num_dirct, 4 * hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type,
                                {num_dirct, 4 * hidden_size, hidden_size}};
        auto seq = p.add_parameter("seq", in_shape);
        auto w   = p.add_parameter("w", w_shape);
        auto r   = p.add_parameter("r", r_shape);
        auto und = p.add_instruction(migraphx::op::undefined{});
Shucai Xiao's avatar
Shucai Xiao committed
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
        p.add_instruction(
            migraphx::op::lstm{
                hidden_size,
                {migraphx::op::sigmoid{}, migraphx::op::tanh{}, migraphx::op::tanh{}},
                migraphx::op::rnn_direction::forward,
                clip},
            seq,
            w,
            r,
            und,
            und,
            und,
            und,
            und);
3689
3690
3691
3692
3693

        return p;
    }
};

Paul's avatar
Paul committed
3694
struct test_lstm_forward_3args : verify_program<test_lstm_forward_3args>
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
        std::size_t seq_len     = 3;
        std::size_t hidden_size = 5;
        std::size_t input_size  = 8;
        std::size_t num_dirct   = 1;
        float clip              = 0.0f;

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
        migraphx::shape w_shape{migraphx::shape::float_type,
                                {num_dirct, 4 * hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type,
                                {num_dirct, 4 * hidden_size, hidden_size}};
        auto seq = p.add_parameter("seq", in_shape);
        auto w   = p.add_parameter("w", w_shape);
        auto r   = p.add_parameter("r", r_shape);
Shucai Xiao's avatar
Shucai Xiao committed
3714
3715
3716
3717
3718
3719
3720
3721
3722
        p.add_instruction(
            migraphx::op::lstm{
                hidden_size,
                {migraphx::op::sigmoid{}, migraphx::op::tanh{}, migraphx::op::tanh{}},
                migraphx::op::rnn_direction::forward,
                clip},
            seq,
            w,
            r);
3723
3724
3725
3726
3727

        return p;
    }
};

3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
struct test_lstm_two_outputs : verify_program<test_lstm_two_outputs>
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
        std::size_t seq_len     = 3;
        std::size_t hidden_size = 5;
        std::size_t input_size  = 8;
        std::size_t num_dirct   = 1;
        float clip              = 0.0f;

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
        migraphx::shape w_shape{migraphx::shape::float_type,
                                {num_dirct, 4 * hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type,
                                {num_dirct, 4 * hidden_size, hidden_size}};
        auto seq = p.add_parameter("seq", in_shape);
        auto w   = p.add_parameter("w", w_shape);
        auto r   = p.add_parameter("r", r_shape);
        auto hs  = p.add_instruction(
            migraphx::op::lstm{
                hidden_size,
                {migraphx::op::sigmoid{}, migraphx::op::tanh{}, migraphx::op::tanh{}},
                migraphx::op::rnn_direction::forward,
                clip},
            seq,
            w,
            r);
        auto last_hs = p.add_instruction(migraphx::op::rnn_last_output{}, hs);
        p.add_return({hs, last_hs});

        return p;
    }
};

struct test_lstm_three_outputs : verify_program<test_lstm_three_outputs>
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
        std::size_t seq_len     = 3;
        std::size_t hidden_size = 5;
        std::size_t input_size  = 8;
        std::size_t num_dirct   = 1;
        float clip              = 0.0f;

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
        migraphx::shape w_shape{migraphx::shape::float_type,
                                {num_dirct, 4 * hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type,
                                {num_dirct, 4 * hidden_size, hidden_size}};
        auto seq = p.add_parameter("seq", in_shape);
        auto w   = p.add_parameter("w", w_shape);
        auto r   = p.add_parameter("r", r_shape);
        auto hs  = p.add_instruction(
            migraphx::op::lstm{
                hidden_size,
                {migraphx::op::sigmoid{}, migraphx::op::tanh{}, migraphx::op::tanh{}},
                migraphx::op::rnn_direction::forward,
                clip},
            seq,
            w,
            r);
        auto last_hs   = p.add_instruction(migraphx::op::rnn_last_output{}, hs);
        auto last_cell = p.add_instruction(migraphx::op::lstm_last_cell_output{}, hs);
        p.add_return({hs, last_hs, last_cell});

        return p;
    }
};

Paul's avatar
Paul committed
3801
struct test_lstm_forward_seq1 : verify_program<test_lstm_forward_seq1>
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
        std::size_t seq_len     = 1;
        std::size_t hidden_size = 5;
        std::size_t input_size  = 8;
        std::size_t num_dirct   = 1;
        float clip              = 0.0f;

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
        migraphx::shape w_shape{migraphx::shape::float_type,
                                {num_dirct, 4 * hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type,
                                {num_dirct, 4 * hidden_size, hidden_size}};
        auto seq = p.add_parameter("seq", in_shape);
        auto w   = p.add_parameter("w", w_shape);
        auto r   = p.add_parameter("r", r_shape);
Shucai Xiao's avatar
Shucai Xiao committed
3821
3822
3823
3824
3825
3826
3827
3828
3829
        p.add_instruction(
            migraphx::op::lstm{
                hidden_size,
                {migraphx::op::sigmoid{}, migraphx::op::tanh{}, migraphx::op::tanh{}},
                migraphx::op::rnn_direction::forward,
                clip},
            seq,
            w,
            r);
3830
3831
3832
3833
3834

        return p;
    }
};

Paul's avatar
Paul committed
3835
struct test_lstm_forward_default_actv : verify_program<test_lstm_forward_default_actv>
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
        std::size_t seq_len     = 1;
        std::size_t hidden_size = 5;
        std::size_t input_size  = 8;
        std::size_t num_dirct   = 1;
        float clip              = 0.0f;

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
        migraphx::shape w_shape{migraphx::shape::float_type,
                                {num_dirct, 4 * hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type,
                                {num_dirct, 4 * hidden_size, hidden_size}};
        auto seq = p.add_parameter("seq", in_shape);
        auto w   = p.add_parameter("w", w_shape);
        auto r   = p.add_parameter("r", r_shape);
        p.add_instruction(
            migraphx::op::lstm{hidden_size, {}, migraphx::op::rnn_direction::forward, clip},
            seq,
            w,
            r);

        return p;
    }
};

Paul's avatar
Paul committed
3865
struct test_lstm_forward_default_actv1 : verify_program<test_lstm_forward_default_actv1>
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
        std::size_t seq_len     = 3;
        std::size_t hidden_size = 5;
        std::size_t input_size  = 8;
        std::size_t num_dirct   = 1;
        float clip              = 0.0f;

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
        migraphx::shape w_shape{migraphx::shape::float_type,
                                {num_dirct, 4 * hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type,
                                {num_dirct, 4 * hidden_size, hidden_size}};
        migraphx::shape b_shape{migraphx::shape::float_type, {num_dirct, 8 * hidden_size}};
        migraphx::shape ih_shape{migraphx::shape::float_type, {num_dirct, batch_size, hidden_size}};

        auto seq  = p.add_parameter("seq", in_shape);
        auto w    = p.add_parameter("w", w_shape);
        auto r    = p.add_parameter("r", r_shape);
        auto bias = p.add_parameter("bias", b_shape);
        auto ih   = p.add_parameter("ih", ih_shape);
        auto und  = p.add_instruction(migraphx::op::undefined{});

        p.add_instruction(
            migraphx::op::lstm{
                hidden_size, {migraphx::op::sigmoid{}}, migraphx::op::rnn_direction::forward, clip},
            seq,
            w,
            r,
            bias,
            und,
            ih);

        return p;
    }
};

Paul's avatar
Paul committed
3906
struct test_lstm_reverse_last : verify_program<test_lstm_reverse_last>
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
        std::size_t seq_len     = 3;
        std::size_t hidden_size = 5;
        std::size_t input_size  = 8;
        std::size_t num_dirct   = 1;
        float clip              = 0.0f;

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
        migraphx::shape w_shape{migraphx::shape::float_type,
                                {num_dirct, 4 * hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type,
                                {num_dirct, 4 * hidden_size, hidden_size}};
        migraphx::shape b_shape{migraphx::shape::float_type, {num_dirct, 8 * hidden_size}};
        migraphx::shape ih_shape{migraphx::shape::float_type, {num_dirct, batch_size, hidden_size}};
        migraphx::shape ic_shape{migraphx::shape::float_type, {num_dirct, batch_size, hidden_size}};
        migraphx::shape pph_shape{migraphx::shape::float_type, {num_dirct, 3 * hidden_size}};

        auto seq  = p.add_parameter("seq", in_shape);
        auto w    = p.add_parameter("w", w_shape);
        auto r    = p.add_parameter("r", r_shape);
        auto bias = p.add_parameter("bias", b_shape);
        auto ih   = p.add_parameter("ih", ih_shape);
        auto ic   = p.add_parameter("ic", ic_shape);
        auto pph  = p.add_parameter("pph", pph_shape);
        auto und  = p.add_instruction(migraphx::op::undefined{});

Shucai Xiao's avatar
Shucai Xiao committed
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950
        auto output = p.add_instruction(
            migraphx::op::lstm{
                hidden_size,
                {migraphx::op::sigmoid{}, migraphx::op::tanh{}, migraphx::op::tanh{}},
                migraphx::op::rnn_direction::reverse,
                clip},
            seq,
            w,
            r,
            bias,
            und,
            ih,
            ic,
            pph);
3951
3952
3953
3954
3955
3956
        p.add_instruction(migraphx::op::rnn_last_output{}, output);

        return p;
    }
};

Paul's avatar
Paul committed
3957
struct test_lstm_reverse_3args : verify_program<test_lstm_reverse_3args>
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
        std::size_t seq_len     = 3;
        std::size_t hidden_size = 5;
        std::size_t input_size  = 8;
        std::size_t num_dirct   = 1;
        float clip              = 0.0f;

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
        migraphx::shape w_shape{migraphx::shape::float_type,
                                {num_dirct, 4 * hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type,
                                {num_dirct, 4 * hidden_size, hidden_size}};
        auto seq = p.add_parameter("seq", in_shape);
        auto w   = p.add_parameter("w", w_shape);
        auto r   = p.add_parameter("r", r_shape);
Shucai Xiao's avatar
Shucai Xiao committed
3977
3978
3979
3980
3981
3982
3983
3984
3985
        p.add_instruction(
            migraphx::op::lstm{
                hidden_size,
                {migraphx::op::sigmoid{}, migraphx::op::tanh{}, migraphx::op::tanh{}},
                migraphx::op::rnn_direction::reverse,
                clip},
            seq,
            w,
            r);
3986
3987
3988
3989
3990

        return p;
    }
};

Paul's avatar
Paul committed
3991
struct test_lstm_reverse_3args_cell_output : verify_program<test_lstm_reverse_3args_cell_output>
3992
3993
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
        std::size_t seq_len     = 3;
        std::size_t hidden_size = 5;
        std::size_t input_size  = 8;
        std::size_t num_dirct   = 1;
        float clip              = 0.0f;

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
        migraphx::shape w_shape{migraphx::shape::float_type,
                                {num_dirct, 4 * hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type,
                                {num_dirct, 4 * hidden_size, hidden_size}};
        auto seq = p.add_parameter("seq", in_shape);
        auto w   = p.add_parameter("w", w_shape);
        auto r   = p.add_parameter("r", r_shape);
Shucai Xiao's avatar
Shucai Xiao committed
4011
4012
4013
4014
4015
4016
4017
4018
4019
        auto hs  = p.add_instruction(
            migraphx::op::lstm{
                hidden_size,
                {migraphx::op::sigmoid{}, migraphx::op::tanh{}, migraphx::op::tanh{}},
                migraphx::op::rnn_direction::reverse,
                clip},
            seq,
            w,
            r);
4020
4021
4022
4023
4024
4025
        p.add_instruction(migraphx::op::lstm_last_cell_output{}, hs);

        return p;
    }
};

Paul's avatar
Paul committed
4026
struct test_lstm_bidirct_last : verify_program<test_lstm_bidirct_last>
4027
4028
4029
4030
4031
4032
4033
4034
4035
4036
4037
4038
4039
4040
4041
4042
4043
4044
4045
4046
4047
4048
4049
4050
4051
4052
4053
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
        std::size_t seq_len     = 3;
        std::size_t hidden_size = 5;
        std::size_t input_size  = 8;
        std::size_t num_dirct   = 2;
        float clip              = 0.0f;

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
        migraphx::shape w_shape{migraphx::shape::float_type,
                                {num_dirct, 4 * hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type,
                                {num_dirct, 4 * hidden_size, hidden_size}};
        migraphx::shape b_shape{migraphx::shape::float_type, {num_dirct, 8 * hidden_size}};
        migraphx::shape ih_shape{migraphx::shape::float_type, {num_dirct, batch_size, hidden_size}};
        migraphx::shape ic_shape{migraphx::shape::float_type, {num_dirct, batch_size, hidden_size}};
        migraphx::shape pph_shape{migraphx::shape::float_type, {num_dirct, 3 * hidden_size}};

        auto seq  = p.add_parameter("seq", in_shape);
        auto w    = p.add_parameter("w", w_shape);
        auto r    = p.add_parameter("r", r_shape);
        auto bias = p.add_parameter("bias", b_shape);
        auto ih   = p.add_parameter("ih", ih_shape);
        auto ic   = p.add_parameter("ic", ic_shape);
Shucai Xiao's avatar
Shucai Xiao committed
4054
        auto pph  = p.add_parameter("pph", pph_shape);
4055
4056
        auto und  = p.add_instruction(migraphx::op::undefined{});

Shucai Xiao's avatar
Shucai Xiao committed
4057
4058
4059
4060
4061
4062
4063
4064
4065
4066
4067
4068
4069
4070
        auto output = p.add_instruction(
            migraphx::op::lstm{
                hidden_size,
                {migraphx::op::sigmoid{}, migraphx::op::tanh{}, migraphx::op::tanh{}},
                migraphx::op::rnn_direction::bidirectional,
                clip},
            seq,
            w,
            r,
            bias,
            und,
            ih,
            ic,
            pph);
4071
4072
4073
4074
4075
4076
        p.add_instruction(migraphx::op::rnn_last_output{}, output);

        return p;
    }
};

Paul's avatar
Paul committed
4077
struct test_lstm_bidirct_hs : verify_program<test_lstm_bidirct_hs>
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
4089
4090
4091
4092
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
        std::size_t seq_len     = 3;
        std::size_t hidden_size = 5;
        std::size_t input_size  = 8;
        std::size_t num_dirct   = 2;
        float clip              = 0.0f;

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
        migraphx::shape w_shape{migraphx::shape::float_type,
                                {num_dirct, 4 * hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type,
                                {num_dirct, 4 * hidden_size, hidden_size}};
        migraphx::shape b_shape{migraphx::shape::float_type, {num_dirct, 8 * hidden_size}};
        migraphx::shape ih_shape{migraphx::shape::float_type, {num_dirct, batch_size, hidden_size}};

        auto seq  = p.add_parameter("seq", in_shape);
        auto w    = p.add_parameter("w", w_shape);
        auto r    = p.add_parameter("r", r_shape);
        auto bias = p.add_parameter("bias", b_shape);
        auto ih   = p.add_parameter("ih", ih_shape);
        auto und  = p.add_instruction(migraphx::op::undefined{});

        p.add_instruction(migraphx::op::lstm{hidden_size,
Shucai Xiao's avatar
Shucai Xiao committed
4105
4106
4107
                                             {migraphx::op::sigmoid{}, migraphx::op::tanh{}},
                                             migraphx::op::rnn_direction::bidirectional,
                                             clip},
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118
                          seq,
                          w,
                          r,
                          bias,
                          und,
                          ih);

        return p;
    }
};

Paul's avatar
Paul committed
4119
struct test_lstm_bidirct_3args_und : verify_program<test_lstm_bidirct_3args_und>
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
4136
4137
4138
4139
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
        std::size_t seq_len     = 3;
        std::size_t hidden_size = 5;
        std::size_t input_size  = 8;
        std::size_t num_dirct   = 2;
        float clip              = 0.0f;

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
        migraphx::shape w_shape{migraphx::shape::float_type,
                                {num_dirct, 4 * hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type,
                                {num_dirct, 4 * hidden_size, hidden_size}};
        auto seq = p.add_parameter("seq", in_shape);
        auto w   = p.add_parameter("w", w_shape);
        auto r   = p.add_parameter("r", r_shape);
        auto und = p.add_instruction(migraphx::op::undefined{});
Shucai Xiao's avatar
Shucai Xiao committed
4140
4141
4142
4143
4144
4145
4146
4147
4148
4149
4150
4151
4152
        p.add_instruction(
            migraphx::op::gru{hidden_size,
                              {migraphx::op::sigmoid{}, migraphx::op::tanh{}, migraphx::op::tanh{}},
                              migraphx::op::rnn_direction::bidirectional,
                              clip},
            seq,
            w,
            r,
            und,
            und,
            und,
            und,
            und);
4153
4154
4155
4156
4157

        return p;
    }
};

Paul's avatar
Paul committed
4158
struct test_lstm_bidirct_3args : verify_program<test_lstm_bidirct_3args>
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
        std::size_t seq_len     = 3;
        std::size_t hidden_size = 5;
        std::size_t input_size  = 8;
        std::size_t num_dirct   = 2;
        float clip              = 0.0f;

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
        migraphx::shape w_shape{migraphx::shape::float_type,
                                {num_dirct, 4 * hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type,
                                {num_dirct, 4 * hidden_size, hidden_size}};
        auto seq = p.add_parameter("seq", in_shape);
        auto w   = p.add_parameter("w", w_shape);
        auto r   = p.add_parameter("r", r_shape);
        p.add_instruction(migraphx::op::lstm{hidden_size,
Shucai Xiao's avatar
Shucai Xiao committed
4179
4180
4181
                                             {migraphx::op::sigmoid{}, migraphx::op::tanh{}},
                                             migraphx::op::rnn_direction::bidirectional,
                                             clip},
4182
4183
4184
4185
4186
4187
4188
4189
                          seq,
                          w,
                          r);

        return p;
    }
};

Paul's avatar
Paul committed
4190
struct test_lstm_bidirct_seq1 : verify_program<test_lstm_bidirct_seq1>
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
        std::size_t seq_len     = 1;
        std::size_t hidden_size = 5;
        std::size_t input_size  = 8;
        std::size_t num_dirct   = 2;
        float clip              = 0.0f;

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
        migraphx::shape w_shape{migraphx::shape::float_type,
                                {num_dirct, 4 * hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type,
                                {num_dirct, 4 * hidden_size, hidden_size}};
        auto seq = p.add_parameter("seq", in_shape);
        auto w   = p.add_parameter("w", w_shape);
        auto r   = p.add_parameter("r", r_shape);
        p.add_instruction(migraphx::op::lstm{hidden_size,
Shucai Xiao's avatar
Shucai Xiao committed
4211
4212
4213
                                             {migraphx::op::sigmoid{}, migraphx::op::tanh{}},
                                             migraphx::op::rnn_direction::bidirectional,
                                             clip},
4214
4215
4216
4217
4218
4219
4220
4221
                          seq,
                          w,
                          r);

        return p;
    }
};

Paul's avatar
Paul committed
4222
struct test_lstm_bidirct_default_actv : verify_program<test_lstm_bidirct_default_actv>
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
        std::size_t seq_len     = 1;
        std::size_t hidden_size = 5;
        std::size_t input_size  = 8;
        std::size_t num_dirct   = 2;
        float clip              = 0.0f;

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
        migraphx::shape w_shape{migraphx::shape::float_type,
                                {num_dirct, 4 * hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type,
                                {num_dirct, 4 * hidden_size, hidden_size}};
        auto seq = p.add_parameter("seq", in_shape);
        auto w   = p.add_parameter("w", w_shape);
        auto r   = p.add_parameter("r", r_shape);
        p.add_instruction(
            migraphx::op::lstm{hidden_size, {}, migraphx::op::rnn_direction::bidirectional, clip},
            seq,
            w,
            r);

        return p;
    }
};

Paul's avatar
Paul committed
4252
struct test_lstm_bidirct_default_actv1 : verify_program<test_lstm_bidirct_default_actv1>
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
        std::size_t seq_len     = 3;
        std::size_t hidden_size = 5;
        std::size_t input_size  = 8;
        std::size_t num_dirct   = 2;
        float clip              = 0.0f;

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
        migraphx::shape w_shape{migraphx::shape::float_type,
                                {num_dirct, 4 * hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type,
                                {num_dirct, 4 * hidden_size, hidden_size}};
        migraphx::shape b_shape{migraphx::shape::float_type, {num_dirct, 8 * hidden_size}};
        migraphx::shape ih_shape{migraphx::shape::float_type, {num_dirct, batch_size, hidden_size}};

        auto seq  = p.add_parameter("seq", in_shape);
        auto w    = p.add_parameter("w", w_shape);
        auto r    = p.add_parameter("r", r_shape);
        auto bias = p.add_parameter("bias", b_shape);
        auto ih   = p.add_parameter("ih", ih_shape);
        auto und  = p.add_instruction(migraphx::op::undefined{});

        p.add_instruction(migraphx::op::lstm{hidden_size,
Shucai Xiao's avatar
Shucai Xiao committed
4280
4281
4282
                                             {migraphx::op::sigmoid{}},
                                             migraphx::op::rnn_direction::bidirectional,
                                             clip},
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
                          seq,
                          w,
                          r,
                          bias,
                          und,
                          ih);

        return p;
    }
};

Paul's avatar
Paul committed
4294
struct test_lstm_bidirct_default_actv2 : verify_program<test_lstm_bidirct_default_actv2>
4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
{
    migraphx::program create_program() const
    {
        std::size_t batch_size  = 2;
        std::size_t seq_len     = 3;
        std::size_t hidden_size = 5;
        std::size_t input_size  = 8;
        std::size_t num_dirct   = 2;
        float clip              = 0.0f;

        migraphx::program p;
        migraphx::shape in_shape{migraphx::shape::float_type, {seq_len, batch_size, input_size}};
        migraphx::shape w_shape{migraphx::shape::float_type,
                                {num_dirct, 4 * hidden_size, input_size}};
        migraphx::shape r_shape{migraphx::shape::float_type,
                                {num_dirct, 4 * hidden_size, hidden_size}};
        migraphx::shape b_shape{migraphx::shape::float_type, {num_dirct, 8 * hidden_size}};
        migraphx::shape ih_shape{migraphx::shape::float_type, {num_dirct, batch_size, hidden_size}};

        auto seq  = p.add_parameter("seq", in_shape);
        auto w    = p.add_parameter("w", w_shape);
        auto r    = p.add_parameter("r", r_shape);
        auto bias = p.add_parameter("bias", b_shape);
        auto ih   = p.add_parameter("ih", ih_shape);
        auto und  = p.add_instruction(migraphx::op::undefined{});

        p.add_instruction(migraphx::op::lstm{hidden_size,
Shucai Xiao's avatar
Shucai Xiao committed
4322
4323
4324
                                             {migraphx::op::tanh{}, migraphx::op::sigmoid{}},
                                             migraphx::op::rnn_direction::bidirectional,
                                             clip},
4325
4326
4327
4328
4329
4330
4331
4332
4333
4334
4335
                          seq,
                          w,
                          r,
                          bias,
                          und,
                          ih);

        return p;
    }
};

Shucai Xiao's avatar
Shucai Xiao committed
4336
4337
template <int Axis, migraphx::shape::type_t T>
struct test_logsoftmax : verify_program<test_logsoftmax<Axis, T>>
4338
4339
4340
4341
{
    migraphx::program create_program() const
    {
        migraphx::program p;
Shucai Xiao's avatar
Shucai Xiao committed
4342
        migraphx::shape s{T, {10, 4, 2080, 6}};
4343
        auto param = p.add_parameter("0", s);
Shucai Xiao's avatar
Shucai Xiao committed
4344
        p.add_instruction(migraphx::op::logsoftmax{Axis}, param);
4345
4346
4347
4348
4349

        return p;
    }
};

Shucai Xiao's avatar
Shucai Xiao committed
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
template struct test_logsoftmax<0, migraphx::shape::float_type>;
template struct test_logsoftmax<1, migraphx::shape::float_type>;
template struct test_logsoftmax<2, migraphx::shape::float_type>;
template struct test_logsoftmax<3, migraphx::shape::float_type>;
template struct test_logsoftmax<1, migraphx::shape::double_type>;
template struct test_logsoftmax<3, migraphx::shape::double_type>;
template struct test_logsoftmax<1, migraphx::shape::half_type>;
template struct test_logsoftmax<0, migraphx::shape::half_type>;
template struct test_logsoftmax<2, migraphx::shape::half_type>;
template struct test_logsoftmax<3, migraphx::shape::half_type>;
Paul's avatar
Paul committed
4360

Shucai Xiao's avatar
Shucai Xiao committed
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
struct test_fp32_fp16_lall : verify_program<test_fp32_fp16_lall>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape s{migraphx::shape::float_type, {2, 3}};
        std::vector<float> data(2 * 3);
        std::iota(data.begin(), data.end(), 1.0f);
        auto l1 = p.add_literal(migraphx::literal(s, data));
        auto l2 = p.add_parameter("p2", s);
        p.add_instruction(migraphx::op::add{}, l1, l2);
Shucai Xiao's avatar
Shucai Xiao committed
4372
        migraphx::quantize_fp16(p, {"all"});
Shucai Xiao's avatar
Shucai Xiao committed
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
        return p;
    };
};

struct test_fp32_fp16_ladd : verify_program<test_fp32_fp16_ladd>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape s{migraphx::shape::float_type, {2, 3}};
        std::vector<float> data(2 * 3);
        std::iota(data.begin(), data.end(), 1.0f);
        auto l1 = p.add_literal(migraphx::literal(s, data));
        auto l2 = p.add_parameter("p2", s);
        p.add_instruction(migraphx::op::add{}, l1, l2);
Shucai Xiao's avatar
Shucai Xiao committed
4388
        migraphx::quantize_fp16(p, {"add"});
Shucai Xiao's avatar
Shucai Xiao committed
4389
4390
4391
        return p;
    };
};
4392
4393
4394

struct test_fp32_fp16_add : verify_program<test_fp32_fp16_add>
{
Shucai Xiao's avatar
Shucai Xiao committed
4395
    migraphx::program create_program()
4396
4397
4398
4399
4400
4401
4402
4403
    {
        migraphx::program p;
        migraphx::shape s{migraphx::shape::float_type, {2, 3}};
        auto p1   = p.add_parameter("x", s);
        auto p2   = p.add_parameter("y", s);
        auto sum  = p.add_instruction(migraphx::op::add{}, p1, p2);
        auto diff = p.add_instruction(migraphx::op::sub{}, sum, p2);
        p.add_instruction(migraphx::op::add{}, diff, p1);
Shucai Xiao's avatar
Shucai Xiao committed
4404
        migraphx::quantize_fp16(p, {"add"});
4405
4406
4407
4408
4409
4410
4411

        return p;
    };
};

struct test_fp32_fp16_sub : verify_program<test_fp32_fp16_sub>
{
Shucai Xiao's avatar
Shucai Xiao committed
4412
    migraphx::program create_program()
4413
4414
4415
4416
4417
4418
4419
4420
    {
        migraphx::program p;
        migraphx::shape s{migraphx::shape::float_type, {2, 3}};
        auto p1   = p.add_parameter("x", s);
        auto p2   = p.add_parameter("y", s);
        auto sum  = p.add_instruction(migraphx::op::add{}, p1, p2);
        auto diff = p.add_instruction(migraphx::op::sub{}, sum, p2);
        p.add_instruction(migraphx::op::add{}, diff, p1);
Shucai Xiao's avatar
Shucai Xiao committed
4421
        migraphx::quantize_fp16(p, {"sub"});
4422
4423
4424
4425
4426

        return p;
    };
};

Shucai Xiao's avatar
Shucai Xiao committed
4427
4428
template <class Op, int Axis, migraphx::shape::type_t T>
struct test_reduce_op_large : verify_program<test_reduce_op_large<Op, Axis, T>>
Paul's avatar
Paul committed
4429
4430
4431
4432
{
    migraphx::program create_program() const
    {
        migraphx::program p;
Shucai Xiao's avatar
Shucai Xiao committed
4433
        migraphx::shape s{T, {3, 1026, 4, 3}};
Paul's avatar
Paul committed
4434
        auto x = p.add_parameter("x", s);
Shucai Xiao's avatar
Shucai Xiao committed
4435
        p.add_instruction(Op{{1}}, x);
Paul's avatar
Paul committed
4436
4437
4438
4439
        return p;
    };
};

Shucai Xiao's avatar
Shucai Xiao committed
4440
template struct test_reduce_op_large<migraphx::op::reduce_max, 1, migraphx::shape::float_type>;
Shucai Xiao's avatar
Shucai Xiao committed
4441
template struct test_reduce_op_large<migraphx::op::reduce_mean, 1, migraphx::shape::float_type>;
Shucai Xiao's avatar
Shucai Xiao committed
4442
template struct test_reduce_op_large<migraphx::op::reduce_min, 1, migraphx::shape::float_type>;
Shucai Xiao's avatar
Shucai Xiao committed
4443
4444
template struct test_reduce_op_large<migraphx::op::reduce_prod, 2, migraphx::shape::float_type>;
template struct test_reduce_op_large<migraphx::op::reduce_sum, 1, migraphx::shape::float_type>;
Paul's avatar
Paul committed
4445

Shucai Xiao's avatar
Shucai Xiao committed
4446
4447
template <class Op, int Axis, migraphx::shape::type_t T>
struct test_reduce_op_small : verify_program<test_reduce_op_small<Op, Axis, T>>
Paul's avatar
Paul committed
4448
4449
4450
4451
{
    migraphx::program create_program() const
    {
        migraphx::program p;
Shucai Xiao's avatar
Shucai Xiao committed
4452
        migraphx::shape s{T, {3, 4, 8, 8}};
Paul's avatar
Paul committed
4453
        auto x = p.add_parameter("x", s);
Shucai Xiao's avatar
Shucai Xiao committed
4454
        p.add_instruction(Op{{1}}, x);
Paul's avatar
Paul committed
4455
4456
4457
        return p;
    };
};
Shucai Xiao's avatar
Shucai Xiao committed
4458
4459
4460
4461
4462
4463
4464
4465
4466
template struct test_reduce_op_small<migraphx::op::reduce_sum, 2, migraphx::shape::int32_type>;
template struct test_reduce_op_small<migraphx::op::reduce_mean, 2, migraphx::shape::int32_type>;
template struct test_reduce_op_small<migraphx::op::reduce_max, 2, migraphx::shape::int32_type>;
template struct test_reduce_op_small<migraphx::op::reduce_min, 2, migraphx::shape::int32_type>;

template struct test_reduce_op_small<migraphx::op::reduce_sum, 2, migraphx::shape::half_type>;
template struct test_reduce_op_small<migraphx::op::reduce_mean, 2, migraphx::shape::half_type>;
template struct test_reduce_op_small<migraphx::op::reduce_max, 2, migraphx::shape::half_type>;
template struct test_reduce_op_small<migraphx::op::reduce_min, 2, migraphx::shape::half_type>;
Shucai Xiao's avatar
Shucai Xiao committed
4467
template struct test_reduce_op_small<migraphx::op::reduce_prod, -2, migraphx::shape::half_type>;
Paul's avatar
Paul committed
4468

Khalique's avatar
Khalique committed
4469
4470
4471
4472
4473
struct test_rsqrt : verify_program<test_rsqrt>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
kahmed10's avatar
kahmed10 committed
4474
4475
4476
4477
4478
4479
4480
4481
        std::vector<size_t> input_lens{1, 3, 16, 16};
        migraphx::shape s{migraphx::shape::float_type, input_lens};
        auto x       = p.add_parameter("x", s);
        auto min_val = p.add_literal(1.0f);
        auto max_val = p.add_literal(std::numeric_limits<float>::max());
        min_val      = p.add_instruction(migraphx::op::multibroadcast{input_lens}, min_val);
        max_val      = p.add_instruction(migraphx::op::multibroadcast{input_lens}, max_val);
        auto l0      = p.add_instruction(migraphx::op::clip{}, x, min_val, max_val);
Khalique's avatar
Khalique committed
4482
4483
4484
4485
4486
        p.add_instruction(migraphx::op::rsqrt{}, l0);
        return p;
    };
};

4487
struct test_round : verify_program<test_round>
4488
4489
4490
4491
4492
{
    migraphx::program create_program() const
    {
        migraphx::program p;

4493
4494
4495
        migraphx::shape s{migraphx::shape::float_type, {2, 3, 4, 6}};
        auto param = p.add_parameter("x", s);
        p.add_instruction(migraphx::op::round{}, param);
4496
4497
4498
4499
        return p;
    };
};

Shucai Xiao's avatar
Shucai Xiao committed
4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
struct test_ceil : verify_program<test_ceil>
{
    migraphx::program create_program() const
    {
        migraphx::program p;

        migraphx::shape s{migraphx::shape::double_type, {2, 3, 4, 6}};
        auto param = p.add_parameter("x", s);
        p.add_instruction(migraphx::op::ceil{}, param);
        return p;
    };
};

struct test_floor : verify_program<test_floor>
{
    migraphx::program create_program() const
    {
        migraphx::program p;

        migraphx::shape s{migraphx::shape::float_type, {2, 3, 4, 6}};
        auto param = p.add_parameter("x", s);
        p.add_instruction(migraphx::op::floor{}, param);
        return p;
    };
};

4526
struct test_convert : verify_program<test_convert>
4527
4528
4529
4530
{
    migraphx::program create_program() const
    {
        migraphx::program p;
4531
4532
4533
4534
4535
4536
4537
        migraphx::shape sa{migraphx::shape::float_type, {8, 24}};
        migraphx::shape sb{migraphx::shape::float_type, {24, 6}};
        auto pa = p.add_parameter("a", sa);
        auto pb = p.add_parameter("b", sb);
        auto ia = p.add_instruction(migraphx::op::convert{migraphx::shape::int8_type}, pa);
        auto ib = p.add_instruction(migraphx::op::convert{migraphx::shape::int8_type}, pb);
        p.add_instruction(migraphx::op::quant_dot{}, ia, ib);
4538

4539
        return p;
4540
    };
4541
4542
};

kahmed10's avatar
kahmed10 committed
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
struct test_recip : verify_program<test_recip>
{
    migraphx::program create_program() const
    {
        migraphx::program p;
        migraphx::shape s{migraphx::shape::double_type, {3}};
        auto x = p.add_parameter("x", s);
        p.add_instruction(migraphx::op::recip{}, x);
        return p;
    }
};

Paul's avatar
Paul committed
4555
int main(int argc, const char* argv[]) { test::run(argc, argv); }