program_test.cpp 4.2 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
7
#include <sstream>
#include "test.hpp"
8
9
#include <migraphx/make_op.hpp>

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

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

17
18
    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
19

20
21
22
    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
23
24
25
26

    return p;
}

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

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

Paul's avatar
Paul committed
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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
61
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
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());
}

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

101
102
103
        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);
104
105
106
        auto l2  = mm->add_literal(migraphx::literal(s, data));
        auto p1  = mm->add_parameter("x", s);
        auto po  = mm->add_outline(s);
107
108
        auto sum = mm->add_instruction(migraphx::make_op("add"), l2, po);
        mm->add_instruction(migraphx::make_op("mul"), sum, p1);
109
110
111
112
113
114

        return p;
    };

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

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

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

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

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

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

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

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

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

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

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

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

Shucai Xiao's avatar
Shucai Xiao committed
157
158
159
        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}};
160
161
162
        auto para1 = mm1->add_parameter("m1", s1);
        auto para2 = mm1->add_parameter("m2", s2);
        auto para3 = mm1->add_parameter("m3", s3);
163
164
        mm1->add_instruction(
            migraphx::make_op("dot", {{"alpha", 0.31f}, {"beta", 0.28f}}), para1, para2, para3);
Shucai Xiao's avatar
Shucai Xiao committed
165
166
167
168
169

        migraphx::program p2{};
        p2 = p1;
        EXPECT(p2 == p1);

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

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