"docs/vscode:/vscode.git/clone" did not exist on "2db6719cc5bb1de607c07bcefe06d915fd0ca45d"
miopen.cpp 6.34 KB
Newer Older
Paul's avatar
Paul committed
1

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

#include <miopen/miopen.h>

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

Paul's avatar
Paul committed
16
template <class V>
Paul's avatar
Paul committed
17
migraph::argument run_cpu()
Paul's avatar
Paul committed
18
{
Paul's avatar
Paul committed
19
20
    V v;
    auto p = v.create_program();
Paul's avatar
Paul committed
21
    p.compile(migraph::cpu::cpu_target{});
Paul's avatar
Paul committed
22
    return p.eval(v.create_params());
Paul's avatar
Paul committed
23
24
}

Paul's avatar
Paul committed
25
template <class V>
Paul's avatar
Paul committed
26
migraph::argument run_gpu()
Paul's avatar
Paul committed
27
{
Paul's avatar
Paul committed
28
29
    V v;
    auto p = v.create_program();
Paul's avatar
Paul committed
30
    p.compile(migraph::miopen::miopen_target{});
Paul's avatar
Paul committed
31
32

    auto m = v.create_params();
Paul's avatar
Paul committed
33
    for(auto&& e : m)
Paul's avatar
Paul committed
34
    {
Paul's avatar
Paul committed
35
        e.second = migraph::miopen::to_gpu(e.second);
Paul's avatar
Paul committed
36
37
    }

Paul's avatar
Paul committed
38
39
    m["output"] =
        migraph::miopen::to_gpu(migraph::generate_argument(p.get_parameter_shape("output")));
Paul's avatar
Paul committed
40

Paul's avatar
Paul committed
41
    return migraph::miopen::from_gpu(p.eval(m));
Paul's avatar
Paul committed
42
43
}

Paul's avatar
Paul committed
44
template <class V>
Paul's avatar
Paul committed
45
void verify_program()
Paul's avatar
Paul committed
46
{
Paul's avatar
Paul committed
47
48
    auto cpu_arg = run_cpu<V>();
    auto gpu_arg = run_gpu<V>();
Paul's avatar
Paul committed
49
    visit_all(cpu_arg, gpu_arg)([](auto cpu, auto gpu) { EXPECT(test::verify_range(cpu, gpu)); });
Paul's avatar
Paul committed
50
51
}

Paul's avatar
Paul committed
52
53
struct test_add
{
Paul's avatar
Paul committed
54
    migraph::program create_program() const
Paul's avatar
Paul committed
55
    {
Paul's avatar
Paul committed
56
57
        migraph::program p;
        migraph::shape s{migraph::shape::float_type, {3}};
Paul's avatar
Paul committed
58
59
        auto x = p.add_parameter("x", s);
        auto y = p.add_parameter("y", s);
Paul's avatar
Paul committed
60
        p.add_instruction(migraph::add{}, x, y);
Paul's avatar
Paul committed
61
62
63
        return p;
    }

Paul's avatar
Paul committed
64
    migraph::program::parameter_map create_params() const
Paul's avatar
Paul committed
65
    {
Paul's avatar
Paul committed
66
67
68
        migraph::program::parameter_map m;
        m["x"] = migraph::generate_argument({migraph::shape::float_type, {3}});
        m["y"] = migraph::generate_argument({migraph::shape::float_type, {3}});
Paul's avatar
Paul committed
69
70
71
72
73
74
        return m;
    }
};

struct test_add_broadcast
{
Paul's avatar
Paul committed
75
    migraph::program create_program() const
Paul's avatar
Paul committed
76
    {
Paul's avatar
Paul committed
77
78
79
80
81
82
        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
83
84
85
        return p;
    }

Paul's avatar
Paul committed
86
    migraph::program::parameter_map create_params() const
Paul's avatar
Paul committed
87
    {
Paul's avatar
Paul committed
88
89
90
        migraph::program::parameter_map m;
        m["x"] = migraph::generate_argument({migraph::shape::float_type, {2, 2, 3}});
        m["y"] = migraph::generate_argument({migraph::shape::float_type, {2, 2}});
Paul's avatar
Paul committed
91
92
93
94
        return m;
    }
};

Paul's avatar
Paul committed
95
struct test_conv_relu
Paul's avatar
Paul committed
96
{
Paul's avatar
Paul committed
97
    migraph::program create_program() const
Paul's avatar
Paul committed
98
    {
Paul's avatar
Paul committed
99
        migraph::program p;
Paul's avatar
Paul committed
100
101
102
103
        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
104
        p.add_instruction(migraph::activation{"relu"}, conv);
Paul's avatar
Paul committed
105
106
107
        return p;
    }

Paul's avatar
Paul committed
108
    migraph::program::parameter_map create_params() const
Paul's avatar
Paul committed
109
    {
Paul's avatar
Paul committed
110
111
112
        migraph::program::parameter_map m;
        m["x"] = migraph::generate_argument({migraph::shape::float_type, {4, 3, 3, 3}});
        m["w"] = migraph::generate_argument({migraph::shape::float_type, {4, 3, 3, 3}});
Paul's avatar
Paul committed
113
114
115
116
        return m;
    }
};

Paul's avatar
Paul committed
117
118
struct test_conv_pooling
{
Paul's avatar
Paul committed
119
    migraph::program create_program() const
Paul's avatar
Paul committed
120
    {
Paul's avatar
Paul committed
121
        migraph::program p;
Paul's avatar
Paul committed
122
123
124
125
        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
126
127
128
        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
129
130
131
        return p;
    }

Paul's avatar
Paul committed
132
    migraph::program::parameter_map create_params() const
Paul's avatar
Paul committed
133
    {
Paul's avatar
Paul committed
134
135
136
        migraph::program::parameter_map m;
        m["x"] = migraph::generate_argument({migraph::shape::float_type, {4, 3, 32, 32}});
        m["w"] = migraph::generate_argument({migraph::shape::float_type, {4, 3, 3, 3}});
Paul's avatar
Paul committed
137
138
139
140
        return m;
    }
};

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

Paul's avatar
Paul committed
152
    migraph::program::parameter_map create_params() const
Paul's avatar
Paul committed
153
    {
Paul's avatar
Paul committed
154
155
156
        migraph::program::parameter_map m;
        m["a"] = migraph::generate_argument({migraph::shape::float_type, {4, 5}});
        m["b"] = migraph::generate_argument({migraph::shape::float_type, {5, 3}});
Paul's avatar
Paul committed
157
158
159
160
        return m;
    }
};

161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
struct test_contiguous
{
    migraph::program create_program() const
    {
        migraph::program p;
        migraph::shape s{migraph::shape::float_type, {32, 16, 128, 128}, {262144, 128, 1, 16384}};
        auto x = p.add_parameter("x", s);
        p.add_instruction(migraph::contiguous{}, x);
        return p;
    }

    migraph::program::parameter_map create_params() const
    {
        migraph::program::parameter_map m;
        m["x"] = migraph::generate_argument({migraph::shape::float_type, {32, 16, 128, 128}});
        return m;
    }
};

void contiguous_test()
{
    migraph::shape a_shape{migraph::shape::float_type, {1, 3, 2, 2}, {12, 1, 6, 3}};
    std::vector<float> data(12);
    std::iota(data.begin(), data.end(), 0);

    migraph::program p;
    auto l = p.add_literal(migraph::literal{a_shape, data});
    p.add_instruction(migraph::contiguous{}, l);
    p.compile(migraph::miopen::miopen_target{});
    auto result = p.eval({});

    std::vector<float> results_vector(12);
    result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
    std::vector<size_t> new_lens    = {1, 3, 2, 2};
    std::vector<size_t> new_strides = {12, 1, 6, 3};
    std::vector<float> gold         = {0, 3, 6, 9, 1, 4, 7, 10, 2, 5, 8, 11};
    EXPECT(test::verify_range(results_vector, gold));
}

Paul's avatar
Paul committed
200
201
int main()
{
Paul's avatar
Paul committed
202
    verify_program<test_add>();
Paul's avatar
Paul committed
203
    verify_program<test_add_broadcast>();
Paul's avatar
Paul committed
204
205
206
    verify_program<test_conv_relu>();
    verify_program<test_conv_pooling>();
    verify_program<test_gemm>();
207
208
    // verify_program<test_contiguous>();
    contiguous_test();
Paul's avatar
Paul committed
209
}