miopen.cpp 7.33 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
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
struct auto_eval
{
    migraph::program* p;
    migraph::program::parameter_map * m;
    migraph::argument result;

    auto_eval(migraph::program& pp, migraph::program::parameter_map& pm)
    : p(&pp), m(&pm)
    {}

    migraph::argument operator()() const
    {
        return p->eval(*m);
    }

    ~auto_eval()
    {
        if(std::uncaught_exception())
            std::cout << *p << std::endl;
    }
};

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
    p.compile(migraph::cpu::cpu_target{});
Paul's avatar
Paul committed
45
    migraph::program::parameter_map m;
Paul's avatar
Paul committed
46
    for(auto&& x : p.get_parameter_shapes())
Paul's avatar
Paul committed
47
48
49
    {
        m[x.first] = migraph::generate_argument(x.second);
    }
Paul's avatar
Paul committed
50
    return auto_eval(p, m)();
Paul's avatar
Paul committed
51
52
}

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

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

Paul's avatar
Paul committed
66
    return migraph::gpu::from_gpu(auto_eval(p, m)());
Paul's avatar
Paul committed
67
68
}

Paul's avatar
Paul committed
69
template <class V>
Paul's avatar
Paul committed
70
void verify_program()
Paul's avatar
Paul committed
71
{
Paul's avatar
Paul committed
72
73
    auto cpu_arg = run_cpu<V>();
    auto gpu_arg = run_gpu<V>();
Paul's avatar
Paul committed
74
75
76
    visit_all(cpu_arg, gpu_arg)([](auto cpu, auto gpu) {
        if(not test::verify_range(cpu, gpu))
        {
Paul's avatar
Paul committed
77
78
79
            std::cout << "FAILED: " << migraph::get_type_name<V>() << std::endl;
        }
    });
Paul's avatar
Paul committed
80
81
}

Paul's avatar
Paul committed
82
83
84
85
86
struct test_literals
{
    migraph::program create_program() const
    {
        migraph::program p;
Paul's avatar
Paul committed
87
88
89
90
        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
91
92
93
94
95
96
        auto conv = p.add_instruction(migraph::convolution{}, input, weights);
        p.add_instruction(migraph::activation{"relu"}, conv);
        return p;
    }
};

Paul's avatar
Paul committed
97
98
struct test_add
{
Paul's avatar
Paul committed
99
    migraph::program create_program() const
Paul's avatar
Paul committed
100
    {
Paul's avatar
Paul committed
101
102
        migraph::program p;
        migraph::shape s{migraph::shape::float_type, {3}};
Paul's avatar
Paul committed
103
104
        auto x = p.add_parameter("x", s);
        auto y = p.add_parameter("y", s);
Paul's avatar
Paul committed
105
        p.add_instruction(migraph::add{}, x, y);
Paul's avatar
Paul committed
106
107
108
109
110
111
        return p;
    }
};

struct test_add_broadcast
{
Paul's avatar
Paul committed
112
    migraph::program create_program() const
Paul's avatar
Paul committed
113
    {
Paul's avatar
Paul committed
114
115
116
117
118
119
        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
120
121
122
123
        return p;
    }
};

Paul's avatar
Paul committed
124
struct test_conv_relu
Paul's avatar
Paul committed
125
{
Paul's avatar
Paul committed
126
    migraph::program create_program() const
Paul's avatar
Paul committed
127
    {
Paul's avatar
Paul committed
128
        migraph::program p;
Paul's avatar
Paul committed
129
130
131
132
        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
133
        p.add_instruction(migraph::activation{"relu"}, conv);
Paul's avatar
Paul committed
134
135
136
137
        return p;
    }
};

Paul's avatar
Paul committed
138
139
struct test_conv_pooling
{
Paul's avatar
Paul committed
140
    migraph::program create_program() const
Paul's avatar
Paul committed
141
    {
Paul's avatar
Paul committed
142
        migraph::program p;
Paul's avatar
Paul committed
143
144
145
146
        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
147
148
149
        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
150
151
152
153
        return p;
    }
};

Paul's avatar
Paul committed
154
155
struct test_gemm
{
Paul's avatar
Paul committed
156
    migraph::program create_program() const
Paul's avatar
Paul committed
157
    {
Paul's avatar
Paul committed
158
159
160
161
        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
162
163
164
165
        return p;
    }
};

Paul's avatar
Paul committed
166
167
168
169
170
171
172
173
174
175
176
177
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;
    }
};

178
179
180
181
182
struct test_gemm_transposeb
{
    migraph::program create_program() const
    {
        migraph::program p;
Paul's avatar
Paul committed
183
184
        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}});
185
186
187
188
189
190
191
192
193
194
195
        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
196
197
        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}});
198
199
200
201
202
203
204
205
206
207
208
        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
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, {3, 5}});
211
212
213
214
215
216
217
        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;
    }
};

218
219
220
221
222
struct test_contiguous
{
    migraph::program create_program() const
    {
        migraph::program p;
223
        migraph::shape s{migraph::shape::float_type, {4, 4, 4, 3}, {48, 4, 1, 16}};
224
225
226
227
228
229
        auto x = p.add_parameter("x", s);
        p.add_instruction(migraph::contiguous{}, x);
        return p;
    }
};

230
struct test_transpose
231
{
232
233
234
235
236
237
238
239
240
241
242
    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;
    }
};
243

Paul's avatar
Paul committed
244
245
int main()
{
Paul's avatar
Paul committed
246
    verify_program<test_add>();
Paul's avatar
Paul committed
247
    verify_program<test_add_broadcast>();
Paul's avatar
Paul committed
248
249
250
    verify_program<test_conv_relu>();
    verify_program<test_conv_pooling>();
    verify_program<test_gemm>();
Paul's avatar
Paul committed
251
    // verify_program<test_gemm_ld>();
252
253
254
    verify_program<test_gemm_transposeb>();
    verify_program<test_gemm_transposea>();
    verify_program<test_gemm_transposeab>();
255
256
    verify_program<test_contiguous>();
    verify_program<test_transpose>();
Paul's avatar
Paul committed
257
}