rewrite_pooling_test.cpp 7.99 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2015-2022 Advanced Micro Devices, Inc. All rights reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */
Shucai Xiao's avatar
Shucai Xiao committed
24
#include <migraphx/rewrite_pooling.hpp>
25
#include <migraphx/op/pooling.hpp>
Shucai Xiao's avatar
Shucai Xiao committed
26
27
#include <migraphx/dead_code_elimination.hpp>
#include <migraphx/program.hpp>
28
#include <migraphx/register_target.hpp>
Shucai Xiao's avatar
Shucai Xiao committed
29
30
31
32
#include <migraphx/instruction.hpp>
#include <migraphx/generate.hpp>
#include <migraphx/ranges.hpp>
#include <test.hpp>
33
34
#include <migraphx/make_op.hpp>

Shucai Xiao's avatar
Shucai Xiao committed
35
36
37
#include <migraphx/verify.hpp>

bool is_pooling(migraphx::instruction& ins) { return ins.name() == "pooling"; }
Paul Fultz II's avatar
Paul Fultz II committed
38
static void opt_pooling(migraphx::module& m)
Shucai Xiao's avatar
Shucai Xiao committed
39
40
41
{
    migraphx::rewrite_pooling rp;
    migraphx::dead_code_elimination dce;
Paul Fultz II's avatar
Paul Fultz II committed
42
43
    rp.apply(m);
    dce.apply(m);
Shucai Xiao's avatar
Shucai Xiao committed
44
45
46
47
48
}

TEST_CASE(rewrite_pooling_test)
{
    migraphx::shape s{migraphx::shape::float_type, {2, 2, 3, 4, 5}};
49
    auto pooling_program = [&](const migraphx::op::pooling_mode mode) {
Paul Fultz II's avatar
Paul Fultz II committed
50
51
52
        migraphx::module m;
        auto input = m.add_parameter("x", s);
        auto ret   = m.add_instruction(migraphx::make_op("pooling",
53
54
55
56
                                                         {{"mode", mode},
                                                          {"padding", {0, 0, 0}},
                                                          {"stride", {1, 1, 1}},
                                                          {"lengths", {3, 4, 5}}}),
Paul Fultz II's avatar
Paul Fultz II committed
57
58
59
                                     input);
        m.add_return({ret});
        return m;
Shucai Xiao's avatar
Shucai Xiao committed
60
61
62
    };

    auto opt_program = [&](const migraphx::operation& reduce_op) {
Paul Fultz II's avatar
Paul Fultz II committed
63
64
        migraphx::module m;
        auto input = m.add_parameter("x", s);
65
66
        auto rdm   = m.add_instruction(reduce_op, input);
        m.add_return({rdm});
Paul Fultz II's avatar
Paul Fultz II committed
67
        return m;
Shucai Xiao's avatar
Shucai Xiao committed
68
69
    };

70
    auto test_rewrite = [&](const migraphx::op::pooling_mode mode, const migraphx::operation& op) {
Paul Fultz II's avatar
Paul Fultz II committed
71
72
73
74
        migraphx::module m1 = pooling_program(mode);
        migraphx::module m2 = opt_program(op);
        opt_pooling(m1);
        EXPECT(m1 == m2);
Shucai Xiao's avatar
Shucai Xiao committed
75
76
    };

77
    test_rewrite(migraphx::op::pooling_mode::average,
78
79
80
                 migraphx::make_op("reduce_mean", {{"axes", {2, 3, 4}}}));
    test_rewrite(migraphx::op::pooling_mode::max,
                 migraphx::make_op("reduce_max", {{"axes", {2, 3, 4}}}));
Shucai Xiao's avatar
Shucai Xiao committed
81
82
83
84
85
86
}

TEST_CASE(rewrite_avepooling_na1_test)
{
    migraphx::shape s{migraphx::shape::float_type, {2, 2, 3, 4, 5}};
    auto pooling_program = [&]() {
Paul Fultz II's avatar
Paul Fultz II committed
87
88
89
        migraphx::module m;

        auto input = m.add_parameter("x", s);
90
91
92
93
94
95
96
        auto ret =
            m.add_instruction(migraphx::make_op("pooling",
                                                {{"mode", migraphx::op::pooling_mode::average},
                                                 {"padding", {0, 1, 0}},
                                                 {"stride", {1, 1, 1}},
                                                 {"lengths", {3, 4, 5}}}),
                              input);
Paul Fultz II's avatar
Paul Fultz II committed
97
98
        m.add_return({ret});
        return m;
Shucai Xiao's avatar
Shucai Xiao committed
99
100
    };

Paul Fultz II's avatar
Paul Fultz II committed
101
102
    migraphx::module m1 = pooling_program();
    migraphx::module m2 = m1;
103

Paul Fultz II's avatar
Paul Fultz II committed
104
105
    opt_pooling(m1);
    EXPECT(m1 == m2);
Shucai Xiao's avatar
Shucai Xiao committed
106
107
108
109
110
111
}

TEST_CASE(rewrite_avepooling_na2_test)
{
    migraphx::shape s{migraphx::shape::float_type, {2, 2, 3, 4, 5}};
    auto pooling_program = [&]() {
Paul Fultz II's avatar
Paul Fultz II committed
112
113
114
        migraphx::module m;

        auto input = m.add_parameter("x", s);
115
116
117
118
119
120
121
        auto ret =
            m.add_instruction(migraphx::make_op("pooling",
                                                {{"mode", migraphx::op::pooling_mode::average},
                                                 {"padding", {0, 0, 0}},
                                                 {"stride", {1, 2, 1}},
                                                 {"lengths", {3, 4, 5}}}),
                              input);
Paul Fultz II's avatar
Paul Fultz II committed
122
123
        m.add_return({ret});
        return m;
Shucai Xiao's avatar
Shucai Xiao committed
124
125
    };

Paul Fultz II's avatar
Paul Fultz II committed
126
127
    migraphx::module m1 = pooling_program();
    migraphx::module m2 = m1;
128

Paul Fultz II's avatar
Paul Fultz II committed
129
130
    opt_pooling(m1);
    EXPECT(m1 == m2);
Shucai Xiao's avatar
Shucai Xiao committed
131
132
133
134
135
136
}

TEST_CASE(rewrite_avepooling_na3_test)
{
    migraphx::shape s{migraphx::shape::float_type, {2, 2, 3, 4, 5}};
    auto pooling_program = [&]() {
Paul Fultz II's avatar
Paul Fultz II committed
137
138
139
140
        migraphx::module m;

        auto input = m.add_parameter("x", s);
        auto ret   = m.add_instruction(migraphx::make_op("pooling",
141
142
143
144
                                                         {{"mode", migraphx::op::pooling_mode::max},
                                                          {"padding", {0, 0, 0}},
                                                          {"stride", {1, 1, 1}},
                                                          {"lengths", {3, 3, 5}}}),
Paul Fultz II's avatar
Paul Fultz II committed
145
146
147
                                     input);
        m.add_return({ret});
        return m;
Shucai Xiao's avatar
Shucai Xiao committed
148
149
    };

Paul Fultz II's avatar
Paul Fultz II committed
150
151
    migraphx::module m1 = pooling_program();
    migraphx::module m2 = m1;
152

Paul Fultz II's avatar
Paul Fultz II committed
153
154
    opt_pooling(m1);
    EXPECT(m1 == m2);
Shucai Xiao's avatar
Shucai Xiao committed
155
156
157
158
159
160
161
162
}

TEST_CASE(literal_rewrite_pooling_test)
{
    migraphx::shape s{migraphx::shape::float_type, {2, 2, 3, 4, 5}};
    std::vector<float> data(s.elements());
    std::iota(data.begin(), data.end(), 1.0f);

163
    auto pooling_program = [&](const migraphx::op::pooling_mode mode) {
Shucai Xiao's avatar
Shucai Xiao committed
164
        migraphx::program p;
165
166
167

        auto* mm   = p.get_main_module();
        auto input = mm->add_literal(migraphx::literal(s, data));
168
        auto ret   = mm->add_instruction(migraphx::make_op("pooling",
169
170
171
172
                                                           {{"mode", mode},
                                                            {"padding", {0, 0, 0}},
                                                            {"stride", {1, 1, 1}},
                                                            {"lengths", {3, 4, 5}}}),
173
174
                                       input);
        mm->add_return({ret});
Shucai Xiao's avatar
Shucai Xiao committed
175
176
177
178
179
        return p;
    };

    auto opt_program = [&](const migraphx::operation& op) {
        migraphx::program p;
180
181
        auto* mm   = p.get_main_module();
        auto input = mm->add_literal(migraphx::literal(s, data));
182
        auto rsp   = mm->add_instruction(migraphx::make_op("reshape", {{"dims", {4, -1}}}), input);
183
        auto rdm   = mm->add_instruction(op, rsp);
184
185
        auto ret =
            mm->add_instruction(migraphx::make_op("reshape", {{"dims", {2, 2, 1, 1, 1}}}), rdm);
186
        mm->add_return({ret});
Shucai Xiao's avatar
Shucai Xiao committed
187
188
189
190

        return p;
    };

191
192
    auto test_rewrite_pooling = [&](const migraphx::op::pooling_mode mode,
                                    const migraphx::operation& op) {
Shucai Xiao's avatar
Shucai Xiao committed
193
194
        migraphx::program p1 = pooling_program(mode);
        migraphx::program p2 = opt_program(op);
195
196
        p1.compile(migraphx::make_target("ref"));
        p2.compile(migraphx::make_target("ref"));
Shucai Xiao's avatar
Shucai Xiao committed
197
198
        auto result1 = p1.eval({}).back();
        auto result2 = p2.eval({}).back();
Umang Yadav's avatar
Umang Yadav committed
199
        visit_all(result1, result2)(
200
            [&](auto r1, auto r2) { EXPECT(migraphx::verify::verify_rms_range(r1, r2)); });
Shucai Xiao's avatar
Shucai Xiao committed
201
202
    };

203
204
205
206
    test_rewrite_pooling(migraphx::op::pooling_mode::max,
                         migraphx::make_op("reduce_max", {{"axes", {1}}}));
    test_rewrite_pooling(migraphx::op::pooling_mode::average,
                         migraphx::make_op("reduce_mean", {{"axes", {1}}}));
Shucai Xiao's avatar
Shucai Xiao committed
207
208
209
}

int main(int argc, const char* argv[]) { test::run(argc, argv); }