adjust_allocation.cpp 3.72 KB
Newer Older
1
#include <migraphx/gpu/allocation_model.hpp>
2
#include <migraphx/gpu/context.hpp>
3
4
5
#include <migraphx/gpu/lowering.hpp>
#include <migraphx/gpu/target.hpp>
#include <migraphx/adjust_allocation.hpp>
6
#include <migraphx/auto_contiguous.hpp>
7
#include <migraphx/dead_code_elimination.hpp>
8
#include <migraphx/eliminate_contiguous.hpp>
9
#include <migraphx/replace_allocate.hpp>
10
#include <migraphx/instruction.hpp>
11
12
#include <migraphx/iterator_for.hpp>
#include <migraphx/op/add.hpp>
13
#include <migraphx/op/contiguous.hpp>
14
#include <migraphx/op/tanh.hpp>
15
16
#include <migraphx/op/transpose.hpp>
#include <migraphx/pass_manager.hpp>
Shucai Xiao's avatar
Shucai Xiao committed
17
#include <migraphx/make_op.hpp>
18
19
20
#include <basic_ops.hpp>
#include <test.hpp>

Shucai Xiao's avatar
Shucai Xiao committed
21
void run_lowering(migraphx::program& p, bool offload_copy = false)
22
{
23
    auto ctx = migraphx::gpu::context{};
24
25
26
27
28
29
30
31
32
    migraphx::run_passes(
        *p.get_main_module(),
        {migraphx::auto_contiguous{},
         migraphx::gpu::lowering{&ctx, offload_copy},
         migraphx::dead_code_elimination{},
         migraphx::eliminate_contiguous{"gpu::contiguous"},
         migraphx::dead_code_elimination{},
         migraphx::replace_allocate{migraphx::gpu::gpu_allocation_model{}, offload_copy},
         migraphx::dead_code_elimination{}});
33
}
34

Shucai Xiao's avatar
Shucai Xiao committed
35
TEST_CASE(tanh_shape)
36
37
38
{
    auto create_program = [] {
        migraphx::program p;
39
        auto* mm = p.get_main_module();
40
        migraphx::shape s{migraphx::shape::float_type, {2, 3}};
41
42
43
44
45
        auto x   = mm->add_parameter("x", s);
        auto tx  = mm->add_instruction(migraphx::op::transpose{{1, 0}}, x);
        auto txh = mm->add_instruction(migraphx::op::tanh{}, tx);
        auto sum = mm->add_instruction(migraphx::op::add{}, txh, txh);
        mm->add_instruction(migraphx::op::contiguous{}, sum);
46
47
48
49
50
51
52
53

        return p;
    };

    auto p1 = create_program();
    auto p2 = create_program();
    EXPECT(p1 == p2);

54
55
    run_lowering(p1);
    run_lowering(p2);
56
57
58

    EXPECT(p1 == p2);

Shucai Xiao's avatar
Shucai Xiao committed
59
    for(auto ins : iterator_for(*p1.get_main_module()))
60
    {
61
62
        if(ins->name() == "hip::allocate")
        {
Shucai Xiao's avatar
Shucai Xiao committed
63
            migraphx::shape new_s{migraphx::shape::float_type, {3, 2}, {1, 3}};
Paul's avatar
Paul committed
64
            ins->replace(migraphx::gpu::hip_allocate{new_s});
65
        }
66
67
68
    }
    EXPECT(p1 != p2);

69
    migraphx::run_passes(*p2.get_main_module(),
70
71
                         {migraphx::adjust_allocation{migraphx::gpu::gpu_allocation_model{}},
                          migraphx::dead_code_elimination{}});
72
73
74
    EXPECT(p1 == p2);
}

Shucai Xiao's avatar
Shucai Xiao committed
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
TEST_CASE(no_copy_dead_param)
{
    auto create_program = [] {
        migraphx::program p;
        auto* mm = p.get_main_module();
        migraphx::shape s{migraphx::shape::float_type, {2, 3}};
        auto x = mm->add_parameter("x", s);
        mm->add_parameter("y", s);
        auto sum = mm->add_instruction(migraphx::make_op("add"), x, x);
        mm->add_return({sum});

        return p;
    };

    auto create_gpu_program = [] {
        migraphx::program p;
        auto* mm = p.get_main_module();
        migraphx::shape s{migraphx::shape::float_type, {2, 3}};
        auto x = mm->add_parameter("x", s);
        mm->add_parameter("y", s);
        auto xb = mm->add_instruction(migraphx::make_op("hip::allocate", {{"shape", to_value(s)}}));
        auto gx = mm->add_instruction(migraphx::make_op("hip::copy_to_gpu"), x, xb);
        auto ab = mm->add_instruction(migraphx::make_op("hip::allocate", {{"shape", to_value(s)}}));
        auto sum = mm->add_instruction(migraphx::make_op("gpu::add"), gx, gx, ab);
        auto r   = mm->add_instruction(migraphx::make_op("hip::copy_from_gpu"), sum);
        mm->add_return({r});

        return p;
    };

    auto p1 = create_program();
    auto p2 = create_gpu_program();

    run_lowering(p1, true);
    EXPECT(p1 == p2);
}

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