miopen.cpp 4.94 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
    m["output"] = migraph::miopen::to_gpu(migraph::generate_argument(p.get_parameter_shape("output")));
Paul's avatar
Paul committed
39

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

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

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

Paul's avatar
Paul committed
63
    migraph::program::parameter_map create_params() const
Paul's avatar
Paul committed
64
    {
Paul's avatar
Paul committed
65
66
67
        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
68
69
70
71
72
73
        return m;
    }
};

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

Paul's avatar
Paul committed
85
    migraph::program::parameter_map create_params() const
Paul's avatar
Paul committed
86
    {
Paul's avatar
Paul committed
87
88
89
        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
90
91
92
93
        return m;
    }
};

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

Paul's avatar
Paul committed
106
    migraph::program::parameter_map create_params() const
Paul's avatar
Paul committed
107
    {
Paul's avatar
Paul committed
108
109
110
        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
111
112
113
114
        return m;
    }
};

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

Paul's avatar
Paul committed
128
    migraph::program::parameter_map create_params() const
Paul's avatar
Paul committed
129
    {
Paul's avatar
Paul committed
130
131
132
        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
133
134
135
136
        return m;
    }
};

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

Paul's avatar
Paul committed
148
    migraph::program::parameter_map create_params() const
Paul's avatar
Paul committed
149
    {
Paul's avatar
Paul committed
150
151
152
        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
153
154
155
156
        return m;
    }
};

Paul's avatar
Paul committed
157
158
int main()
{
Paul's avatar
Paul committed
159
    verify_program<test_add>();
Paul's avatar
Paul committed
160
    verify_program<test_add_broadcast>();
Paul's avatar
Paul committed
161
162
163
    verify_program<test_conv_relu>();
    verify_program<test_conv_pooling>();
    verify_program<test_gemm>();
Paul's avatar
Paul committed
164
}