program_test.cpp 4.19 KB
Newer Older
Paul's avatar
Paul committed
1

Paul's avatar
Paul committed
2
3
4
#include <migraphx/program.hpp>
#include <migraphx/iterator_for.hpp>
#include <migraphx/instruction.hpp>
5
#include <migraphx/ref/target.hpp>
Paul's avatar
Paul committed
6
#include <sstream>
7
#include <migraphx/common.hpp>
Paul's avatar
Paul committed
8
#include "test.hpp"
9
10
#include <migraphx/make_op.hpp>

Paul's avatar
Paul committed
11
12
#include <basic_ops.hpp>

Paul's avatar
Paul committed
13
migraphx::program create_program()
Paul's avatar
Paul committed
14
{
Paul's avatar
Paul committed
15
    migraphx::program p;
16
    auto* mm = p.get_main_module();
Paul's avatar
Paul committed
17

18
19
    auto x = mm->add_parameter("x", {migraphx::shape::int64_type});
    auto y = mm->add_parameter("y", {migraphx::shape::int64_type});
Paul's avatar
Paul committed
20

21
22
23
    auto sum = mm->add_instruction(sum_op{}, x, y);
    auto one = mm->add_literal(1);
    mm->add_instruction(sum_op{}, sum, one);
Paul's avatar
Paul committed
24
25
26
27

    return p;
}

Paul's avatar
Paul committed
28
TEST_CASE(program_equality)
Paul's avatar
Paul committed
29
{
Paul's avatar
Paul committed
30
31
    migraphx::program x = create_program();
    migraphx::program y = create_program();
Shucai Xiao's avatar
Shucai Xiao committed
32
33

    EXPECT(x.size() == 1);
Paul's avatar
Paul committed
34
35
36
    EXPECT(x == y);
}

Paul's avatar
Paul committed
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
TEST_CASE(program_not_equality1)
{
    migraphx::program x;
    migraphx::program y = create_program();
    EXPECT(x != y);
    x = y;
    EXPECT(x == y);
}

TEST_CASE(program_not_equality2)
{
    migraphx::program x;
    migraphx::program y = create_program();
    EXPECT(x != y);
    y = x;
    EXPECT(x == y);
}

TEST_CASE(program_default_copy_construct)
{
    migraphx::program x;
    migraphx::program y;
    EXPECT(x == y);
}

Shucai Xiao's avatar
Shucai Xiao committed
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
TEST_CASE(program_print)
{
    migraphx::program p = create_program();
    auto* mm            = p.get_main_module();
    auto in1            = mm->end();

    // print end instruction
    p.debug_print(in1);

    // print instruction not in the program
    auto p2   = p;
    auto* mm2 = p2.get_main_module();
    auto in2  = mm2->begin();
    p.debug_print(in2);

    // print last instruction
    auto in3 = std::prev(in1);
    p.debug_print(in3);
}

TEST_CASE(program_annotate)
{
    migraphx::program p1 = create_program();
    migraphx::program p2 = create_program();

    std::stringstream ss1;
    p1.annotate(ss1, [](auto ins) { std::cout << ins->name() << "_1" << std::endl; });

    std::stringstream ss2;
    p2.annotate(ss2, [](auto ins) { std::cout << ins->name() << "_1" << std::endl; });

    EXPECT(ss1.str() == ss2.str());
}

96
97
98
99
TEST_CASE(program_copy)
{
    auto create_program_1 = [] {
        migraphx::program p;
100
101
        auto* mm = p.get_main_module();

102
103
104
        migraphx::shape s{migraphx::shape::float_type, {3, 4, 5}};
        std::vector<float> data(3 * 4 * 5);
        std::iota(data.begin(), data.end(), 1.0f);
105
106
107
        auto l2  = mm->add_literal(migraphx::literal(s, data));
        auto p1  = mm->add_parameter("x", s);
        auto po  = mm->add_outline(s);
108
109
        auto sum = mm->add_instruction(migraphx::make_op("add"), l2, po);
        mm->add_instruction(migraphx::make_op("mul"), sum, p1);
110
111
112
113
114
115

        return p;
    };

    {
        auto p1 = create_program_1();
Shucai Xiao's avatar
Shucai Xiao committed
116
117
118
        migraphx::program p2{};
        p2 = p1;

119
        p2.compile(migraphx::ref::target{});
Shucai Xiao's avatar
Shucai Xiao committed
120
121
        EXPECT(p1 != p2);

122
        p1.compile(migraphx::ref::target{});
123
        EXPECT(p1 == p2);
124
125

        EXPECT(p1.get_parameter_names() == p2.get_parameter_names());
126
127
128
129
130
    }

    {
        auto p1 = create_program_1();
        auto p2(p1);
Shucai Xiao's avatar
Shucai Xiao committed
131
132
        EXPECT(p1 == p2);

133
        p1.compile(migraphx::ref::target{});
Shucai Xiao's avatar
Shucai Xiao committed
134
135
136
        EXPECT(p1 != p2);

        p2 = p1;
137
138
139
140
141
142
        EXPECT(p1 == p2);
    }

    {
        auto p1 = create_program_1();
        auto p2 = create_program();
Shucai Xiao's avatar
Shucai Xiao committed
143
        EXPECT(p1 != p2);
144

Shucai Xiao's avatar
Shucai Xiao committed
145
        p2 = p1;
Shucai Xiao's avatar
Shucai Xiao committed
146
147
        EXPECT(p1 == p2);

148
149
        p1.compile(migraphx::ref::target{});
        p2.compile(migraphx::ref::target{});
Shucai Xiao's avatar
Shucai Xiao committed
150

151
152
        EXPECT(p1 == p2);
    }
Shucai Xiao's avatar
Shucai Xiao committed
153
154
155

    {
        migraphx::program p1;
156
157
        auto* mm1 = p1.get_main_module();

Shucai Xiao's avatar
Shucai Xiao committed
158
159
160
        migraphx::shape s1{migraphx::shape::float_type, {2, 3}};
        migraphx::shape s2{migraphx::shape::float_type, {3, 6}};
        migraphx::shape s3{migraphx::shape::float_type, {2, 6}};
161
162
163
        auto para1 = mm1->add_parameter("m1", s1);
        auto para2 = mm1->add_parameter("m2", s2);
        auto para3 = mm1->add_parameter("m3", s3);
164
        migraphx::add_dot_apply_alpha_beta(*mm1, {para1, para2, para3}, 0.31f, 0.28f);
Shucai Xiao's avatar
Shucai Xiao committed
165
166
167
168
        migraphx::program p2{};
        p2 = p1;
        EXPECT(p2 == p1);

169
170
        p1.compile(migraphx::ref::target{});
        p2.compile(migraphx::ref::target{});
Shucai Xiao's avatar
Shucai Xiao committed
171
172
        EXPECT(p2 == p1);
    }
173
174
}

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