miopen.cpp 7.6 KB
Newer Older
Paul's avatar
Paul committed
1

Paul's avatar
Paul committed
2
3
4
5
#include <migraph/program.hpp>
#include <migraph/operators.hpp>
#include <migraph/generate.hpp>
#include <migraph/cpu/cpu_target.hpp>
Paul's avatar
Paul committed
6
7
8
#include <migraph/gpu/target.hpp>
#include <migraph/gpu/miopen.hpp>
#include <migraph/gpu/hip.hpp>
Paul's avatar
Paul committed
9
#include <migraph/manage_ptr.hpp>
Paul's avatar
Paul committed
10
#include <migraph/type_name.hpp>
Paul's avatar
Paul committed
11
12
13
14

#include <miopen/miopen.h>

#include "test.hpp"
Paul's avatar
Paul committed
15
#include "verify.hpp"
Paul's avatar
Paul committed
16

Paul's avatar
Paul committed
17
auto& handlers()
Paul's avatar
Paul committed
18
{
Paul's avatar
Paul committed
19
20
21
    static std::array<std::function<void()>, 2> x = {};
    return x;
}
Paul's avatar
Paul committed
22

Paul's avatar
Paul committed
23
24
25
26
27
28
29
30
struct auto_print
{
    migraph::program& p;
    int index;
    auto_print(migraph::program& pp, int i) : p(pp), index(i)
    {
        handlers()[index] = [this]{ std::cout << p << std::endl; };
    }
Paul's avatar
Paul committed
31

Paul's avatar
Paul committed
32
    ~auto_print()
Paul's avatar
Paul committed
33
    {
Paul's avatar
Paul committed
34
        handlers()[index] = []{};
Paul's avatar
Paul committed
35
36
37
    }
};

Paul's avatar
Paul committed
38

Paul's avatar
Paul committed
39
template <class V>
Paul's avatar
Paul committed
40
migraph::argument run_cpu()
Paul's avatar
Paul committed
41
{
Paul's avatar
Paul committed
42
43
    V v;
    auto p = v.create_program();
Paul's avatar
Paul committed
44
    auto_print pp{p, 0};
Paul's avatar
Paul committed
45
    p.compile(migraph::cpu::cpu_target{});
Paul's avatar
Paul committed
46
    migraph::program::parameter_map m;
Paul's avatar
Paul committed
47
    for(auto&& x : p.get_parameter_shapes())
Paul's avatar
Paul committed
48
49
50
    {
        m[x.first] = migraph::generate_argument(x.second);
    }
Paul's avatar
Paul committed
51
    return p.eval(m);
Paul's avatar
Paul committed
52
53
}

Paul's avatar
Paul committed
54
template <class V>
Paul's avatar
Paul committed
55
migraph::argument run_gpu()
Paul's avatar
Paul committed
56
{
Paul's avatar
Paul committed
57
58
    V v;
    auto p = v.create_program();
Paul's avatar
Paul committed
59
    auto_print pp{p, 1};
Paul's avatar
Paul committed
60
    p.compile(migraph::gpu::target{});
Paul's avatar
Paul committed
61

Paul's avatar
Paul committed
62
    migraph::program::parameter_map m;
Paul's avatar
Paul committed
63
    for(auto&& x : p.get_parameter_shapes())
Paul's avatar
Paul committed
64
    {
Paul's avatar
Paul committed
65
        m[x.first] = migraph::gpu::to_gpu(migraph::generate_argument(x.second));
Paul's avatar
Paul committed
66
67
    }

Paul's avatar
Paul committed
68
    return migraph::gpu::from_gpu(p.eval(m));
Paul's avatar
Paul committed
69
70
}

Paul's avatar
Paul committed
71
template <class V>
Paul's avatar
Paul committed
72
void verify_program()
Paul's avatar
Paul committed
73
{
Paul's avatar
Paul committed
74
75
76
77
78
79
80
81
82
83
84
    std::set_terminate(+[] {
        try
        {
            std::rethrow_exception(std::current_exception());
        }
        catch(const std::exception& e)
        {
            std::cout << "what(): " << e.what() << std::endl;
        }
        for(auto&& handle:handlers()) handle();
    });
Paul's avatar
Paul committed
85
86
    auto cpu_arg = run_cpu<V>();
    auto gpu_arg = run_gpu<V>();
Paul's avatar
Paul committed
87
88
89
    visit_all(cpu_arg, gpu_arg)([](auto cpu, auto gpu) {
        if(not test::verify_range(cpu, gpu))
        {
Paul's avatar
Paul committed
90
91
92
            std::cout << "FAILED: " << migraph::get_type_name<V>() << std::endl;
        }
    });
Paul's avatar
Paul committed
93
94
}

Paul's avatar
Paul committed
95
96
97
98
99
struct test_literals
{
    migraph::program create_program() const
    {
        migraph::program p;
Paul's avatar
Paul committed
100
101
102
103
        auto input = p.add_literal(
            generate_literal(migraph::shape{migraph::shape::float_type, {4, 3, 3, 3}}));
        auto weights = p.add_literal(
            generate_literal(migraph::shape{migraph::shape::float_type, {4, 3, 3, 3}}));
Paul's avatar
Paul committed
104
105
106
107
108
109
        auto conv = p.add_instruction(migraph::convolution{}, input, weights);
        p.add_instruction(migraph::activation{"relu"}, conv);
        return p;
    }
};

Paul's avatar
Paul committed
110
111
struct test_add
{
Paul's avatar
Paul committed
112
    migraph::program create_program() const
Paul's avatar
Paul committed
113
    {
Paul's avatar
Paul committed
114
115
        migraph::program p;
        migraph::shape s{migraph::shape::float_type, {3}};
Paul's avatar
Paul committed
116
117
        auto x = p.add_parameter("x", s);
        auto y = p.add_parameter("y", s);
Paul's avatar
Paul committed
118
        p.add_instruction(migraph::add{}, x, y);
Paul's avatar
Paul committed
119
120
121
122
123
124
        return p;
    }
};

struct test_add_broadcast
{
Paul's avatar
Paul committed
125
    migraph::program create_program() const
Paul's avatar
Paul committed
126
    {
Paul's avatar
Paul committed
127
128
129
130
131
132
        migraph::program p;
        migraph::shape s{migraph::shape::float_type, {3}};
        auto x  = p.add_parameter("x", {migraph::shape::float_type, {2, 2, 3}});
        auto y  = p.add_parameter("y", {migraph::shape::float_type, {2, 2}});
        auto by = p.add_instruction(migraph::broadcast{0}, x, y);
        p.add_instruction(migraph::add{}, x, by);
Paul's avatar
Paul committed
133
134
135
136
        return p;
    }
};

Paul's avatar
Paul committed
137
struct test_conv_relu
Paul's avatar
Paul committed
138
{
Paul's avatar
Paul committed
139
    migraph::program create_program() const
Paul's avatar
Paul committed
140
    {
Paul's avatar
Paul committed
141
        migraph::program p;
Paul's avatar
Paul committed
142
143
144
145
        auto input = p.add_parameter("x", migraph::shape{migraph::shape::float_type, {4, 3, 3, 3}});
        auto weights =
            p.add_parameter("w", migraph::shape{migraph::shape::float_type, {4, 3, 3, 3}});
        auto conv = p.add_instruction(migraph::convolution{}, input, weights);
Paul's avatar
Paul committed
146
        p.add_instruction(migraph::activation{"relu"}, conv);
Paul's avatar
Paul committed
147
148
149
150
        return p;
    }
};

Paul's avatar
Paul committed
151
152
struct test_conv_pooling
{
Paul's avatar
Paul committed
153
    migraph::program create_program() const
Paul's avatar
Paul committed
154
    {
Paul's avatar
Paul committed
155
        migraph::program p;
Paul's avatar
Paul committed
156
157
158
159
        auto input =
            p.add_parameter("x", migraph::shape{migraph::shape::float_type, {4, 3, 32, 32}});
        auto weights =
            p.add_parameter("w", migraph::shape{migraph::shape::float_type, {4, 3, 3, 3}});
Paul's avatar
Paul committed
160
161
162
        auto conv    = p.add_instruction(migraph::convolution{}, input, weights);
        auto pooling = p.add_instruction(migraph::pooling{"max"}, conv);
        p.add_instruction(migraph::activation{"relu"}, pooling);
Paul's avatar
Paul committed
163
164
165
166
        return p;
    }
};

Paul's avatar
Paul committed
167
168
struct test_gemm
{
Paul's avatar
Paul committed
169
    migraph::program create_program() const
Paul's avatar
Paul committed
170
    {
Paul's avatar
Paul committed
171
172
173
174
        migraph::program p;
        auto a = p.add_parameter("a", migraph::shape{migraph::shape::float_type, {4, 5}});
        auto b = p.add_parameter("b", migraph::shape{migraph::shape::float_type, {5, 3}});
        p.add_instruction(migraph::gemm{}, a, b);
Paul's avatar
Paul committed
175
176
177
178
        return p;
    }
};

Paul's avatar
Paul committed
179
180
181
182
183
184
185
186
187
188
189
190
struct test_gemm_ld
{
    migraph::program create_program() const
    {
        migraph::program p;
        auto a = p.add_parameter("a", migraph::shape{migraph::shape::float_type, {4, 5}, {10, 1}});
        auto b = p.add_parameter("b", migraph::shape{migraph::shape::float_type, {5, 3}, {20, 1}});
        p.add_instruction(migraph::gemm{}, a, b);
        return p;
    }
};

191
192
193
194
195
struct test_gemm_transposeb
{
    migraph::program create_program() const
    {
        migraph::program p;
Paul's avatar
Paul committed
196
197
        auto a  = p.add_parameter("a", migraph::shape{migraph::shape::float_type, {4, 5}});
        auto b  = p.add_parameter("b", migraph::shape{migraph::shape::float_type, {3, 5}});
198
199
200
201
202
203
204
205
206
207
208
        auto bt = p.add_instruction(migraph::transpose{{1, 0}}, b);
        p.add_instruction(migraph::gemm{}, a, bt);
        return p;
    }
};

struct test_gemm_transposea
{
    migraph::program create_program() const
    {
        migraph::program p;
Paul's avatar
Paul committed
209
210
        auto a  = p.add_parameter("a", migraph::shape{migraph::shape::float_type, {5, 4}});
        auto b  = p.add_parameter("b", migraph::shape{migraph::shape::float_type, {5, 3}});
211
212
213
214
215
216
217
218
219
220
221
        auto at = p.add_instruction(migraph::transpose{{1, 0}}, a);
        p.add_instruction(migraph::gemm{}, at, b);
        return p;
    }
};

struct test_gemm_transposeab
{
    migraph::program create_program() const
    {
        migraph::program p;
Paul's avatar
Paul committed
222
223
        auto a  = p.add_parameter("a", migraph::shape{migraph::shape::float_type, {5, 4}});
        auto b  = p.add_parameter("b", migraph::shape{migraph::shape::float_type, {3, 5}});
224
225
226
227
228
229
230
        auto at = p.add_instruction(migraph::transpose{{1, 0}}, a);
        auto bt = p.add_instruction(migraph::transpose{{1, 0}}, b);
        p.add_instruction(migraph::gemm{}, at, bt);
        return p;
    }
};

231
232
233
234
235
struct test_contiguous
{
    migraph::program create_program() const
    {
        migraph::program p;
236
        migraph::shape s{migraph::shape::float_type, {4, 4, 4, 3}, {48, 4, 1, 16}};
237
238
239
240
241
242
        auto x = p.add_parameter("x", s);
        p.add_instruction(migraph::contiguous{}, x);
        return p;
    }
};

243
struct test_transpose
244
{
245
246
247
248
249
250
251
252
253
254
255
    migraph::program create_program() const
    {
        migraph::program p;
        migraph::shape s{migraph::shape::float_type, {4, 3, 4, 4}};
        auto x                    = p.add_parameter("x", s);
        std::vector<int64_t> perm = {0, 2, 3, 1};
        auto l                    = p.add_instruction(migraph::transpose{perm}, x);
        p.add_instruction(migraph::contiguous{}, l);
        return p;
    }
};
256

Paul's avatar
Paul committed
257
258
int main()
{
Paul's avatar
Paul committed
259
    verify_program<test_add>();
Paul's avatar
Paul committed
260
    verify_program<test_add_broadcast>();
Paul's avatar
Paul committed
261
262
263
    verify_program<test_conv_relu>();
    verify_program<test_conv_pooling>();
    verify_program<test_gemm>();
Paul's avatar
Paul committed
264
    // verify_program<test_gemm_ld>();
265
266
267
    verify_program<test_gemm_transposeb>();
    verify_program<test_gemm_transposea>();
    verify_program<test_gemm_transposeab>();
268
269
    verify_program<test_contiguous>();
    verify_program<test_transpose>();
Paul's avatar
Paul committed
270
}