adjust_allocation.cpp 3.62 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/instruction.hpp>
10
11
#include <migraphx/iterator_for.hpp>
#include <migraphx/op/add.hpp>
12
#include <migraphx/op/contiguous.hpp>
13
#include <migraphx/op/tanh.hpp>
14
15
#include <migraphx/op/transpose.hpp>
#include <migraphx/pass_manager.hpp>
Shucai Xiao's avatar
Shucai Xiao committed
16
#include <migraphx/make_op.hpp>
17
18
19
#include <basic_ops.hpp>
#include <test.hpp>

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

Shucai Xiao's avatar
Shucai Xiao committed
31
TEST_CASE(tanh_shape)
32
33
34
{
    auto create_program = [] {
        migraphx::program p;
35
        auto* mm = p.get_main_module();
36
        migraphx::shape s{migraphx::shape::float_type, {2, 3}};
37
38
39
40
41
        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);
42
43
44
45
46
47
48
49

        return p;
    };

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

50
51
    run_lowering(p1);
    run_lowering(p2);
52
53
54

    EXPECT(p1 == p2);

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

65
    migraphx::run_passes(*p2.get_main_module(),
66
67
                         {migraphx::adjust_allocation{migraphx::gpu::gpu_allocation_model{}},
                          migraphx::dead_code_elimination{}});
68
69
70
    EXPECT(p1 == p2);
}

Shucai Xiao's avatar
Shucai Xiao committed
71
72
73
74
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
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);
}

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