Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
gaoqiong
MIGraphX
Commits
cd4ab535
Commit
cd4ab535
authored
Jun 20, 2023
by
Khalique Ahmed
Browse files
manual merge
parents
3891ee58
a0fa3742
Changes
279
Show whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
1658 additions
and
260 deletions
+1658
-260
test/print_graph_test.cpp
test/print_graph_test.cpp
+7
-7
test/promote_literals_test.cpp
test/promote_literals_test.cpp
+305
-0
test/py/onnx_backend_test.py
test/py/onnx_backend_test.py
+7
-0
test/py/test_gpu.py
test/py/test_gpu.py
+42
-3
test/py/test_gpu_offload.py
test/py/test_gpu_offload.py
+48
-11
test/py/test_instruction.py
test/py/test_instruction.py
+53
-0
test/py/test_shape.py
test/py/test_shape.py
+42
-0
test/ref_dot_op_test.cpp
test/ref_dot_op_test.cpp
+2
-3
test/ref_ops_test.cpp
test/ref_ops_test.cpp
+207
-153
test/rewrite_quantization_test.cpp
test/rewrite_quantization_test.cpp
+17
-9
test/run_on_target_test.cpp
test/run_on_target_test.cpp
+74
-0
test/shape_test.cpp
test/shape_test.cpp
+178
-47
test/simplify_algebra_test.cpp
test/simplify_algebra_test.cpp
+367
-0
test/simplify_qdq_test.cpp
test/simplify_qdq_test.cpp
+10
-5
test/simplify_reshapes_test.cpp
test/simplify_reshapes_test.cpp
+40
-0
test/split_single_dyn_dim_test.cpp
test/split_single_dyn_dim_test.cpp
+220
-0
test/targets.cpp
test/targets.cpp
+6
-4
test/verify/main.cpp
test/verify/main.cpp
+4
-1
test/verify/run_verify.cpp
test/verify/run_verify.cpp
+22
-14
test/verify/run_verify.hpp
test/verify/run_verify.hpp
+7
-3
No files found.
test/print_graph_test.cpp
View file @
cd4ab535
...
...
@@ -54,15 +54,15 @@ TEST_CASE(basic_graph_test)
EXPECT
(
migraphx
::
contains
(
test
,
"digraph"
));
EXPECT
(
migraphx
::
contains
(
test
,
"rankdir=LR"
));
EXPECT
(
migraphx
::
contains
(
test
,
"
\"
main:
@0
\"
[label=
\"
@literal
\"
]"
));
EXPECT
(
migraphx
::
contains
(
test
,
"
\"
@0
\"
[label=
\"
@literal
\"
]"
));
EXPECT
(
migraphx
::
contains
(
test
,
"
\"
y
\"
[label=
\"
@param:y
\"
]"
));
EXPECT
(
migraphx
::
contains
(
test
,
"
\"
x
\"
[label=
\"
@param:x
\"
]"
));
EXPECT
(
migraphx
::
contains
(
test
,
"
\"
main:
@3
\"
[label=
\"
sum
\"
]"
));
EXPECT
(
migraphx
::
contains
(
test
,
"
\"
main:
@4
\"
[label=
\"
sum
\"
]"
));
EXPECT
(
migraphx
::
contains
(
test
,
"
\"
x
\"
->
\"
main:
@3
\"
"
));
EXPECT
(
migraphx
::
contains
(
test
,
"
\"
y
\"
->
\"
main:
@3
\"
"
));
EXPECT
(
migraphx
::
contains
(
test
,
"
\"
main:
@3
\"
->
\"
main:
@4
\"
"
));
EXPECT
(
migraphx
::
contains
(
test
,
"
\"
main:
@0
\"
->
\"
main:
@4
\"
"
));
EXPECT
(
migraphx
::
contains
(
test
,
"
\"
@3
\"
[label=
\"
sum
\"
]"
));
EXPECT
(
migraphx
::
contains
(
test
,
"
\"
@4
\"
[label=
\"
sum
\"
]"
));
EXPECT
(
migraphx
::
contains
(
test
,
"
\"
x
\"
->
\"
@3
\"
"
));
EXPECT
(
migraphx
::
contains
(
test
,
"
\"
y
\"
->
\"
@3
\"
"
));
EXPECT
(
migraphx
::
contains
(
test
,
"
\"
@3
\"
->
\"
@4
\"
"
));
EXPECT
(
migraphx
::
contains
(
test
,
"
\"
@0
\"
->
\"
@4
\"
"
));
EXPECT
(
migraphx
::
contains
(
test
,
"[label=
\"
int64_type, {1}, {0}
\"
]"
));
}
...
...
test/promote_literals_test.cpp
0 → 100644
View file @
cd4ab535
/*
* The MIT License (MIT)
*
* Copyright (c) 2015-2023 Advanced Micro Devices, Inc. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#include <migraphx/promote_literals.hpp>
#include <migraphx/program.hpp>
#include <migraphx/dead_code_elimination.hpp>
#include <migraphx/eliminate_common_subexpression.hpp>
#include <migraphx/pass_manager.hpp>
#include <migraphx/make_op.hpp>
#include <migraphx/serialize.hpp>
#include <test.hpp>
void
run_promote
(
migraphx
::
program
&
p
)
{
migraphx
::
run_passes
(
p
,
{
migraphx
::
promote_literals
{},
migraphx
::
dead_code_elimination
{}});
}
void
run_promote_and_ecs
(
migraphx
::
program
&
p
)
{
migraphx
::
run_passes
(
p
,
{
migraphx
::
promote_literals
{},
migraphx
::
dead_code_elimination
{},
migraphx
::
eliminate_common_subexpression
{},
migraphx
::
dead_code_elimination
{}});
}
TEST_CASE
(
promote_only
)
{
migraphx
::
program
p0
;
{
auto
*
mm0
=
p0
.
get_main_module
();
// create batch submodules
auto
create_submodule
=
[
&
](
std
::
size_t
batch_size
,
const
std
::
string
&
module_name
)
{
auto
*
submod
=
p0
.
create_module
(
module_name
);
migraphx
::
shape
sm_shape
{
migraphx
::
shape
::
float_type
,
{
batch_size
,
4
}};
auto
sm_input
=
submod
->
add_parameter
(
"data"
,
sm_shape
);
migraphx
::
shape
lit_s
{
migraphx
::
shape
{
migraphx
::
shape
::
float_type
,
{
1
}}};
auto
literal_ins
=
submod
->
add_literal
(
migraphx
::
literal
{
lit_s
,
{
6
}});
auto
broadcast_lit
=
submod
->
add_instruction
(
migraphx
::
make_op
(
"multibroadcast"
),
literal_ins
,
sm_input
);
auto
add_ins
=
submod
->
add_instruction
(
migraphx
::
make_op
(
"add"
),
sm_input
,
broadcast_lit
);
submod
->
add_return
({
add_ins
});
return
submod
;
};
auto
*
dim1
=
create_submodule
(
1
,
"dim_1"
);
auto
*
dim2
=
create_submodule
(
2
,
"dim_2"
);
auto
*
dim3
=
create_submodule
(
3
,
"dim_3"
);
auto
*
dim4
=
create_submodule
(
4
,
"dim_4"
);
migraphx
::
shape
s
{
migraphx
::
shape
::
float_type
,
{{
1
,
4
},
{
4
,
4
}}};
auto
input0
=
mm0
->
add_parameter
(
"data"
,
s
);
std
::
vector
<
migraphx
::
shape
>
sub_shapes
=
{};
sub_shapes
.
push_back
(
migraphx
::
shape
{
migraphx
::
shape
::
float_type
,
{{
1
,
4
},
{
4
,
4
}}});
migraphx
::
shape
out_attr
=
migraphx
::
shape
{
sub_shapes
};
auto
sm_ins
=
mm0
->
add_instruction
(
migraphx
::
make_op
(
"select_module"
,
{{
"output_dyn_shapes"
,
migraphx
::
to_value
(
out_attr
)}}),
{
input0
},
{
dim1
,
dim2
,
dim3
,
dim4
});
auto
ret
=
mm0
->
add_instruction
(
migraphx
::
make_op
(
"get_tuple_elem"
,
{{
"index"
,
0
}}),
sm_ins
);
mm0
->
add_return
({
ret
});
}
run_promote
(
p0
);
migraphx
::
program
p1
;
{
auto
*
mm1
=
p1
.
get_main_module
();
migraphx
::
shape
lit_s
{
migraphx
::
shape
{
migraphx
::
shape
::
float_type
,
{
1
}}};
auto
literal_ins3
=
mm1
->
add_literal
(
migraphx
::
literal
{
lit_s
,
{
6
}});
auto
literal_ins2
=
mm1
->
add_literal
(
migraphx
::
literal
{
lit_s
,
{
6
}});
auto
literal_ins1
=
mm1
->
add_literal
(
migraphx
::
literal
{
lit_s
,
{
6
}});
auto
literal_ins0
=
mm1
->
add_literal
(
migraphx
::
literal
{
lit_s
,
{
6
}});
// create batch submodules
auto
create_submodule
=
[
&
](
std
::
size_t
batch_size
,
migraphx
::
instruction_ref
lit
,
const
std
::
string
&
module_name
)
{
auto
*
submod
=
p1
.
create_module
(
module_name
);
migraphx
::
shape
sm_shape
{
migraphx
::
shape
::
float_type
,
{
batch_size
,
4
}};
auto
sm_input
=
submod
->
add_parameter
(
"data"
,
sm_shape
);
auto
broadcast_lit
=
submod
->
add_instruction
(
migraphx
::
make_op
(
"multibroadcast"
),
lit
,
sm_input
);
auto
add_ins
=
submod
->
add_instruction
(
migraphx
::
make_op
(
"add"
),
sm_input
,
broadcast_lit
);
submod
->
add_return
({
add_ins
});
return
submod
;
};
auto
*
dim1
=
create_submodule
(
1
,
literal_ins0
,
"dim_1"
);
auto
*
dim2
=
create_submodule
(
2
,
literal_ins1
,
"dim_2"
);
auto
*
dim3
=
create_submodule
(
3
,
literal_ins2
,
"dim_3"
);
auto
*
dim4
=
create_submodule
(
4
,
literal_ins3
,
"dim_4"
);
migraphx
::
shape
s
{
migraphx
::
shape
::
float_type
,
{{
1
,
4
},
{
4
,
4
}}};
auto
input0
=
mm1
->
insert_parameter
(
std
::
next
(
literal_ins3
),
"data"
,
s
);
std
::
vector
<
migraphx
::
shape
>
sub_shapes
=
{};
sub_shapes
.
push_back
(
migraphx
::
shape
{
migraphx
::
shape
::
float_type
,
{{
1
,
4
},
{
4
,
4
}}});
migraphx
::
shape
out_attr
=
migraphx
::
shape
{
sub_shapes
};
auto
sm_ins
=
mm1
->
add_instruction
(
migraphx
::
make_op
(
"select_module"
,
{{
"output_dyn_shapes"
,
migraphx
::
to_value
(
out_attr
)}}),
{
input0
},
{
dim1
,
dim2
,
dim3
,
dim4
});
auto
ret
=
mm1
->
add_instruction
(
migraphx
::
make_op
(
"get_tuple_elem"
,
{{
"index"
,
0
}}),
sm_ins
);
mm1
->
add_return
({
ret
});
}
EXPECT
(
p0
==
p1
);
}
TEST_CASE
(
promote_and_ecs0
)
{
migraphx
::
program
p0
;
{
auto
*
mm0
=
p0
.
get_main_module
();
// create batch submodules
auto
create_submodule
=
[
&
](
std
::
size_t
batch_size
,
const
std
::
string
&
module_name
)
{
auto
*
submod
=
p0
.
create_module
(
module_name
);
migraphx
::
shape
sm_shape
{
migraphx
::
shape
::
float_type
,
{
batch_size
,
4
}};
auto
sm_input
=
submod
->
add_parameter
(
"data"
,
sm_shape
);
migraphx
::
shape
lit_s
{
migraphx
::
shape
{
migraphx
::
shape
::
float_type
,
{
1
}}};
auto
literal_ins
=
submod
->
add_literal
(
migraphx
::
literal
{
lit_s
,
{
6
}});
auto
broadcast_lit
=
submod
->
add_instruction
(
migraphx
::
make_op
(
"multibroadcast"
),
literal_ins
,
sm_input
);
auto
add_ins
=
submod
->
add_instruction
(
migraphx
::
make_op
(
"add"
),
sm_input
,
broadcast_lit
);
submod
->
add_return
({
add_ins
});
return
submod
;
};
auto
*
dim1
=
create_submodule
(
1
,
"dim_1"
);
auto
*
dim2
=
create_submodule
(
2
,
"dim_2"
);
auto
*
dim3
=
create_submodule
(
3
,
"dim_3"
);
auto
*
dim4
=
create_submodule
(
4
,
"dim_4"
);
migraphx
::
shape
s
{
migraphx
::
shape
::
float_type
,
{{
1
,
4
},
{
4
,
4
}}};
auto
input0
=
mm0
->
add_parameter
(
"data"
,
s
);
std
::
vector
<
migraphx
::
shape
>
sub_shapes
=
{};
sub_shapes
.
push_back
(
migraphx
::
shape
{
migraphx
::
shape
::
float_type
,
{{
1
,
4
},
{
4
,
4
}}});
migraphx
::
shape
out_attr
=
migraphx
::
shape
{
sub_shapes
};
auto
sm_ins
=
mm0
->
add_instruction
(
migraphx
::
make_op
(
"select_module"
,
{{
"output_dyn_shapes"
,
migraphx
::
to_value
(
out_attr
)}}),
{
input0
},
{
dim1
,
dim2
,
dim3
,
dim4
});
auto
ret
=
mm0
->
add_instruction
(
migraphx
::
make_op
(
"get_tuple_elem"
,
{{
"index"
,
0
}}),
sm_ins
);
mm0
->
add_return
({
ret
});
}
run_promote_and_ecs
(
p0
);
migraphx
::
program
p1
;
{
auto
*
mm1
=
p1
.
get_main_module
();
migraphx
::
shape
lit_s
{
migraphx
::
shape
{
migraphx
::
shape
::
float_type
,
{
1
}}};
auto
literal_ins
=
mm1
->
add_literal
(
migraphx
::
literal
{
lit_s
,
{
6
}});
// create batch submodules
auto
create_submodule
=
[
&
](
std
::
size_t
batch_size
,
const
std
::
string
&
module_name
)
{
auto
*
submod
=
p1
.
create_module
(
module_name
);
migraphx
::
shape
sm_shape
{
migraphx
::
shape
::
float_type
,
{
batch_size
,
4
}};
auto
sm_input
=
submod
->
add_parameter
(
"data"
,
sm_shape
);
auto
broadcast_lit
=
submod
->
add_instruction
(
migraphx
::
make_op
(
"multibroadcast"
),
literal_ins
,
sm_input
);
auto
add_ins
=
submod
->
add_instruction
(
migraphx
::
make_op
(
"add"
),
sm_input
,
broadcast_lit
);
submod
->
add_return
({
add_ins
});
return
submod
;
};
auto
*
dim1
=
create_submodule
(
1
,
"dim_1"
);
auto
*
dim2
=
create_submodule
(
2
,
"dim_2"
);
auto
*
dim3
=
create_submodule
(
3
,
"dim_3"
);
auto
*
dim4
=
create_submodule
(
4
,
"dim_4"
);
migraphx
::
shape
s
{
migraphx
::
shape
::
float_type
,
{{
1
,
4
},
{
4
,
4
}}};
auto
input0
=
mm1
->
insert_parameter
(
std
::
next
(
literal_ins
),
"data"
,
s
);
std
::
vector
<
migraphx
::
shape
>
sub_shapes
=
{};
sub_shapes
.
push_back
(
migraphx
::
shape
{
migraphx
::
shape
::
float_type
,
{{
1
,
4
},
{
4
,
4
}}});
migraphx
::
shape
out_attr
=
migraphx
::
shape
{
sub_shapes
};
auto
sm_ins
=
mm1
->
add_instruction
(
migraphx
::
make_op
(
"select_module"
,
{{
"output_dyn_shapes"
,
migraphx
::
to_value
(
out_attr
)}}),
{
input0
},
{
dim1
,
dim2
,
dim3
,
dim4
});
auto
ret
=
mm1
->
add_instruction
(
migraphx
::
make_op
(
"get_tuple_elem"
,
{{
"index"
,
0
}}),
sm_ins
);
mm1
->
add_return
({
ret
});
}
EXPECT
(
p0
==
p1
);
}
TEST_CASE
(
promote_and_ecs1
)
{
migraphx
::
program
p0
;
{
auto
*
mm0
=
p0
.
get_main_module
();
// create batch submodules
auto
create_submodule
=
[
&
](
std
::
size_t
batch_size
,
const
std
::
string
&
module_name
)
{
auto
*
submod
=
p0
.
create_module
(
module_name
);
migraphx
::
shape
sm_shape
{
migraphx
::
shape
::
float_type
,
{
batch_size
,
4
}};
auto
sm_input
=
submod
->
add_parameter
(
"data"
,
sm_shape
);
migraphx
::
shape
lit_s
{
migraphx
::
shape
{
migraphx
::
shape
::
float_type
,
{
1
}}};
auto
literal_ins0
=
submod
->
add_literal
(
migraphx
::
literal
{
lit_s
,
{
6
}});
auto
literal_ins1
=
submod
->
add_literal
(
migraphx
::
literal
{
lit_s
,
{
2
}});
auto
broadcast_lit0
=
submod
->
add_instruction
(
migraphx
::
make_op
(
"multibroadcast"
),
literal_ins0
,
sm_input
);
auto
broadcast_lit1
=
submod
->
add_instruction
(
migraphx
::
make_op
(
"multibroadcast"
),
literal_ins1
,
sm_input
);
auto
add_ins
=
submod
->
add_instruction
(
migraphx
::
make_op
(
"add"
),
sm_input
,
broadcast_lit0
);
auto
mul_ins
=
submod
->
add_instruction
(
migraphx
::
make_op
(
"mul"
),
add_ins
,
broadcast_lit1
);
submod
->
add_return
({
mul_ins
});
return
submod
;
};
auto
*
dim1
=
create_submodule
(
1
,
"dim_1"
);
auto
*
dim2
=
create_submodule
(
2
,
"dim_2"
);
migraphx
::
shape
s
{
migraphx
::
shape
::
float_type
,
{{
1
,
4
},
{
4
,
4
}}};
auto
input0
=
mm0
->
add_parameter
(
"data"
,
s
);
std
::
vector
<
migraphx
::
shape
>
sub_shapes
=
{};
sub_shapes
.
push_back
(
migraphx
::
shape
{
migraphx
::
shape
::
float_type
,
{{
1
,
4
},
{
4
,
4
}}});
migraphx
::
shape
out_attr
=
migraphx
::
shape
{
sub_shapes
};
auto
sm_ins
=
mm0
->
add_instruction
(
migraphx
::
make_op
(
"select_module"
,
{{
"output_dyn_shapes"
,
migraphx
::
to_value
(
out_attr
)}}),
{
input0
},
{
dim1
,
dim2
});
auto
ret
=
mm0
->
add_instruction
(
migraphx
::
make_op
(
"get_tuple_elem"
,
{{
"index"
,
0
}}),
sm_ins
);
mm0
->
add_return
({
ret
});
}
run_promote_and_ecs
(
p0
);
migraphx
::
program
p1
;
{
auto
*
mm1
=
p1
.
get_main_module
();
migraphx
::
shape
lit_s
{
migraphx
::
shape
{
migraphx
::
shape
::
float_type
,
{
1
}}};
auto
literal_ins1
=
mm1
->
add_literal
(
migraphx
::
literal
{
lit_s
,
{
2
}});
auto
literal_ins0
=
mm1
->
add_literal
(
migraphx
::
literal
{
lit_s
,
{
6
}});
// create batch submodules
auto
create_submodule
=
[
&
](
std
::
size_t
batch_size
,
const
std
::
string
&
module_name
)
{
auto
*
submod
=
p1
.
create_module
(
module_name
);
migraphx
::
shape
sm_shape
{
migraphx
::
shape
::
float_type
,
{
batch_size
,
4
}};
auto
sm_input
=
submod
->
add_parameter
(
"data"
,
sm_shape
);
auto
broadcast_lit0
=
submod
->
add_instruction
(
migraphx
::
make_op
(
"multibroadcast"
),
literal_ins0
,
sm_input
);
auto
broadcast_lit1
=
submod
->
add_instruction
(
migraphx
::
make_op
(
"multibroadcast"
),
literal_ins1
,
sm_input
);
auto
add_ins
=
submod
->
add_instruction
(
migraphx
::
make_op
(
"add"
),
sm_input
,
broadcast_lit0
);
auto
mul_ins
=
submod
->
add_instruction
(
migraphx
::
make_op
(
"mul"
),
add_ins
,
broadcast_lit1
);
submod
->
add_return
({
mul_ins
});
return
submod
;
};
auto
*
dim1
=
create_submodule
(
1
,
"dim_1"
);
auto
*
dim2
=
create_submodule
(
2
,
"dim_2"
);
migraphx
::
shape
s
{
migraphx
::
shape
::
float_type
,
{{
1
,
4
},
{
4
,
4
}}};
auto
input0
=
mm1
->
insert_parameter
(
std
::
next
(
literal_ins1
),
"data"
,
s
);
std
::
vector
<
migraphx
::
shape
>
sub_shapes
=
{};
sub_shapes
.
push_back
(
migraphx
::
shape
{
migraphx
::
shape
::
float_type
,
{{
1
,
4
},
{
4
,
4
}}});
migraphx
::
shape
out_attr
=
migraphx
::
shape
{
sub_shapes
};
auto
sm_ins
=
mm1
->
add_instruction
(
migraphx
::
make_op
(
"select_module"
,
{{
"output_dyn_shapes"
,
migraphx
::
to_value
(
out_attr
)}}),
{
input0
},
{
dim1
,
dim2
});
auto
ret
=
mm1
->
add_instruction
(
migraphx
::
make_op
(
"get_tuple_elem"
,
{{
"index"
,
0
}}),
sm_ins
);
mm1
->
add_return
({
ret
});
}
EXPECT
(
p0
==
p1
);
}
int
main
(
int
argc
,
const
char
*
argv
[])
{
test
::
run
(
argc
,
argv
);
}
test/py/onnx_backend_test.py
100755 → 100644
View file @
cd4ab535
...
...
@@ -104,6 +104,10 @@ def disabled_tests_onnx_1_10_0(backend_test):
backend_test
.
exclude
(
r
'test_shape_start_negative_1_cpu'
)
def
disabled_tests_onnx_1_12_0
(
backend_test
):
backend_test
.
exclude
(
r
'test_scatter_elements_with_duplicate_indices_cpu'
)
def
create_backend_test
(
testname
=
None
,
target_device
=
None
):
if
target_device
is
not
None
:
c2
.
set_device
(
target_device
)
...
...
@@ -327,6 +331,9 @@ def create_backend_test(testname=None, target_device=None):
if
version
.
parse
(
onnx
.
__version__
)
>=
version
.
parse
(
"1.10.0"
):
disabled_tests_onnx_1_10_0
(
backend_test
)
if
version
.
parse
(
onnx
.
__version__
)
>=
version
.
parse
(
"1.12.0"
):
disabled_tests_onnx_1_12_0
(
backend_test
)
# import all test cases at global scope to make
# them visible to python.unittest.
...
...
test/py/test_gpu.py
View file @
cd4ab535
...
...
@@ -86,8 +86,8 @@ def test_nonzero():
params
=
{}
shapes
=
p
.
get_parameter_shapes
()
params
[
"data"
]
=
np
.
array
([
1
,
1
,
0
,
1
]).
reshape
(
shapes
[
"data"
].
lens
()).
astype
(
np
.
bool
)
params
[
"data"
]
=
np
.
array
([
1
,
1
,
0
,
1
]).
reshape
(
shapes
[
"data"
].
lens
()).
astype
(
bool
)
r
=
p
.
run
(
params
)
print
(
r
)
...
...
@@ -127,15 +127,54 @@ def test_if_pl():
params
[
"x"
]
=
np
.
ones
(
6
).
reshape
(
shapes
[
"x"
].
lens
()).
astype
(
np
.
float32
)
params
[
"y"
]
=
np
.
array
([
2.0
,
2.0
,
2.0
,
2.0
,
2.0
,
2.0
,
2.0
,
2.0
,
2.0
]).
reshape
(
shapes
[
"y"
].
lens
()).
astype
(
np
.
float32
)
params
[
"cond"
]
=
np
.
array
([
1
]).
reshape
(()).
astype
(
np
.
bool
)
params
[
"cond"
]
=
np
.
array
([
1
]).
reshape
(()).
astype
(
bool
)
r
=
p
.
run
(
params
)[
-
1
]
print
(
r
)
def
test_dyn_batch
():
a
=
migraphx
.
shape
.
dynamic_dimension
(
1
,
4
,
{
2
,
4
})
b
=
migraphx
.
shape
.
dynamic_dimension
(
3
,
3
)
c
=
migraphx
.
shape
.
dynamic_dimension
(
32
,
32
)
dd_map
=
{
"0"
:
[
a
,
b
,
c
,
c
]}
p
=
migraphx
.
parse_onnx
(
"conv_relu_maxpool_test.onnx"
,
map_dyn_input_dims
=
dd_map
)
print
(
p
)
print
(
"Compiling ..."
)
p
.
compile
(
migraphx
.
get_target
(
"gpu"
))
print
(
p
)
def
run_prog
(
batch_size
):
params
=
{}
for
key
,
value
in
p
.
get_parameter_shapes
().
items
():
# convert to a static shape
if
value
.
dynamic
():
dds
=
value
.
dyn_dims
()
new_lens
=
[]
for
dd
in
dds
:
if
dd
.
is_fixed
():
new_lens
.
append
(
dd
.
min
)
else
:
new_lens
.
append
(
batch_size
)
s
=
migraphx
.
shape
(
type
=
value
.
type_string
(),
lens
=
new_lens
)
else
:
s
=
value
print
(
"Parameter {} -> {}"
.
format
(
key
,
s
))
params
[
key
]
=
migraphx
.
generate_argument
(
s
)
r
=
p
.
run
(
params
)
print
(
r
)
run_prog
(
1
)
run_prog
(
2
)
run_prog
(
3
)
run_prog
(
4
)
test_conv_relu
()
test_sub_uint64
()
test_neg_int64
()
test_fp16_imagescaler
()
test_if_pl
()
test_nonzero
()
test_dyn_batch
()
test/py/test_gpu_offload.py
View file @
cd4ab535
...
...
@@ -23,16 +23,53 @@
#####################################################################################
import
migraphx
p
=
migraphx
.
parse_onnx
(
"conv_relu_maxpool_test.onnx"
)
print
(
p
)
print
(
"Compiling ..."
)
p
.
compile
(
migraphx
.
get_target
(
"gpu"
),
offload_copy
=
False
)
print
(
p
)
params
=
{}
for
key
,
value
in
p
.
get_parameter_shapes
().
items
():
def
test_conv_relu
():
p
=
migraphx
.
parse_onnx
(
"conv_relu_maxpool_test.onnx"
)
print
(
p
)
print
(
"Compiling ..."
)
p
.
compile
(
migraphx
.
get_target
(
"gpu"
),
offload_copy
=
False
)
print
(
p
)
params
=
{}
for
key
,
value
in
p
.
get_parameter_shapes
().
items
():
print
(
"Parameter {} -> {}"
.
format
(
key
,
value
))
params
[
key
]
=
migraphx
.
to_gpu
(
migraphx
.
generate_argument
(
value
))
r
=
migraphx
.
from_gpu
(
p
.
run
(
params
)[
-
1
])
print
(
r
)
r
=
migraphx
.
from_gpu
(
p
.
run
(
params
)[
-
1
])
print
(
r
)
# TODO: placeholder until tuple shapes and arguments exposed
#def test_dyn_batch():
# a = migraphx.shape.dynamic_dimension(1, 4, {2, 4})
# b = migraphx.shape.dynamic_dimension(3, 3)
# c = migraphx.shape.dynamic_dimension(32, 32)
# dd_map = {"0": [a, b, c, c]}
# p = migraphx.parse_onnx("conv_relu_maxpool_test.onnx",
# map_dyn_input_dims=dd_map)
# print(p)
# print("Compiling ...")
# p.compile(migraphx.get_target("gpu"), offload_copy=False)
#
# print(p)
#
# def run_prog(batch_size):
# params = {}
# for key, value in p.get_parameter_shapes().items():
# print("Parameter {} -> {}".format(key, value))
# params[key] = migraphx.to_gpu(
# migraphx.generate_argument(value.to_static(batch_size)))
#
# print("before_output")
# outputs = p.run(params)
# print(outputs)
# r = migraphx.from_gpu(p.run(params)[-1])
# print(r)
#
# run_prog(1)
# run_prog(2)
# run_prog(3)
# run_prog(4)
test_conv_relu
()
test/py/test_instruction.py
0 → 100755
View file @
cd4ab535
#####################################################################################
# The MIT License (MIT)
#
# Copyright (c) 2015-2022 Advanced Micro Devices, Inc. All rights reserved.
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
#####################################################################################
import
migraphx
def
test_instruction_shape
():
p
=
migraphx
.
program
()
mm
=
p
.
get_main_module
()
input_shape
=
migraphx
.
shape
(
lens
=
[
4
,
4
,
64
],
type
=
"half_type"
)
i
=
mm
.
add_parameter
(
"x"
,
input_shape
)
i2
=
mm
.
add_instruction
(
migraphx
.
op
(
"reshape"
,
dims
=
[
16
,
64
]),
[
i
])
out_shape
=
i2
.
shape
()
assert
out_shape
.
lens
()
==
[
16
,
64
]
assert
out_shape
.
strides
()
==
[
64
,
1
]
assert
out_shape
.
type_string
()
==
"half_type"
def
test_instruction_op
():
p
=
migraphx
.
program
()
mm
=
p
.
get_main_module
()
input_shape
=
migraphx
.
shape
(
lens
=
[
2
,
24
])
i
=
mm
.
add_parameter
(
"x"
,
input_shape
)
i2
=
mm
.
add_instruction
(
migraphx
.
op
(
"relu"
),
[
i
])
out_op
=
i2
.
op
()
assert
out_op
.
name
()
==
"relu"
if
__name__
==
"__main__"
:
test_instruction_shape
()
test_instruction_op
()
test/py/test_shape.py
View file @
cd4ab535
...
...
@@ -29,6 +29,7 @@ def test_create_shape():
assert
s
.
standard
()
assert
s
.
packed
()
assert
s
.
lens
()
==
[
1
,
64
,
3
,
3
]
assert
s
.
ndim
()
==
4
def
test_create_shape_broadcast
():
...
...
@@ -49,7 +50,48 @@ def test_create_shape_type():
assert
s
.
type_size
()
==
4
def
test_create_dyn_dims
():
a
=
migraphx
.
shape
.
dynamic_dimension
()
assert
a
.
is_fixed
()
assert
a
.
min
==
0
b
=
migraphx
.
shape
.
dynamic_dimension
(
4
,
4
)
assert
b
.
is_fixed
()
assert
b
.
max
==
4
c
=
migraphx
.
shape
.
dynamic_dimension
(
1
,
4
,
{
2
,
4
})
assert
not
c
.
is_fixed
()
assert
c
.
min
==
1
assert
c
.
max
==
4
assert
c
.
optimals
==
{
2
,
4
}
dyn_dims
=
[
a
,
b
]
dyn_dims
.
append
(
c
)
assert
dyn_dims
[
1
]
==
b
def
test_create_dyn_shape
():
a
=
migraphx
.
shape
.
dynamic_dimension
(
1
,
4
,
{
2
,
4
})
b
=
migraphx
.
shape
.
dynamic_dimension
(
4
,
4
)
dds
=
[
a
,
b
]
dyn_shape
=
migraphx
.
shape
(
type
=
'float'
,
dyn_dims
=
dds
)
assert
dyn_shape
.
dynamic
()
assert
dyn_shape
.
dyn_dims
()[
0
].
min
==
dds
[
0
].
min
assert
dyn_shape
.
dyn_dims
()[
0
].
max
==
dds
[
0
].
max
assert
dyn_shape
.
dyn_dims
()[
0
].
optimals
==
dds
[
0
].
optimals
def
test_type_enum
():
mgx_types
=
[
'bool_type'
,
'double_type'
,
'float_type'
,
'half_type'
,
'int16_type'
,
'int32_type'
,
'int64_type'
,
'int8_type'
,
'uint16_type'
,
'uint32_type'
,
'uint64_type'
,
'uint8_type'
]
for
t
in
mgx_types
:
assert
hasattr
(
migraphx
.
shape
.
type_t
,
t
)
if
__name__
==
"__main__"
:
test_create_shape
()
test_create_shape_broadcast
()
test_create_shape_type
()
test_create_dyn_dims
()
test_create_dyn_shape
()
test/ref_dot_op_test.cpp
View file @
cd4ab535
...
...
@@ -1197,7 +1197,7 @@ TEST_CASE(dot_dyn_2D_test)
{
migraphx
::
program
p
;
auto
*
mm
=
p
.
get_main_module
();
migraphx
::
shape
a_shape
{
migraphx
::
shape
::
float_type
,
{{
1
,
4
,
0
},
{
5
,
5
,
0
}}};
migraphx
::
shape
a_shape
{
migraphx
::
shape
::
float_type
,
{{
1
,
4
},
{
5
,
5
}}};
auto
ap
=
mm
->
add_parameter
(
"a"
,
a_shape
);
migraphx
::
shape
b_shape
{
migraphx
::
shape
::
float_type
,
{
5
,
3
}};
auto
bp
=
mm
->
add_parameter
(
"b"
,
b_shape
);
...
...
@@ -1250,8 +1250,7 @@ TEST_CASE(dot_dyn_4D_test)
migraphx
::
program
p
;
auto
*
mm
=
p
.
get_main_module
();
migraphx
::
shape
a_shape
{
migraphx
::
shape
::
float_type
,
{{
1
,
1
,
0
},
{
1
,
1
,
0
},
{
4
,
6
,
4
},
{
5
,
5
,
0
}}};
migraphx
::
shape
a_shape
{
migraphx
::
shape
::
float_type
,
{{
1
,
1
},
{
1
,
1
},
{
4
,
6
,
{
4
}},
{
5
,
5
}}};
auto
al
=
mm
->
add_parameter
(
"a"
,
a_shape
);
migraphx
::
shape
b_shape
{
migraphx
::
shape
::
float_type
,
{
1
,
1
,
5
,
3
}};
auto
bl
=
mm
->
add_parameter
(
"b"
,
b_shape
);
...
...
test/ref_ops_test.cpp
View file @
cd4ab535
...
...
@@ -64,7 +64,7 @@ TEST_CASE(abs_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
s
{
migraphx
::
shape
::
float_type
,
{{
2
,
8
,
0
},
{
2
,
2
,
0
}}};
migraphx::shape s{migraphx::shape::float_type, {{2, 8}, {2, 2}}};
auto input = mm->add_parameter("X", s);
mm->add_instruction(migraphx::make_op("abs"), input);
p.compile(migraphx::make_target("ref"));
...
...
@@ -102,7 +102,7 @@ TEST_CASE(acos_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
::
dynamic_dimension
dd
{
3
,
8
,
0
};
migraphx::shape::dynamic_dimension dd{3, 8};
migraphx::shape s{migraphx::shape::float_type, {dd}};
auto input = mm->add_parameter("X", s);
mm->add_instruction(migraphx::make_op("acos"), input);
...
...
@@ -143,7 +143,7 @@ TEST_CASE(acosh_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
::
dynamic_dimension
dd
{
3
,
8
,
0
};
migraphx::shape::dynamic_dimension dd{3, 8};
migraphx::shape s{migraphx::shape::float_type, {dd}};
auto input = mm->add_parameter("X", s);
std::vector<float> input_data{1.1f, 1.2f, 2.0f};
...
...
@@ -230,7 +230,7 @@ TEST_CASE(add_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
std
::
vector
<
migraphx
::
shape
::
dynamic_dimension
>
dd
{{
2
,
6
,
0
}};
std::vector<migraphx::shape::dynamic_dimension> dd{{2, 6}};
migraphx::shape s{migraphx::shape::float_type, dd};
auto x = mm->add_parameter("x", s);
auto y = mm->add_parameter("y", s);
...
...
@@ -330,7 +330,7 @@ TEST_CASE(argmax_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
s
{
migraphx
::
shape
::
float_type
,
{{
2
,
2
,
0
},
{
3
,
6
,
0
},
{
3
,
6
,
0
}}};
migraphx::shape s{migraphx::shape::float_type, {{2, 2}, {3, 6}, {3, 6}}};
auto dl = mm->add_parameter("X", s);
mm->add_instruction(migraphx::make_op("argmax", {{"axis", 0}}), dl);
p.compile(migraphx::make_target("ref"));
...
...
@@ -446,7 +446,7 @@ TEST_CASE(asin_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
::
dynamic_dimension
dd
{
3
,
8
,
0
};
migraphx::shape::dynamic_dimension dd{3, 8};
migraphx::shape s{migraphx::shape::float_type, {dd}};
auto input = mm->add_parameter("X", s);
mm->add_instruction(migraphx::make_op("asin"), input);
...
...
@@ -487,7 +487,7 @@ TEST_CASE(asinh_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
::
dynamic_dimension
dd
{
3
,
8
,
0
};
migraphx::shape::dynamic_dimension dd{3, 8};
migraphx::shape s{migraphx::shape::float_type, {dd}};
auto input = mm->add_parameter("X", s);
mm->add_instruction(migraphx::make_op("asinh"), input);
...
...
@@ -528,7 +528,7 @@ TEST_CASE(atan_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
::
dynamic_dimension
dd
{
3
,
8
,
0
};
migraphx::shape::dynamic_dimension dd{3, 8};
migraphx::shape s{migraphx::shape::float_type, {dd}};
auto input = mm->add_parameter("X", s);
mm->add_instruction(migraphx::make_op("atan"), input);
...
...
@@ -569,7 +569,7 @@ TEST_CASE(atanh_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
::
dynamic_dimension
dd
{
3
,
8
,
0
};
migraphx::shape::dynamic_dimension dd{3, 8};
migraphx::shape s{migraphx::shape::float_type, {dd}};
auto input = mm->add_parameter("X", s);
mm->add_instruction(migraphx::make_op("atanh"), input);
...
...
@@ -615,7 +615,7 @@ TEST_CASE(avgpool_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
auto
s
=
migraphx
::
shape
{
migraphx
::
shape
::
float_type
,
{{
1
,
4
,
0
},
{
3
,
3
,
0
},
{
4
,
4
,
0
}}};
auto s = migraphx::shape{migraphx::shape::float_type, {{1, 4}, {3, 3}, {4, 4}}};
auto x = mm->add_parameter("X", s);
mm->add_instruction(migraphx::make_op("pooling",
{{"mode", migraphx::op::pooling_mode::average},
...
...
@@ -767,7 +767,7 @@ TEST_CASE(broadcast_2in_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
a_shape
{
migraphx
::
shape
::
int32_type
,
{{
2
,
2
,
0
},
{
2
,
4
,
0
}}};
migraphx::shape a_shape{migraphx::shape::int32_type, {{2, 2}, {2, 4}}};
migraphx::shape b_shape{migraphx::shape::int32_type, {2}};
std::vector<int32_t> b_data{-2, -3};
uint64_t axis = 0;
...
...
@@ -810,7 +810,7 @@ TEST_CASE(ceil_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
::
dynamic_dimension
dd
{
4
,
12
,
0
};
migraphx::shape::dynamic_dimension dd{4, 12};
migraphx::shape s{migraphx::shape::float_type, {dd}};
auto input = mm->add_parameter("X", s);
mm->add_instruction(migraphx::make_op("ceil"), input);
...
...
@@ -958,9 +958,9 @@ TEST_CASE(concat_dyn_test)
migraphx::program p;
auto* mm = p.get_main_module();
int axis = 0;
migraphx
::
shape
s0
{
migraphx
::
shape
::
int32_type
,
{{
2
,
4
,
2
},
{
2
,
3
,
2
}}};
migraphx
::
shape
s1
{
migraphx
::
shape
::
int32_type
,
{{
3
,
4
,
4
},
{
2
,
3
,
2
}}};
migraphx
::
shape
s2
{
migraphx
::
shape
::
int32_type
,
{{
1
,
5
,
3
},
{
2
,
3
,
2
}}};
migraphx::shape s0{migraphx::shape::int32_type, {{2, 4,
{2}
}, {2, 3,
{2}
}}};
migraphx::shape s1{migraphx::shape::int32_type, {{3, 4,
{4}
}, {2, 3,
{2}
}}};
migraphx::shape s2{migraphx::shape::int32_type, {{1, 5,
{3}
}, {2, 3,
{2}
}}};
auto input0 = mm->add_parameter("X", s0);
auto input1 = mm->add_parameter("Y", s1);
...
...
@@ -1039,8 +1039,7 @@ TEST_CASE(contiguous_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
dyn_shape
{
migraphx
::
shape
::
float_type
,
{{
1
,
1
,
0
},
{
2
,
6
,
0
},
{
2
,
2
,
0
},
{
2
,
2
,
0
}}};
migraphx::shape dyn_shape{migraphx::shape::float_type, {{1, 1}, {2, 6}, {2, 2}, {2, 2}}};
auto input = mm->add_parameter("X", dyn_shape);
mm->add_instruction(migraphx::make_op("contiguous"), input);
p.compile(migraphx::make_target("ref"));
...
...
@@ -1068,7 +1067,7 @@ TEST_CASE(conv_dyn_batch_test)
auto* mm = p.get_main_module();
migraphx::shape input_dyn_shape{migraphx::shape::float_type,
{{
1
,
100
,
0
},
{
3
,
3
,
0
},
{
4
,
4
,
0
},
{
4
,
4
,
0
}}};
{{1, 100}, {3, 3}, {4, 4}, {4, 4}}};
migraphx::shape weights_shape{migraphx::shape::float_type, {2, 3, 3, 3}};
auto input = mm->add_parameter("X", input_dyn_shape);
...
...
@@ -1133,50 +1132,6 @@ TEST_CASE(conv_dyn_batch_test)
result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
EXPECT(migraphx::verify_range(results_vector, sol));
a
=
{
2.71567607
,
-
0.9960829
,
0.91671127
,
0.28140706
,
0.63235772
,
0.08077253
,
0.80927712
,
-
0.59108931
,
-
1.05421555
,
-
2.76622486
,
-
0.85044265
,
-
0.52049929
,
0.67726439
,
-
0.65290606
,
0.02345525
,
-
0.33579525
,
0.38901961
,
1.05473483
,
-
1.31188095
,
1.8963089
,
-
0.07265259
,
0.947339
,
0.41949373
,
-
0.70814759
,
0.25892952
,
1.07311416
,
1.2571274
,
-
0.62318051
,
-
0.19951548
,
-
0.94232577
,
-
0.29393643
,
0.42292568
,
-
0.80230367
,
1.40909171
,
0.63617158
,
0.13900366
,
1.09253144
,
-
0.15265895
,
1.54781747
,
0.72780299
,
1.09189606
,
-
0.38068101
,
0.97057933
,
-
0.58958799
,
1.56188643
,
0.21474874
,
0.58725154
,
-
1.27097559
,
-
0.03024297
,
1.09437096
,
-
0.4897908
,
0.34838957
,
-
1.31042492
,
-
1.69069934
,
0.86956722
,
-
0.40457946
,
0.46691212
,
1.29273605
,
0.26464137
,
0.22073045
,
-
1.02178168
,
0.22163901
,
-
1.84387338
,
0.75522131
,
-
0.45775682
,
-
0.42241111
,
-
1.50944722
,
1.07256448
,
-
1.95876884
,
-
0.28106022
,
0.3341668
,
2.13129425
,
-
1.14728117
,
-
1.06555498
,
-
0.298444
,
-
0.88322699
,
-
0.65866792
,
-
2.06007552
,
0.01374334
,
0.45612028
,
0.52715492
,
1.01914406
,
-
1.72659791
,
0.80650896
,
0.16860051
,
2.24112225
,
-
0.78620857
,
0.36566174
,
-
0.07020134
,
-
0.47976932
,
-
0.68230027
,
-
0.94711417
,
-
0.54506505
,
1.66504931
,
-
0.71860826
,
0.61132306
};
c
=
{
-
0.14601797
,
-
0.13000923
,
0.06521662
,
0.06178288
,
-
0.11083675
,
0.10154136
,
0.09990512
,
0.06030385
,
-
0.11374587
,
-
0.17523311
,
-
0.14344215
,
0.17802463
,
0.06300922
,
-
0.15325832
,
0.07066704
,
0.05166031
,
0.00615084
,
-
0.02606523
,
0.08083995
,
-
0.17913306
,
0.0624622
,
0.0735731
,
-
0.04198661
,
-
0.0164391
,
-
0.06374192
,
0.16569914
,
0.10681538
,
0.07370754
,
0.02802075
,
0.00282027
,
0.15104802
,
-
0.11084409
,
-
0.00197773
,
0.07924436
,
0.03528272
,
0.04765259
,
-
0.15896152
,
0.07917164
,
0.12125669
,
-
0.1154705
,
-
0.11999125
,
0.12749968
,
-
0.06269585
,
0.18658121
,
-
0.03944227
,
0.0111798
,
-
0.17731084
,
0.11789055
,
-
0.09982193
,
0.08142821
,
0.0729029
,
0.11303909
,
0.12735154
,
0.03885292
};
sol
=
{
-
0.20817225
,
0.87965256
,
0.14958936
,
-
1.24887264
,
-
0.06540672
,
0.20778663
,
0.40456355
,
-
0.99900877
};
migraphx
::
shape
input_fixed_shape1
{
migraphx
::
shape
::
float_type
,
{
1
,
3
,
4
,
4
}};
migraphx
::
parameter_map
params1
;
params1
[
"X"
]
=
migraphx
::
argument
(
input_fixed_shape1
,
a
.
data
());
params1
[
"W"
]
=
migraphx
::
argument
(
weights_shape
,
c
.
data
());
result
=
p
.
eval
(
params1
).
back
();
result
.
visit
([
&
](
auto
output
)
{
results_vector
.
assign
(
output
.
begin
(),
output
.
end
());
});
EXPECT
(
migraphx
::
verify_range
(
results_vector
,
sol
));
}
TEST_CASE(conv_dyn_img_shape_test)
...
...
@@ -1184,8 +1139,7 @@ TEST_CASE(conv_dyn_img_shape_test)
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
input_dyn_shape
{
migraphx
::
shape
::
float_type
,
{{
1
,
1
,
0
},
{
3
,
3
,
0
},
{
4
,
6
,
0
},
{
4
,
6
,
0
}}};
migraphx::shape input_dyn_shape{migraphx::shape::float_type, {{1, 1}, {3, 3}, {4, 6}, {4, 6}}};
migraphx::shape weights_shape{migraphx::shape::float_type, {1, 3, 3, 3}};
auto input = mm->add_parameter("X", input_dyn_shape);
...
...
@@ -1274,8 +1228,7 @@ TEST_CASE(conv_dyn_weights_shape_test)
auto* mm = p.get_main_module();
migraphx::shape input_shape{migraphx::shape::float_type, {1, 3, 4, 4}};
migraphx
::
shape
weights_shape
{
migraphx
::
shape
::
float_type
,
{{
1
,
1
,
0
},
{
3
,
3
,
0
},
{
2
,
3
,
0
},
{
2
,
3
,
0
}}};
migraphx::shape weights_shape{migraphx::shape::float_type, {{1, 1}, {3, 3}, {2, 3}, {2, 3}}};
auto input = mm->add_parameter("X", input_shape);
auto weights = mm->add_parameter("W", weights_shape);
...
...
@@ -1350,8 +1303,7 @@ TEST_CASE(conv_dyn_img_same_upper_test)
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
input_dyn_shape
{
migraphx
::
shape
::
float_type
,
{{
1
,
1
,
0
},
{
3
,
3
,
0
},
{
4
,
6
,
0
},
{
4
,
6
,
0
}}};
migraphx::shape input_dyn_shape{migraphx::shape::float_type, {{1, 1}, {3, 3}, {4, 6}, {4, 6}}};
migraphx::shape weights_shape{migraphx::shape::float_type, {1, 3, 3, 3}};
auto input = mm->add_parameter("X", input_dyn_shape);
...
...
@@ -1422,8 +1374,7 @@ TEST_CASE(conv_dyn_kernel_same_upper_test)
auto* mm = p.get_main_module();
migraphx::shape input_shape{migraphx::shape::float_type, {1, 3, 4, 4}};
migraphx
::
shape
weights_shape
{
migraphx
::
shape
::
float_type
,
{{
1
,
1
,
0
},
{
3
,
3
,
0
},
{
2
,
3
,
0
},
{
2
,
3
,
0
}}};
migraphx::shape weights_shape{migraphx::shape::float_type, {{1, 1}, {3, 3}, {2, 3}, {2, 3}}};
auto input = mm->add_parameter("X", input_shape);
auto weights = mm->add_parameter("W", weights_shape);
...
...
@@ -1496,8 +1447,7 @@ TEST_CASE(conv_dyn_kernel_same_lower_test)
auto* mm = p.get_main_module();
migraphx::shape input_shape{migraphx::shape::float_type, {1, 3, 4, 4}};
migraphx
::
shape
weights_shape
{
migraphx
::
shape
::
float_type
,
{{
1
,
1
,
0
},
{
3
,
3
,
0
},
{
2
,
3
,
0
},
{
2
,
3
,
0
}}};
migraphx::shape weights_shape{migraphx::shape::float_type, {{1, 1}, {3, 3}, {2, 3}, {2, 3}}};
auto input = mm->add_parameter("X", input_shape);
auto weights = mm->add_parameter("W", weights_shape);
...
...
@@ -1839,7 +1789,7 @@ TEST_CASE(cos_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
::
dynamic_dimension
dd
{
3
,
8
,
0
};
migraphx::shape::dynamic_dimension dd{3, 8};
migraphx::shape s{migraphx::shape::float_type, {dd}};
auto input = mm->add_parameter("X", s);
mm->add_instruction(migraphx::make_op("cos"), input);
...
...
@@ -1880,7 +1830,7 @@ TEST_CASE(cosh_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
::
dynamic_dimension
dd
{
3
,
8
,
0
};
migraphx::shape::dynamic_dimension dd{3, 8};
migraphx::shape s{migraphx::shape::float_type, {dd}};
auto input = mm->add_parameter("X", s);
mm->add_instruction(migraphx::make_op("cosh"), input);
...
...
@@ -1899,6 +1849,80 @@ TEST_CASE(cosh_dyn_test)
EXPECT(migraphx::verify_range(results_vector, gold));
}
TEST_CASE(convert_nan_upcast_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx::shape s{migraphx::shape::half_type, {2, 2}};
std::vector<migraphx::half> data(4, std::numeric_limits<migraphx::half>::quiet_NaN());
auto l = mm->add_literal(migraphx::literal{s, data});
mm->add_instruction(
migraphx::make_op("convert", {{"target_type", migraphx::shape::float_type}}), l);
p.compile(migraphx::make_target("ref"));
auto result = p.eval({}).back();
std::vector<float> results_vector(4, -1);
result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
EXPECT(std::all_of(
results_vector.begin(), results_vector.end(), [](const auto& x) { return std::isnan(x); }));
}
TEST_CASE(convert_nan_downcast_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx::shape s{migraphx::shape::double_type, {2, 2}};
std::vector<double> data(4, std::numeric_limits<double>::quiet_NaN());
auto l = mm->add_literal(migraphx::literal{s, data});
mm->add_instruction(
migraphx::make_op("convert", {{"target_type", migraphx::shape::float_type}}), l);
p.compile(migraphx::make_target("ref"));
auto result = p.eval({}).back();
std::vector<float> results_vector(4, -1);
result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
EXPECT(std::all_of(
results_vector.begin(), results_vector.end(), [](const auto& x) { return std::isnan(x); }));
}
TEST_CASE(convert_nan_double_convert_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx::shape s{migraphx::shape::double_type, {2, 2}};
std::vector<double> data(4, std::numeric_limits<double>::quiet_NaN());
auto l = mm->add_literal(migraphx::literal{s, data});
auto f_l = mm->add_instruction(
migraphx::make_op("convert", {{"target_type", migraphx::shape::float_type}}), l);
mm->add_instruction(migraphx::make_op("convert", {{"target_type", migraphx::shape::half_type}}),
f_l);
p.compile(migraphx::make_target("ref"));
auto result = p.eval({}).back();
std::vector<migraphx::half> results_vector(4);
result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
EXPECT(std::all_of(
results_vector.begin(), results_vector.end(), [](const auto& x) { return std::isnan(x); }));
}
TEST_CASE(convert_nan_convert_updown_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx::shape s{migraphx::shape::float_type, {2, 2}};
std::vector<float> data(4, std::numeric_limits<float>::quiet_NaN());
auto l = mm->add_literal(migraphx::literal{s, data});
auto f_l = mm->add_instruction(
migraphx::make_op("convert", {{"target_type", migraphx::shape::float_type}}), l);
auto h_l = mm->add_instruction(
migraphx::make_op("convert", {{"target_type", migraphx::shape::half_type}}), f_l);
mm->add_instruction(
migraphx::make_op("convert", {{"target_type", migraphx::shape::float_type}}), h_l);
p.compile(migraphx::make_target("ref"));
auto result = p.eval({}).back();
std::vector<float> results_vector(4);
result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
EXPECT(std::all_of(
results_vector.begin(), results_vector.end(), [](const auto& x) { return std::isnan(x); }));
}
TEST_CASE(deconv_1d_test)
{
migraphx::shape s{migraphx::shape::float_type, {1, 1, 3}};
...
...
@@ -2071,7 +2095,7 @@ TEST_CASE(div_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
std
::
vector
<
migraphx
::
shape
::
dynamic_dimension
>
dd
{{
2
,
6
,
3
}};
std::vector<migraphx::shape::dynamic_dimension> dd{{2, 6,
{3}
}};
migraphx::shape s{migraphx::shape::float_type, dd};
auto x = mm->add_parameter("x", s);
auto y = mm->add_parameter("y", s);
...
...
@@ -2113,7 +2137,7 @@ TEST_CASE(elu_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
::
dynamic_dimension
dd
{
3
,
8
,
0
};
migraphx::shape::dynamic_dimension dd{3, 8};
migraphx::shape s{migraphx::shape::float_type, {dd}};
auto input = mm->add_parameter("X", s);
float alpha = 0.5;
...
...
@@ -2184,7 +2208,7 @@ TEST_CASE(equal_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
std
::
vector
<
migraphx
::
shape
::
dynamic_dimension
>
dd
{{
6
,
12
,
9
}};
std::vector<migraphx::shape::dynamic_dimension> dd{{6, 12,
{9}
}};
migraphx::shape s{migraphx::shape::float_type, dd};
auto p0 = mm->add_parameter("l", s);
auto p1 = mm->add_parameter("r", s);
...
...
@@ -2231,7 +2255,7 @@ TEST_CASE(erf_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
::
dynamic_dimension
dd
{
3
,
8
,
0
};
migraphx::shape::dynamic_dimension dd{3, 8};
migraphx::shape s{migraphx::shape::float_type, {dd}};
auto input = mm->add_parameter("X", s);
mm->add_instruction(migraphx::make_op("erf"), input);
...
...
@@ -2272,7 +2296,7 @@ TEST_CASE(exp_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
::
dynamic_dimension
dd
{
3
,
8
,
0
};
migraphx::shape::dynamic_dimension dd{3, 8};
migraphx::shape s{migraphx::shape::float_type, {dd}};
auto input = mm->add_parameter("X", s);
mm->add_instruction(migraphx::make_op("exp"), input);
...
...
@@ -2313,7 +2337,7 @@ TEST_CASE(floor_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
::
dynamic_dimension
dd
{
5
,
12
,
0
};
migraphx::shape::dynamic_dimension dd{5, 12};
migraphx::shape s{migraphx::shape::float_type, {dd}};
auto input = mm->add_parameter("X", s);
mm->add_instruction(migraphx::make_op("floor"), input);
...
...
@@ -2564,7 +2588,7 @@ TEST_CASE(gather_dyn_test0)
// Dynamic data, static indices
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
s
{
migraphx
::
shape
::
int32_type
,
{{
2
,
5
,
0
},
{
3
,
3
,
0
}}};
migraphx::shape s{migraphx::shape::int32_type, {{2, 5}, {3, 3}}};
auto x = mm->add_parameter("x", s);
std::vector<int> indices{1, 2};
...
...
@@ -2573,7 +2597,7 @@ TEST_CASE(gather_dyn_test0)
auto ind = mm->add_parameter("indices", s_ind);
mm->add_instruction(migraphx::make_op("gather", {{"axis", 1}}), x, ind);
migraphx
::
shape
sresult
{
migraphx
::
shape
::
int32_type
,
{{
2
,
5
,
0
},
{
1
,
1
,
0
},
{
2
,
2
,
0
}}};
migraphx::shape sresult{migraphx::shape::int32_type, {{2, 5}, {1, 1}, {2, 2}}};
EXPECT(p.get_output_shapes().back() == sresult);
p.compile(migraphx::make_target("ref"));
...
...
@@ -2599,15 +2623,15 @@ TEST_CASE(gather_dyn_test1)
// Dynamic data, dynamic indices
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
s
{
migraphx
::
shape
::
int32_type
,
{{
2
,
5
,
0
},
{
4
,
4
,
0
}}};
migraphx::shape s{migraphx::shape::int32_type, {{2, 5}, {4, 4}}};
auto x = mm->add_parameter("x", s);
migraphx
::
shape
s_ind
{
migraphx
::
shape
::
int32_type
,
{{
1
,
8
,
7
},
{
2
,
3
,
3
}}};
migraphx::shape s_ind{migraphx::shape::int32_type, {{1, 8,
{7}
}, {2, 3,
{3}
}}};
auto ind = mm->add_parameter("indices", s_ind);
mm->add_instruction(migraphx::make_op("gather", {{"axis", 0}}), x, ind);
migraphx
::
shape
sresult
{
migraphx
::
shape
::
int32_type
,
{{
1
,
8
,
7
},
{
2
,
3
,
3
},
{
4
,
4
,
0
}}};
migraphx::shape sresult{migraphx::shape::int32_type, {{1, 8,
{7}
}, {2, 3,
{3}
}, {4, 4}}};
EXPECT(p.get_output_shapes().back() == sresult);
p.compile(migraphx::make_target("ref"));
...
...
@@ -2787,7 +2811,7 @@ TEST_CASE(gathernd_dynamic0)
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
ds
{
migraphx
::
shape
::
float_type
,
{{
2
,
2
,
2
},
{
3
,
3
,
0
},
{
1
,
1
,
0
}}};
migraphx::shape ds{migraphx::shape::float_type, {{2, 2,
{2}
}, {3, 3}, {1, 1}}};
migraphx::shape is{migraphx::shape::int64_type, {2, 2, 1}};
auto xdata = mm->add_parameter("X", ds);
...
...
@@ -2824,7 +2848,7 @@ TEST_CASE(gathernd_dynamic1)
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
ds
{
migraphx
::
shape
::
float_type
,
{{
2
,
5
,
2
},
{
1
,
5
,
0
},
{
1
,
5
,
0
}}};
migraphx::shape ds{migraphx::shape::float_type, {{2, 5,
{2}
}, {1, 5}, {1, 5}}};
migraphx::shape is{migraphx::shape::int64_type, {2, 2, 1}};
auto xdata = mm->add_parameter("X", ds);
...
...
@@ -2860,8 +2884,8 @@ TEST_CASE(gathernd_dynamic2)
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
ds
{
migraphx
::
shape
::
float_type
,
{{
2
,
5
,
2
},
{
1
,
5
,
0
},
{
1
,
5
,
0
}}};
migraphx
::
shape
is
{
migraphx
::
shape
::
int64_type
,
{{
2
,
5
,
3
},
{
2
,
3
,
3
},
{
1
,
1
}}};
migraphx::shape ds{migraphx::shape::float_type, {{2, 5,
{2}
}, {1, 5}, {1, 5}}};
migraphx::shape is{migraphx::shape::int64_type, {{2, 5,
{3}
}, {2, 3,
{3}
}, {1, 1}}};
auto xdata = mm->add_parameter("X", ds);
auto xindex = mm->add_parameter("I", is);
...
...
@@ -2897,7 +2921,7 @@ TEST_CASE(gathernd_dynamic3)
auto* mm = p.get_main_module();
migraphx::shape ds{migraphx::shape::float_type, {2, 3, 1}};
migraphx
::
shape
is
{
migraphx
::
shape
::
int64_type
,
{{
2
,
5
,
3
},
{
2
,
3
,
3
},
{
1
,
1
}}};
migraphx::shape is{migraphx::shape::int64_type, {{2, 5,
{3}
}, {2, 3,
{3}
}, {1, 1}}};
auto xdata = mm->add_parameter("X", ds);
auto xindex = mm->add_parameter("I", is);
...
...
@@ -2932,8 +2956,7 @@ TEST_CASE(gathernd_dynamic4)
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
ds
{
migraphx
::
shape
::
float_type
,
{
migraphx
::
shape
::
dynamic_dimension
({
2
,
2
,
0
})}};
migraphx::shape ds{migraphx::shape::float_type, {migraphx::shape::dynamic_dimension({2, 2})}};
migraphx::shape is{migraphx::shape::int64_type, {1}};
auto xdata = mm->add_parameter("X", ds);
...
...
@@ -3034,8 +3057,7 @@ TEST_CASE(globalavgpool_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
auto
s
=
migraphx
::
shape
{
migraphx
::
shape
::
float_type
,
{{
1
,
1
,
0
},
{
3
,
3
,
0
},
{
2
,
6
,
0
},
{
2
,
6
,
2
}}};
auto s = migraphx::shape{migraphx::shape::float_type, {{1, 1}, {3, 3}, {2, 6}, {2, 6, {2}}}};
auto x = mm->add_parameter("X", s);
mm->add_instruction(
migraphx::make_op("pooling",
...
...
@@ -3081,7 +3103,7 @@ TEST_CASE(globallppool_dyn_test)
migraphx::program p;
auto* mm = p.get_main_module();
auto s =
migraphx
::
shape
{
migraphx
::
shape
::
float_type
,
{{
1
,
1
,
0
},
{
3
,
3
,
0
},
{
2
,
6
,
2
},
{
2
,
6
,
2
}}};
migraphx::shape{migraphx::shape::float_type, {{1, 1}, {3, 3}, {2, 6,
{2}
}, {2, 6,
{2}
}}};
auto x = mm->add_parameter("X", s);
mm->add_instruction(
migraphx::make_op("pooling",
...
...
@@ -3126,7 +3148,7 @@ TEST_CASE(globalmaxpool_dyn_test)
migraphx::program p;
auto* mm = p.get_main_module();
auto s =
migraphx
::
shape
{
migraphx
::
shape
::
float_type
,
{{
1
,
1
,
0
},
{
3
,
3
,
0
},
{
2
,
6
,
2
},
{
2
,
6
,
2
}}};
migraphx::shape{migraphx::shape::float_type, {{1, 1}, {3, 3}, {2, 6,
{2}
}, {2, 6,
{2}
}}};
auto x = mm->add_parameter("X", s);
mm->add_instruction(
migraphx::make_op("pooling",
...
...
@@ -3198,7 +3220,7 @@ TEST_CASE(greater_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
std
::
vector
<
migraphx
::
shape
::
dynamic_dimension
>
dd
{{
8
,
10
,
9
}};
std::vector<migraphx::shape::dynamic_dimension> dd{{8, 10,
{9}
}};
migraphx::shape s{migraphx::shape::float_type, dd};
auto left = mm->add_parameter("l", s);
auto right = mm->add_parameter("r", s);
...
...
@@ -3242,7 +3264,7 @@ TEST_CASE(identity_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
s
{
migraphx
::
shape
::
float_type
,
{{
2
,
4
,
0
},
{
2
,
4
,
0
}}};
migraphx::shape s{migraphx::shape::float_type, {{2, 4}, {2, 4}}};
auto input = mm->add_parameter("X", s);
mm->add_instruction(migraphx::make_op("identity"), input);
p.compile(migraphx::make_target("ref"));
...
...
@@ -3488,7 +3510,7 @@ TEST_CASE(isnan_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
s
{
migraphx
::
shape
::
float_type
,
{{
2
,
2
,
0
},
{
3
,
8
,
0
}}};
migraphx::shape s{migraphx::shape::float_type, {{2, 2}, {3, 8}}};
auto input = mm->add_parameter("X", s);
auto nan_val = std::numeric_limits<float>::quiet_NaN();
mm->add_instruction(migraphx::make_op("isnan"), input);
...
...
@@ -3807,7 +3829,7 @@ TEST_CASE(less_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
std
::
vector
<
migraphx
::
shape
::
dynamic_dimension
>
dd
{{
8
,
10
,
9
}};
std::vector<migraphx::shape::dynamic_dimension> dd{{8, 10,
{9}
}};
migraphx::shape s{migraphx::shape::float_type, dd};
auto left = mm->add_parameter("l", s);
auto right = mm->add_parameter("r", s);
...
...
@@ -3859,7 +3881,7 @@ TEST_CASE(log_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
::
dynamic_dimension
dd
{
3
,
8
,
0
};
migraphx::shape::dynamic_dimension dd{3, 8};
migraphx::shape s{migraphx::shape::float_type, {dd}};
auto input = mm->add_parameter("X", s);
mm->add_instruction(migraphx::make_op("log"), input);
...
...
@@ -3904,7 +3926,7 @@ TEST_CASE(logical_and_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
std
::
vector
<
migraphx
::
shape
::
dynamic_dimension
>
dd
{{
2
,
6
,
4
}};
std::vector<migraphx::shape::dynamic_dimension> dd{{2, 6,
{4}
}};
migraphx::shape s{migraphx::shape::bool_type, dd};
auto left = mm->add_parameter("l", s);
auto right = mm->add_parameter("r", s);
...
...
@@ -3955,7 +3977,7 @@ TEST_CASE(logical_or_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
std
::
vector
<
migraphx
::
shape
::
dynamic_dimension
>
dd
{{
2
,
6
,
4
}};
std::vector<migraphx::shape::dynamic_dimension> dd{{2, 6,
{4}
}};
migraphx::shape s{migraphx::shape::bool_type, dd};
auto left = mm->add_parameter("l", s);
auto right = mm->add_parameter("r", s);
...
...
@@ -4006,7 +4028,7 @@ TEST_CASE(logical_xor_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
std
::
vector
<
migraphx
::
shape
::
dynamic_dimension
>
dd
{{
2
,
6
,
4
}};
std::vector<migraphx::shape::dynamic_dimension> dd{{2, 6,
{4}
}};
migraphx::shape s{migraphx::shape::bool_type, dd};
auto left = mm->add_parameter("l", s);
auto right = mm->add_parameter("r", s);
...
...
@@ -4227,7 +4249,7 @@ TEST_CASE(lppool_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
auto
s
=
migraphx
::
shape
{
migraphx
::
shape
::
float_type
,
{{
1
,
4
,
0
},
{
3
,
3
,
0
},
{
4
,
4
,
0
}}};
auto s = migraphx::shape{migraphx::shape::float_type, {{1, 4}, {3, 3}, {4, 4}}};
auto x = mm->add_parameter("X", s);
mm->add_instruction(migraphx::make_op("pooling",
{{"mode", migraphx::op::pooling_mode::lpnorm},
...
...
@@ -4294,7 +4316,7 @@ TEST_CASE(max_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
std
::
vector
<
migraphx
::
shape
::
dynamic_dimension
>
dd
{{
2
,
6
,
0
}};
std::vector<migraphx::shape::dynamic_dimension> dd{{2, 6}};
migraphx::shape s{migraphx::shape::float_type, dd};
auto x = mm->add_parameter("x", s);
auto y = mm->add_parameter("y", s);
...
...
@@ -4497,7 +4519,7 @@ TEST_CASE(maxpool_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
auto
s
=
migraphx
::
shape
{
migraphx
::
shape
::
float_type
,
{{
1
,
4
,
0
},
{
3
,
3
,
0
},
{
4
,
4
,
0
}}};
auto s = migraphx::shape{migraphx::shape::float_type, {{1, 4}, {3, 3}, {4, 4}}};
auto x = mm->add_parameter("X", s);
mm->add_instruction(migraphx::make_op("pooling",
{{"mode", migraphx::op::pooling_mode::max},
...
...
@@ -4540,7 +4562,7 @@ TEST_CASE(min_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
std
::
vector
<
migraphx
::
shape
::
dynamic_dimension
>
dd
{{
2
,
6
,
0
}};
std::vector<migraphx::shape::dynamic_dimension> dd{{2, 6}};
migraphx::shape s{migraphx::shape::float_type, dd};
auto x = mm->add_parameter("x", s);
auto y = mm->add_parameter("y", s);
...
...
@@ -4586,7 +4608,7 @@ TEST_CASE(fmod_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
std
::
vector
<
migraphx
::
shape
::
dynamic_dimension
>
dd
{{
2
,
6
,
0
}};
std::vector<migraphx::shape::dynamic_dimension> dd{{2, 6}};
migraphx::shape s{migraphx::shape::float_type, dd};
auto x = mm->add_parameter("x", s);
auto y = mm->add_parameter("y", s);
...
...
@@ -4651,7 +4673,7 @@ TEST_CASE(mod_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
std
::
vector
<
migraphx
::
shape
::
dynamic_dimension
>
dd
{{
2
,
6
,
0
}};
std::vector<migraphx::shape::dynamic_dimension> dd{{2, 6}};
migraphx::shape s{migraphx::shape::float_type, dd};
auto x = mm->add_parameter("x", s);
auto y = mm->add_parameter("y", s);
...
...
@@ -4720,7 +4742,7 @@ TEST_CASE(mul_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
std
::
vector
<
migraphx
::
shape
::
dynamic_dimension
>
dd
{{
2
,
6
,
0
}};
std::vector<migraphx::shape::dynamic_dimension> dd{{2, 6}};
migraphx::shape s{migraphx::shape::float_type, dd};
auto x = mm->add_parameter("x", s);
auto y = mm->add_parameter("y", s);
...
...
@@ -4790,7 +4812,7 @@ TEST_CASE(multibroadcast_2in_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
a_shape
{
migraphx
::
shape
::
int32_type
,
{{
2
,
4
,
0
},
{
2
,
2
,
0
}}};
migraphx::shape a_shape{migraphx::shape::int32_type, {{2, 4}, {2, 2}}};
migraphx::shape b_shape{migraphx::shape::int32_type, {2}};
std::vector<int32_t> b_data{-2, -3};
auto l1 = mm->add_parameter("a", a_shape);
...
...
@@ -4810,6 +4832,39 @@ TEST_CASE(multibroadcast_2in_dyn_test)
EXPECT(output(1, 1) == -3);
}
TEST_CASE(multibroadcast_3in_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx::shape a_shape{migraphx::shape::int32_type, {{2, 4}, {2, 2}}};
migraphx::shape b_shape{migraphx::shape::int32_type, {2}};
migraphx::shape c_shape{migraphx::shape::int32_type, {{1, 4, {2, 4}}, {2, 4}, {2, 2}}};
auto l1 = mm->add_parameter("a", a_shape);
std::vector<int32_t> b_data{-2, -3};
auto l2 = mm->add_literal(migraphx::literal{b_shape, b_data});
auto l3 = mm->add_parameter("c", c_shape);
mm->add_instruction(migraphx::make_op("multibroadcast"), l2, l1, l3);
p.compile(migraphx::make_target("ref"));
std::vector<int32_t> a_data(4, 0);
std::vector<int32_t> c_data(8, 0);
migraphx::parameter_map params;
migraphx::shape input_fixed_shape_a{migraphx::shape::float_type, {2, 2}};
migraphx::shape input_fixed_shape_c{migraphx::shape::float_type, {2, 2, 2}};
params["a"] = migraphx::argument(input_fixed_shape_a, a_data.data());
params["c"] = migraphx::argument(input_fixed_shape_c, c_data.data());
auto result = p.eval(params).back();
auto output = result.get<int32_t>();
EXPECT(output(0, 0, 0) == -2);
EXPECT(output(0, 0, 1) == -3);
EXPECT(output(0, 1, 0) == -2);
EXPECT(output(0, 1, 1) == -3);
EXPECT(output(1, 0, 0) == -2);
EXPECT(output(1, 0, 1) == -3);
EXPECT(output(1, 1, 0) == -2);
EXPECT(output(1, 1, 1) == -3);
}
TEST_CASE(multinomial_test)
{
migraphx::program p;
...
...
@@ -4882,7 +4937,7 @@ TEST_CASE(neg_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
s
{
migraphx
::
shape
::
float_type
,
{{
2
,
4
,
0
},
{
3
,
3
,
0
}}};
migraphx::shape s{migraphx::shape::float_type, {{2, 4}, {3, 3}}};
auto input = mm->add_parameter("X", s);
auto ret = mm->add_instruction(migraphx::make_op("neg"), input);
mm->add_return({ret});
...
...
@@ -4939,9 +4994,9 @@ TEST_CASE(nms_dyn_batch_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
boxes_s
{
migraphx
::
shape
::
float_type
,
{{
1
,
3
,
0
},
{
6
,
6
,
0
},
{
4
,
4
,
0
}}};
migraphx::shape boxes_s{migraphx::shape::float_type, {{1, 3}, {6, 6}, {4, 4}}};
migraphx
::
shape
scores_s
{
migraphx
::
shape
::
float_type
,
{{
1
,
3
,
0
},
{
1
,
1
,
0
},
{
6
,
6
,
0
}}};
migraphx::shape scores_s{migraphx::shape::float_type, {{1, 3}, {1, 1}, {6, 6}}};
auto boxes_p = mm->add_parameter("boxes", boxes_s);
auto scores_p = mm->add_parameter("scores", scores_s);
...
...
@@ -4985,9 +5040,9 @@ TEST_CASE(nms_dyn_boxes_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
boxes_s
{
migraphx
::
shape
::
float_type
,
{{
1
,
1
,
0
},
{
4
,
20
,
0
},
{
4
,
4
,
0
}}};
migraphx::shape boxes_s{migraphx::shape::float_type, {{1, 1}, {4, 20}, {4, 4}}};
migraphx
::
shape
scores_s
{
migraphx
::
shape
::
float_type
,
{{
1
,
1
,
0
},
{
1
,
1
,
0
},
{
4
,
20
,
0
}}};
migraphx::shape scores_s{migraphx::shape::float_type, {{1, 1}, {1, 1}, {4, 20}}};
auto boxes_p = mm->add_parameter("boxes", boxes_s);
auto scores_p = mm->add_parameter("scores", scores_s);
...
...
@@ -5028,9 +5083,9 @@ TEST_CASE(nms_dyn_classes_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
boxes_s
{
migraphx
::
shape
::
float_type
,
{{
1
,
1
,
0
},
{
6
,
6
,
0
},
{
4
,
4
,
0
}}};
migraphx::shape boxes_s{migraphx::shape::float_type, {{1, 1}, {6, 6}, {4, 4}}};
migraphx
::
shape
scores_s
{
migraphx
::
shape
::
float_type
,
{{
1
,
1
,
0
},
{
1
,
3
,
0
},
{
6
,
6
,
0
}}};
migraphx::shape scores_s{migraphx::shape::float_type, {{1, 1}, {1, 3}, {6, 6}}};
auto boxes_p = mm->add_parameter("boxes", boxes_s);
auto scores_p = mm->add_parameter("scores", scores_s);
...
...
@@ -5274,7 +5329,7 @@ TEST_CASE(not_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
::
dynamic_dimension
dd
{
3
,
8
,
0
};
migraphx::shape::dynamic_dimension dd{3, 8};
migraphx::shape s{migraphx::shape::float_type, {dd}};
auto input = mm->add_parameter("X", s);
mm->add_instruction(migraphx::make_op("not"), input);
...
...
@@ -5363,7 +5418,7 @@ TEST_CASE(pad_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
s
{
migraphx
::
shape
::
float_type
,
{{
2
,
4
,
2
},
{
2
,
4
,
2
}}};
migraphx::shape s{migraphx::shape::float_type, {{2, 4,
{2}
}, {2, 4,
{2}
}}};
auto x = mm->add_parameter("x", s);
mm->add_instruction(migraphx::make_op("pad", {{"pads", {1, 1, 1, 1}}}), x);
p.compile(migraphx::make_target("ref"));
...
...
@@ -5827,7 +5882,7 @@ TEST_CASE(prelu_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
std
::
vector
<
migraphx
::
shape
::
dynamic_dimension
>
dd
{{
2
,
6
,
0
}};
std::vector<migraphx::shape::dynamic_dimension> dd{{2, 6}};
migraphx::shape s{migraphx::shape::float_type, dd};
auto x = mm->add_parameter("x", s);
auto slope = mm->add_parameter("slope", s);
...
...
@@ -6028,7 +6083,7 @@ TEST_CASE(recip_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
::
dynamic_dimension
dd
{
3
,
8
,
0
};
migraphx::shape::dynamic_dimension dd{3, 8};
migraphx::shape s{migraphx::shape::float_type, {dd}};
auto input = mm->add_parameter("X", s);
mm->add_instruction(migraphx::make_op("recip"), input);
...
...
@@ -6065,7 +6120,7 @@ TEST_CASE(reduce_max_dynamic_axis0)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
s
{
migraphx
::
shape
::
float_type
,
{{
2
,
4
,
2
},
{
3
,
5
,
3
}}};
migraphx::shape s{migraphx::shape::float_type, {{2, 4,
{2}
}, {3, 5,
{3}
}}};
auto input = mm->add_parameter("X", s);
auto reduce_max_op = migraphx::make_op("reduce_max", {{"axes", {0}}});
mm->add_instruction(reduce_max_op, input);
...
...
@@ -6357,7 +6412,7 @@ TEST_CASE(relu_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
::
dynamic_dimension
dd
{
3
,
8
,
0
};
migraphx::shape::dynamic_dimension dd{3, 8};
migraphx::shape s{migraphx::shape::float_type, {dd}};
auto input = mm->add_parameter("X", s);
mm->add_instruction(migraphx::make_op("relu"), input);
...
...
@@ -6429,7 +6484,7 @@ TEST_CASE(reshape_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
s
{
migraphx
::
shape
::
float_type
,
{{
1
,
4
,
0
},
{
24
,
24
,
0
},
{
1
,
1
,
0
},
{
1
,
1
,
0
}}};
migraphx::shape s{migraphx::shape::float_type, {{1, 4}, {24, 24}, {1, 1}, {1, 1}}};
std::vector<int64_t> new_shape = {0, 8, 3, 1};
auto input = mm->add_parameter("X", s);
mm->add_instruction(migraphx::make_op("reshape", {{"dims", new_shape}}), input);
...
...
@@ -6691,7 +6746,7 @@ TEST_CASE(round_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
::
dynamic_dimension
dd
{
4
,
10
,
0
};
migraphx::shape::dynamic_dimension dd{4, 10};
migraphx::shape s{migraphx::shape::float_type, {dd}};
auto input = mm->add_parameter("X", s);
mm->add_instruction(migraphx::make_op("round"), input);
...
...
@@ -6727,7 +6782,7 @@ TEST_CASE(rsqrt_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
::
dynamic_dimension
dd
{
3
,
8
,
0
};
migraphx::shape::dynamic_dimension dd{3, 8};
migraphx::shape s{migraphx::shape::float_type, {dd}};
auto input = mm->add_parameter("X", s);
mm->add_instruction(migraphx::make_op("rsqrt"), input);
...
...
@@ -7466,10 +7521,10 @@ TEST_CASE(scatternd_reduction_dyn_test)
auto* mm = p.get_main_module();
auto dtype = migraphx::shape::float_type;
auto itype = migraphx::shape::int64_type;
migraphx
::
shape
::
dynamic_dimension
dd
{
3
,
6
,
0
};
migraphx::shape::dynamic_dimension dd{3, 6};
migraphx::shape ds{migraphx::shape::float_type, {dd, dd, dd}};
migraphx::shape is{itype, {2, 1}};
migraphx
::
shape
us
{
dtype
,
{{
2
,
2
,
0
},
dd
,
dd
}};
migraphx::shape us{dtype, {{2, 2}, dd, dd}};
auto xdata = mm->add_parameter("X", ds);
auto xindex = mm->add_parameter("I", is);
...
...
@@ -7523,7 +7578,7 @@ TEST_CASE(sigmoid_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
s
{
migraphx
::
shape
::
float_type
,
{{
2
,
4
,
0
},
{
2
,
2
,
0
}}};
migraphx::shape s{migraphx::shape::float_type, {{2, 4}, {2, 2}}};
auto input = mm->add_parameter("X", s);
mm->add_instruction(migraphx::make_op("sigmoid"), input);
p.compile(migraphx::make_target("ref"));
...
...
@@ -7559,7 +7614,7 @@ TEST_CASE(sign_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
::
dynamic_dimension
dd
{
3
,
8
,
0
};
migraphx::shape::dynamic_dimension dd{3, 8};
migraphx::shape s{migraphx::shape::float_type, {dd}};
auto input = mm->add_parameter("X", s);
mm->add_instruction(migraphx::make_op("sign"), input);
...
...
@@ -7598,7 +7653,7 @@ TEST_CASE(sin_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
::
dynamic_dimension
dd
{
3
,
8
,
0
};
migraphx::shape::dynamic_dimension dd{3, 8};
migraphx::shape s{migraphx::shape::float_type, {dd}};
auto input = mm->add_parameter("X", s);
mm->add_instruction(migraphx::make_op("sin"), input);
...
...
@@ -7639,7 +7694,7 @@ TEST_CASE(sinh_dynamic_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
s
{
migraphx
::
shape
::
float_type
,
{{
2
,
4
,
0
},
{
2
,
4
,
0
}}};
migraphx::shape s{migraphx::shape::float_type, {{2, 4}, {2, 4}}};
auto input = mm->add_parameter("X", s);
std::vector<float> input_data{-1.0, 2.0, -3.0, 4.0};
mm->add_instruction(migraphx::make_op("sinh"), input);
...
...
@@ -7705,15 +7760,15 @@ TEST_CASE(slice_test)
TEST_CASE(slice_dyn_test0)
{
// Slice a single dynamic dimension. ax1 slice limits are smaller than min; ax2 "ends" is
too
// large
// Slice a single dynamic dimension. ax1 slice limits are smaller than min; ax2 "ends" is
//
too
large
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
s
{
migraphx
::
shape
::
int32_type
,
{{
2
,
3
,
0
},
{
2
,
2
,
0
},
{
3
,
3
,
0
}}};
migraphx::shape s{migraphx::shape::int32_type, {{2, 3}, {2, 2}, {3, 3}}};
auto x = mm->add_parameter("x", s);
mm->add_instruction(
migraphx::make_op("slice", {{"axes", {1, 2}}, {"starts", {0, 1}}, {"ends", {1, 6}}}), x);
migraphx
::
shape
s2
{
migraphx
::
shape
::
int32_type
,
{{
2
,
3
,
0
},
{
1
,
1
,
0
},
{
2
,
2
,
0
}}};
migraphx::shape s2{migraphx::shape::int32_type, {{2, 3}, {1, 1}, {2, 2}}};
EXPECT(p.get_output_shapes().back() == s2);
p.compile(migraphx::make_target("ref"));
...
...
@@ -7740,14 +7795,14 @@ TEST_CASE(slice_dyn_test1)
// Slice all three dynamic dimensions
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
s
{
migraphx
::
shape
::
int32_type
,
{{
2
,
2
,
0
},
{
2
,
2
,
0
},
{
3
,
3
,
0
}}};
migraphx::shape s{migraphx::shape::int32_type, {{2, 2}, {2, 2}, {3, 3}}};
auto x = mm->add_parameter("x", s);
mm->add_instruction(
migraphx::make_op("slice",
{{"axes", {0, 1, 2}}, {"starts", {0, 0, 0}}, {"ends", {2, 2, 2}}}),
x);
migraphx
::
shape
s2
{
migraphx
::
shape
::
int32_type
,
{{
2
,
2
,
0
},
{
2
,
2
,
0
},
{
2
,
2
,
0
}}};
migraphx::shape s2{migraphx::shape::int32_type, {{2, 2}, {2, 2}, {2, 2}}};
EXPECT(p.get_output_shapes().back() == s2);
p.compile(migraphx::make_target("ref"));
migraphx::shape sresult{migraphx::shape::int32_type, {2, 2, 2}, {6, 3, 1}};
...
...
@@ -7847,7 +7902,7 @@ TEST_CASE(softmax_dyn_test)
migraphx::program p;
auto* mm = p.get_main_module();
migraphx::shape a_shape{migraphx::shape::float_type,
{{
1
,
10
,
0
},
{
1
,
3
,
3
},
{
4
,
4
,
0
},
{
2
,
2
,
2
}}};
{{1, 10}, {1, 3,
{3}
}, {4, 4}, {2, 2,
{2}
}}};
auto al = mm->add_parameter("a", a_shape);
mm->add_instruction(migraphx::make_op("softmax", {{"axis", 1}}), al);
p.compile(migraphx::make_target("ref"));
...
...
@@ -7925,7 +7980,7 @@ TEST_CASE(sqdiff_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
std
::
vector
<
migraphx
::
shape
::
dynamic_dimension
>
dd
{{
2
,
6
,
0
}};
std::vector<migraphx::shape::dynamic_dimension> dd{{2, 6}};
migraphx::shape s{migraphx::shape::float_type, dd};
auto x = mm->add_parameter("x", s);
auto y = mm->add_parameter("y", s);
...
...
@@ -7967,7 +8022,7 @@ TEST_CASE(sqrt_dynamic_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
::
dynamic_dimension
dd
{
3
,
8
,
0
};
migraphx::shape::dynamic_dimension dd{3, 8};
migraphx::shape s{migraphx::shape::float_type, {dd}};
auto input = mm->add_parameter("X", s);
std::vector<float> input_data{1.02481645, 0.85643062, 0.03404123, 0.92791926, 0.10569184};
...
...
@@ -8031,8 +8086,7 @@ TEST_CASE(squeeze_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
s1
{
migraphx
::
shape
::
float_type
,
{{
1
,
4
,
0
},
{
1
,
1
,
0
},
{
3
,
3
,
0
},
{
1
,
1
,
0
},
{
3
,
3
,
0
}}};
migraphx::shape s1{migraphx::shape::float_type, {{1, 4}, {1, 1}, {3, 3}, {1, 1}, {3, 3}}};
auto p0 = mm->add_parameter("x", s1);
mm->add_instruction(migraphx::make_op("squeeze", {{"axes", {1}}}), p0);
p.compile(migraphx::make_target("ref"));
...
...
@@ -8103,7 +8157,7 @@ TEST_CASE(sub_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
std
::
vector
<
migraphx
::
shape
::
dynamic_dimension
>
dd
{{
2
,
6
,
0
}};
std::vector<migraphx::shape::dynamic_dimension> dd{{2, 6}};
migraphx::shape s{migraphx::shape::float_type, dd};
auto x = mm->add_parameter("x", s);
auto y = mm->add_parameter("y", s);
...
...
@@ -8145,7 +8199,7 @@ TEST_CASE(tan_dynamic_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
::
dynamic_dimension
dd
{
3
,
8
,
0
};
migraphx::shape::dynamic_dimension dd{3, 8};
migraphx::shape s{migraphx::shape::float_type, {dd}};
auto input = mm->add_parameter("X", s);
std::vector<float> input_data{-1, 0, 1};
...
...
@@ -8186,7 +8240,7 @@ TEST_CASE(tanh_dynamic_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
::
dynamic_dimension
dd
{
3
,
8
,
0
};
migraphx::shape::dynamic_dimension dd{3, 8};
migraphx::shape s{migraphx::shape::float_type, {dd}};
auto input = mm->add_parameter("X", s);
std::vector<float> input_data{-1.0, 2.0, -3.0, 4.0};
...
...
@@ -8294,7 +8348,7 @@ TEST_CASE(transpose_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
s
{
migraphx
::
shape
::
float_type
,
{{
1
,
4
,
0
},
{
2
,
2
,
0
},
{
2
,
2
,
0
},
{
3
,
3
,
0
}}};
migraphx::shape s{migraphx::shape::float_type, {{1, 4}, {2, 2}, {2, 2}, {3, 3}}};
auto l = mm->add_parameter("X", s);
std::vector<int64_t> perm = {0, 3, 1, 2};
mm->add_instruction(migraphx::make_op("transpose", {{"permutation", perm}}), l);
...
...
@@ -8349,7 +8403,7 @@ TEST_CASE(unsqueeze_dyn_test)
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
s1
{
migraphx
::
shape
::
float_type
,
{{
1
,
4
,
0
},
{
3
,
3
,
0
},
{
3
,
3
,
0
}}};
migraphx::shape s1{migraphx::shape::float_type, {{1, 4}, {3, 3}, {3, 3}}};
auto p0 = mm->add_parameter("x", s1);
mm->add_instruction(migraphx::make_op("unsqueeze", {{"axes", {1}}}), p0);
p.compile(migraphx::make_target("ref"));
...
...
@@ -8394,8 +8448,8 @@ TEST_CASE(where_dyn_test)
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx
::
shape
sb
{
migraphx
::
shape
::
bool_type
,
{{
2
,
3
,
0
},
{
2
,
3
,
0
}}};
migraphx
::
shape
sx
{
migraphx
::
shape
::
float_type
,
{{
2
,
3
,
0
},
{
2
,
3
,
0
}}};
migraphx::shape sb{migraphx::shape::bool_type, {{2, 3}, {2, 3}}};
migraphx::shape sx{migraphx::shape::float_type, {{2, 3}, {2, 3}}};
auto lb = mm->add_parameter("predicate", sb);
auto lx = mm->add_parameter("X", sx);
...
...
test/rewrite_quantization_test.cpp
View file @
cd4ab535
...
...
@@ -33,12 +33,20 @@
#include <migraphx/make_op.hpp>
#include <migraphx/serialize.hpp>
#include <migraphx/verify.hpp>
#include <migraphx/pass_manager.hpp>
bool
is_quantizelinear
(
migraphx
::
instruction
&
ins
)
{
return
ins
.
name
()
==
"quantizelinear"
;
}
bool
is_dequantizelinear
(
migraphx
::
instruction
&
ins
)
{
return
ins
.
name
()
==
"dequantizelinear"
;
}
void
run_pass
(
migraphx
::
module
&
m
)
{
migraphx
::
run_passes
(
m
,
{
migraphx
::
rewrite_quantization
{}});
}
migraphx
::
argument
eval
(
const
migraphx
::
program
&
p
)
{
auto
r
=
p
.
eval
({});
EXPECT
(
r
.
size
()
==
1
);
return
r
.
front
();
}
TEST_CASE
(
quantizelinear
)
{
...
...
@@ -58,8 +66,8 @@ TEST_CASE(quantizelinear)
migraphx
::
program
p1
=
create_program
();
migraphx
::
program
p2
=
create_program
();
migraphx
::
rewrite_quantization
opt
;
opt
.
apply
(
*
p2
.
get_main_module
(
));
run_pass
(
*
p2
.
get_main_module
())
;
EXPECT
(
eval
(
p1
)
==
eval
(
p2
));
EXPECT
(
any_of
(
*
p1
.
get_main_module
(),
&
is_quantizelinear
));
EXPECT
(
none_of
(
*
p2
.
get_main_module
(),
&
is_quantizelinear
));
}
...
...
@@ -71,8 +79,8 @@ TEST_CASE(dequantizelinear)
std
::
vector
<
float
>
xv
=
{
0
,
1
,
2
,
5
,
10
,
50
,
100
,
150
,
250
};
migraphx
::
shape
ss
{
migraphx
::
shape
::
float_type
,
{
1
,
3
,
3
}};
std
::
vector
<
float
>
sv
=
{
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
};
migraphx
::
shape
zs
{
migraphx
::
shape
::
uint8
_type
,
{
1
,
3
,
3
}};
std
::
vector
<
uint8_
t
>
zv
=
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
};
migraphx
::
shape
zs
{
migraphx
::
shape
::
float
_type
,
{
1
,
3
,
3
}};
std
::
vector
<
floa
t
>
zv
=
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
};
auto
create_program
=
[
&
]()
{
migraphx
::
program
p
;
auto
*
mm
=
p
.
get_main_module
();
...
...
@@ -86,8 +94,8 @@ TEST_CASE(dequantizelinear)
migraphx
::
program
p1
=
create_program
();
migraphx
::
program
p2
=
create_program
();
migraphx
::
rewrite_quantization
opt
;
opt
.
apply
(
*
p2
.
get_main_module
(
));
run_pass
(
*
p2
.
get_main_module
())
;
EXPECT
(
eval
(
p1
)
==
eval
(
p2
));
EXPECT
(
any_of
(
*
p1
.
get_main_module
(),
&
is_dequantizelinear
));
EXPECT
(
none_of
(
*
p2
.
get_main_module
(),
&
is_dequantizelinear
));
}
...
...
test/run_on_target_test.cpp
0 → 100644
View file @
cd4ab535
/*
* The MIT License (MIT)
*
* Copyright (c) 2015-2022 Advanced Micro Devices, Inc. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#include <migraphx/program.hpp>
#include <migraphx/module.hpp>
#include <migraphx/literal.hpp>
#include <migraphx/instruction.hpp>
#include <migraphx/verify.hpp>
#include <migraphx/shape.hpp>
#include <migraphx/make_op.hpp>
#include <migraphx/register_target.hpp>
#include "test.hpp"
TEST_CASE
(
run_on_target_shape_tests
)
{
{
test
::
throws
([]()
{
migraphx
::
make_op
(
"run_on_target"
);
});
}
{
migraphx
::
program
p
;
auto
s
=
migraphx
::
shape
{
migraphx
::
shape
::
float_type
,
{
12
,
12
}};
auto
*
mm
=
p
.
get_main_module
();
auto
x
=
mm
->
add_parameter
(
"x"
,
s
);
auto
*
run_mod
=
p
.
create_module
(
"run_mod"
);
run_mod
->
add_return
({
x
,
x
});
test
::
throws
(
[
&
]()
{
mm
->
add_instruction
(
migraphx
::
make_op
(
"run_on_target"
),
{
x
},
{
run_mod
});
});
test
::
throws
([
&
]()
{
mm
->
add_instruction
(
migraphx
::
make_op
(
"run_on_target"
),
{
x
},
{
run_mod
,
run_mod
});
});
}
}
TEST_CASE
(
eval_run_on_target
)
{
migraphx
::
program
p
;
auto
*
mm
=
p
.
get_main_module
();
migraphx
::
shape
s
{
migraphx
::
shape
::
float_type
,
{
3
}};
auto
l
=
mm
->
add_literal
(
migraphx
::
literal
{
s
,
{
4.0
,
16.0
,
64.0
}});
auto
*
ref_mod
=
p
.
create_module
(
"ref_mod"
);
auto
ref_rsqrt
=
ref_mod
->
add_instruction
(
migraphx
::
make_op
(
"rsqrt"
),
l
);
ref_mod
->
add_return
({
ref_rsqrt
});
auto
run_on_ins
=
mm
->
add_instruction
(
migraphx
::
make_op
(
"run_on_target"
,
{{
"target_id"
,
0
}}),
{},
{
ref_mod
});
mm
->
add_instruction
(
migraphx
::
make_op
(
"get_tuple_elem"
,
{{
"index"
,
0
}}),
run_on_ins
);
p
.
compile
({
migraphx
::
make_target
(
"ref"
)});
auto
result
=
p
.
eval
({}).
back
();
std
::
vector
<
float
>
results_vector
(
3
);
result
.
visit
([
&
](
auto
output
)
{
results_vector
.
assign
(
output
.
begin
(),
output
.
end
());
});
std
::
vector
<
float
>
gold
=
{
0.5
,
0.25
,
0.125
};
EXPECT
(
migraphx
::
verify_range
(
results_vector
,
gold
));
}
int
main
(
int
argc
,
const
char
*
argv
[])
{
test
::
run
(
argc
,
argv
);
}
test/shape_test.cpp
View file @
cd4ab535
...
...
@@ -30,6 +30,7 @@
#include <array>
#include <algorithm>
#include <numeric>
#include <migraphx/verify.hpp>
#include "test.hpp"
TEST_CASE
(
test_shape_default
)
...
...
@@ -41,22 +42,13 @@ TEST_CASE(test_shape_default)
TEST_CASE
(
test_dyn_4arg_constructor
)
{
migraphx
::
shape
s
{
migraphx
::
shape
::
float_type
,
{
1
,
4
,
4
,
},
{
4
,
4
,
4
,
},
{
0
,
0
,
0
}};
std
::
vector
<
migraphx
::
shape
::
dynamic_dimension
>
expected_dyn_dims
=
{
{
1
,
4
,
0
},
{
4
,
4
,
0
},
{
4
,
4
,
0
}};
EXPECT
(
s
.
dynamic
());
EXPECT
(
s
.
dyn_dims
()
==
expected_dyn_dims
);
migraphx
::
shape
s0
{
migraphx
::
shape
::
float_type
,
{
1
,
4
,
4
},
{
4
,
4
,
4
},
{{},
{},
{}}};
migraphx
::
shape
s1
{
migraphx
::
shape
::
float_type
,
{
1
,
4
,
4
},
{
4
,
4
,
4
},
{}};
std
::
vector
<
migraphx
::
shape
::
dynamic_dimension
>
expected_dyn_dims
=
{{
1
,
4
},
{
4
,
4
},
{
4
,
4
}};
EXPECT
(
s0
.
dynamic
());
EXPECT
(
s0
.
dyn_dims
()
==
expected_dyn_dims
);
EXPECT
(
s1
.
dynamic
());
EXPECT
(
s1
.
dyn_dims
()
==
expected_dyn_dims
);
}
TEST_CASE
(
test_shape_assign
)
...
...
@@ -85,17 +77,26 @@ TEST_CASE(test_shape_standard)
EXPECT
(
not
s
.
broadcasted
());
}
TEST_CASE
(
test_shape_standard_singleton_dim
)
{
migraphx
::
shape
s
{
migraphx
::
shape
::
float_type
,
{
5
,
1
,
8
},
{
8
,
4
,
1
}};
EXPECT
(
s
.
standard
());
EXPECT
(
s
.
packed
());
EXPECT
(
not
s
.
transposed
());
EXPECT
(
not
s
.
broadcasted
());
}
TEST_CASE
(
test_shape_min_max_opt
)
{
migraphx
::
shape
s
{
migraphx
::
shape
::
float_type
,
{
2
,
2
,
3
},
{
6
,
3
,
1
}};
EXPECT
(
s
.
min_lens
()
==
s
.
lens
());
EXPECT
(
s
.
max_lens
()
==
s
.
lens
());
EXPECT
(
s
.
opt_lens
()
==
s
.
lens
());
EXPECT
(
s
.
opt_lens
()
.
empty
());
}
TEST_CASE
(
test_shape_dynamic_fixed
)
{
migraphx
::
shape
s
{
migraphx
::
shape
::
float_type
,
{{
2
,
2
,
0
},
{
2
,
2
,
0
},
{
3
,
3
,
0
}}};
migraphx
::
shape
s
{
migraphx
::
shape
::
float_type
,
{{
2
,
2
},
{
2
,
2
},
{
3
,
3
}}};
EXPECT
(
not
s
.
standard
());
EXPECT
(
not
s
.
packed
());
EXPECT
(
not
s
.
transposed
());
...
...
@@ -106,7 +107,8 @@ TEST_CASE(test_shape_dynamic_fixed)
EXPECT
(
not
s
.
dyn_dims
().
at
(
0
).
has_optimal
());
EXPECT
(
s
.
min_lens
()
==
std
::
vector
<
std
::
size_t
>
{
2
,
2
,
3
});
EXPECT
(
s
.
max_lens
()
==
std
::
vector
<
std
::
size_t
>
{
2
,
2
,
3
});
EXPECT
(
s
.
opt_lens
()
==
std
::
vector
<
std
::
size_t
>
{
0
,
0
,
0
});
std
::
vector
<
std
::
set
<
std
::
size_t
>>
e_opt_lens
=
{{},
{},
{}};
EXPECT
(
s
.
opt_lens
()
==
e_opt_lens
);
EXPECT
(
s
.
bytes
()
==
2
*
2
*
3
*
sizeof
(
float
));
}
...
...
@@ -114,8 +116,8 @@ TEST_CASE(test_shape_dynamic_not_fixed)
{
using
migraphx
::
shape
;
std
::
vector
<
shape
::
dynamic_dimension
>
dims
=
{};
dims
.
push_back
(
shape
::
dynamic_dimension
{
2
,
5
,
2
});
dims
.
push_back
(
shape
::
dynamic_dimension
{
2
,
8
,
0
});
dims
.
push_back
(
shape
::
dynamic_dimension
{
2
,
5
,
{
2
}
});
dims
.
push_back
(
shape
::
dynamic_dimension
{
2
,
8
});
migraphx
::
shape
s
{
migraphx
::
shape
::
float_type
,
dims
};
EXPECT
(
not
s
.
standard
());
EXPECT
(
not
s
.
packed
());
...
...
@@ -127,18 +129,16 @@ TEST_CASE(test_shape_dynamic_not_fixed)
EXPECT
(
s
.
dyn_dims
().
at
(
0
).
has_optimal
());
EXPECT
(
s
.
min_lens
()
==
std
::
vector
<
std
::
size_t
>
{
2
,
2
});
EXPECT
(
s
.
max_lens
()
==
std
::
vector
<
std
::
size_t
>
{
5
,
8
});
EXPECT
(
s
.
opt_lens
()
==
std
::
vector
<
std
::
size_t
>
{
2
,
0
});
EXPECT
(
s
.
opt_lens
()
==
std
::
vector
<
std
::
set
<
std
::
size_t
>
>
{
{
2
}
,
{}
});
EXPECT
(
s
.
bytes
()
==
5
*
8
*
sizeof
(
float
));
}
TEST_CASE
(
test_shape_dynamic_compares
)
{
using
migraphx
::
shape
;
auto
a
=
shape
::
dynamic_dimension
{
2
,
5
,
2
};
auto
b
=
a
;
auto
c
=
shape
::
dynamic_dimension
{
2
,
5
,
2
};
auto
d
=
shape
::
dynamic_dimension
{
3
,
8
,
4
};
EXPECT
(
a
==
b
);
auto
a
=
shape
::
dynamic_dimension
{
2
,
5
,
{
2
}};
auto
c
=
shape
::
dynamic_dimension
{
2
,
5
,
{
2
}};
auto
d
=
shape
::
dynamic_dimension
{
3
,
8
};
EXPECT
(
a
==
c
);
EXPECT
(
a
!=
d
);
...
...
@@ -163,13 +163,13 @@ TEST_CASE(test_shape_dynamic_compares)
TEST_CASE
(
dynamic_dimension_size_t_compares
)
{
using
migraphx
::
shape
;
auto
a
=
shape
::
dynamic_dimension
{
2
,
2
,
2
};
auto
a
=
shape
::
dynamic_dimension
{
2
,
2
,
{
2
}
};
EXPECT
(
a
==
2
);
EXPECT
(
a
!=
3
);
EXPECT
(
static_cast
<
std
::
size_t
>
(
2
)
==
a
);
EXPECT
(
static_cast
<
std
::
size_t
>
(
3
)
!=
a
);
auto
b
=
shape
::
dynamic_dimension
{
2
,
4
,
0
};
auto
b
=
shape
::
dynamic_dimension
{
2
,
4
};
EXPECT
(
b
!=
2
);
EXPECT
(
static_cast
<
std
::
size_t
>
(
2
)
!=
b
);
}
...
...
@@ -177,36 +177,50 @@ TEST_CASE(dynamic_dimension_size_t_compares)
TEST_CASE
(
dynamic_dimension_add_sub_fixed
)
{
using
migraphx
::
shape
;
auto
a
=
shape
::
dynamic_dimension
{
2
,
5
,
2
};
auto
a
=
shape
::
dynamic_dimension
{
2
,
5
,
{
2
}
};
a
+=
3
;
EXPECT
(
a
==
shape
::
dynamic_dimension
{
5
,
8
,
5
});
EXPECT
(
a
==
shape
::
dynamic_dimension
{
5
,
8
,
{
5
}
});
a
-=
3
;
EXPECT
(
a
==
shape
::
dynamic_dimension
{
2
,
5
,
2
});
EXPECT
(
a
==
shape
::
dynamic_dimension
{
2
,
5
,
{
2
}
});
auto
b
=
shape
::
dynamic_dimension
{
3
,
6
,
3
};
auto
b
=
shape
::
dynamic_dimension
{
3
,
6
,
{
3
}
};
EXPECT
((
a
+
1
)
==
b
);
EXPECT
((
1
+
a
)
==
b
);
EXPECT
((
b
-
1
)
==
a
);
auto
c
=
shape
::
dynamic_dimension
{
4
,
7
,
4
};
auto
c
=
shape
::
dynamic_dimension
{
4
,
7
,
{
4
}
};
EXPECT
((
a
+
2
)
==
c
);
EXPECT
((
2
+
a
)
==
c
);
EXPECT
((
c
-
2
)
==
a
);
auto
d
=
shape
::
dynamic_dimension
{
4
,
8
,
0
};
auto
e
=
shape
::
dynamic_dimension
{
2
,
6
,
0
};
auto
d
=
shape
::
dynamic_dimension
{
4
,
8
};
auto
e
=
shape
::
dynamic_dimension
{
2
,
6
};
EXPECT
((
d
-
2
)
==
e
);
EXPECT
((
e
+
2
)
==
d
);
EXPECT
((
2
+
e
)
==
d
);
}
TEST_CASE
(
dynamic_dimension_serialize
)
{
using
migraphx
::
shape
;
auto
a
=
shape
::
dynamic_dimension
{
2
,
5
,
{
2
,
3
}};
auto
b
=
shape
::
dynamic_dimension
{
3
,
6
,
{
3
}};
auto
v1
=
migraphx
::
to_value
(
a
);
auto
v2
=
migraphx
::
to_value
(
b
);
EXPECT
(
v1
!=
v2
);
auto
c
=
migraphx
::
from_value
<
shape
::
dynamic_dimension
>
(
v1
);
EXPECT
(
a
==
c
);
auto
d
=
migraphx
::
from_value
<
shape
::
dynamic_dimension
>
(
v2
);
EXPECT
(
b
==
d
);
}
TEST_CASE
(
test_shape_dynamic_errors
)
{
using
migraphx
::
shape
;
std
::
vector
<
shape
::
dynamic_dimension
>
dims
=
{};
dims
.
push_back
(
shape
::
dynamic_dimension
{
2
,
5
,
2
});
dims
.
push_back
(
shape
::
dynamic_dimension
{
2
,
8
,
0
});
dims
.
push_back
(
shape
::
dynamic_dimension
{
2
,
5
,
{
2
}
});
dims
.
push_back
(
shape
::
dynamic_dimension
{
2
,
8
});
migraphx
::
shape
s
{
shape
::
float_type
,
dims
};
EXPECT
(
test
::
throws
([
&
]
{
s
.
elements
();
}));
EXPECT
(
test
::
throws
([
&
]
{
s
.
index
({
0
,
1
});
}));
...
...
@@ -220,13 +234,13 @@ TEST_CASE(test_shape_dynamic_serialize)
{
using
migraphx
::
shape
;
std
::
vector
<
shape
::
dynamic_dimension
>
dims1
=
{};
dims1
.
push_back
(
shape
::
dynamic_dimension
{
2
,
5
,
2
});
dims1
.
push_back
(
shape
::
dynamic_dimension
{
2
,
8
,
0
});
dims1
.
push_back
(
shape
::
dynamic_dimension
{
2
,
5
,
{
2
}
});
dims1
.
push_back
(
shape
::
dynamic_dimension
{
2
,
8
});
migraphx
::
shape
s1
{
shape
::
float_type
,
dims1
};
auto
v1
=
migraphx
::
to_value
(
s1
);
std
::
vector
<
shape
::
dynamic_dimension
>
dims2
=
{};
dims2
.
push_back
(
shape
::
dynamic_dimension
{
2
,
5
,
2
});
dims2
.
push_back
(
shape
::
dynamic_dimension
{
2
,
5
,
{
2
}
});
migraphx
::
shape
s2
{
shape
::
uint64_type
,
dims2
};
auto
v2
=
migraphx
::
to_value
(
s2
);
EXPECT
(
v1
!=
v2
);
...
...
@@ -285,14 +299,13 @@ TEST_CASE(test_shape_ndim_static)
TEST_CASE
(
test_shape_ndim_dyn
)
{
migraphx
::
shape
s0
{
migraphx
::
shape
::
float_type
,
{{
2
,
2
,
0
},
{
2
,
2
,
0
}}};
migraphx
::
shape
s0
{
migraphx
::
shape
::
float_type
,
{{
2
,
2
},
{
2
,
2
}}};
EXPECT
(
s0
.
ndim
()
==
2
);
migraphx
::
shape
s1
{
migraphx
::
shape
::
float_type
,
{{
1
,
1
,
0
},
{
2
,
4
,
0
},
{
2
,
4
,
0
},
{
2
,
4
,
0
}}};
migraphx
::
shape
s1
{
migraphx
::
shape
::
float_type
,
{{
1
,
1
},
{
2
,
4
},
{
2
,
4
},
{
2
,
4
}}};
EXPECT
(
s1
.
ndim
()
==
4
);
migraphx
::
shape
s2
{
migraphx
::
shape
::
float_type
,
{{
1
,
1
,
0
},
{
2
,
4
,
0
},
{
2
,
4
,
0
},
{
1
,
1
,
1
},
{
3
,
3
,
0
}}};
migraphx
::
shape
s2
{
migraphx
::
shape
::
float_type
,
{{
1
,
1
},
{
2
,
4
},
{
2
,
4
},
{
1
,
1
},
{
3
,
3
}}};
EXPECT
(
s2
.
ndim
()
==
5
);
}
...
...
@@ -327,17 +340,60 @@ TEST_CASE(test_shape_static_to_dynamic)
{
migraphx
::
shape
s0
{
migraphx
::
shape
::
float_type
,
{
1
,
2
,
4
,
4
}};
migraphx
::
shape
s1
=
s0
.
to_dynamic
();
migraphx
::
shape
s2
{
migraphx
::
shape
::
float_type
,
{{
1
,
1
,
0
},
{
2
,
2
,
0
},
{
4
,
4
,
0
},
{
4
,
4
,
0
}}};
migraphx
::
shape
s2
{
migraphx
::
shape
::
float_type
,
{{
1
,
1
},
{
2
,
2
},
{
4
,
4
},
{
4
,
4
}}};
EXPECT
(
s1
==
s2
);
}
TEST_CASE
(
test_shape_dyn_to_dynamic
)
{
migraphx
::
shape
s0
{
migraphx
::
shape
::
float_type
,
{{
1
,
1
,
0
},
{
2
,
4
,
0
},
{
2
,
4
,
0
},
{
2
,
4
,
0
}}};
migraphx
::
shape
s0
{
migraphx
::
shape
::
float_type
,
{{
1
,
1
},
{
2
,
4
},
{
2
,
4
},
{
2
,
4
}}};
migraphx
::
shape
s1
=
s0
.
to_dynamic
();
EXPECT
(
s0
==
s1
);
}
TEST_CASE
(
test_shape_subshapes_to_dynamic
)
{
std
::
vector
<
migraphx
::
shape
>
sub_shapes0
=
{};
sub_shapes0
.
push_back
(
migraphx
::
shape
{
migraphx
::
shape
::
float_type
,
{{
1
,
4
},
{
4
,
4
}}});
sub_shapes0
.
push_back
(
migraphx
::
shape
{
migraphx
::
shape
::
float_type
,
{
3
,
4
,
5
}});
migraphx
::
shape
s0
{
sub_shapes0
};
migraphx
::
shape
s1
=
s0
.
to_dynamic
();
std
::
vector
<
migraphx
::
shape
>
sub_shapes1
=
{};
sub_shapes1
.
push_back
(
migraphx
::
shape
{
migraphx
::
shape
::
float_type
,
{{
1
,
4
},
{
4
,
4
}}});
sub_shapes1
.
push_back
(
migraphx
::
shape
{
migraphx
::
shape
::
float_type
,
{{
3
,
3
},
{
4
,
4
},
{
5
,
5
}}});
migraphx
::
shape
s2
{
sub_shapes1
};
EXPECT
(
s1
==
s2
);
}
TEST_CASE
(
test_shape_dyn_to_static
)
{
migraphx
::
shape
s0
{
migraphx
::
shape
::
float_type
,
{{
1
,
1
},
{
2
,
2
},
{
2
,
10
},
{
2
,
10
}}};
migraphx
::
shape
s1
=
s0
.
to_static
(
4
);
migraphx
::
shape
s2
{
migraphx
::
shape
::
float_type
,
{
1
,
2
,
4
,
4
}};
EXPECT
(
s1
==
s2
);
}
TEST_CASE
(
test_shape_static_to_static
)
{
migraphx
::
shape
s0
{
migraphx
::
shape
::
float_type
,
{
1
,
2
,
4
,
4
}};
migraphx
::
shape
s1
=
s0
.
to_static
(
8
);
EXPECT
(
s0
==
s1
);
}
TEST_CASE
(
test_shape_subshapes_to_static
)
{
std
::
vector
<
migraphx
::
shape
>
sub_shapes0
=
{};
sub_shapes0
.
push_back
(
migraphx
::
shape
{
migraphx
::
shape
::
float_type
,
{{
1
,
4
},
{
4
,
4
}}});
sub_shapes0
.
push_back
(
migraphx
::
shape
{
migraphx
::
shape
::
float_type
,
{
3
,
4
,
5
}});
migraphx
::
shape
s0
{
sub_shapes0
};
migraphx
::
shape
s1
=
s0
.
to_static
(
3
);
std
::
vector
<
migraphx
::
shape
>
sub_shapes1
=
{};
sub_shapes1
.
push_back
(
migraphx
::
shape
{
migraphx
::
shape
::
float_type
,
{
3
,
4
}});
sub_shapes1
.
push_back
(
migraphx
::
shape
{
migraphx
::
shape
::
float_type
,
{
3
,
4
,
5
}});
migraphx
::
shape
s2
{
sub_shapes1
};
EXPECT
(
s1
==
s2
);
}
TEST_CASE
(
test_shape_overlap
)
{
migraphx
::
shape
s
{
migraphx
::
shape
::
float_type
,
{
2
,
2
,
3
},
{
6
,
3
,
2
}};
...
...
@@ -888,4 +944,79 @@ TEST_CASE(test_with_type)
EXPECT
(
s
.
strides
()
==
new_s
.
strides
());
}
TEST_CASE
(
test_multi_index
)
{
migraphx
::
shape
s
{
migraphx
::
shape
::
float_type
,
{
2
,
4
,
6
}};
EXPECT
(
migraphx
::
verify_range
(
s
.
multi
(
0
),
std
::
vector
<
size_t
>
{
0
,
0
,
0
}));
EXPECT
(
migraphx
::
verify_range
(
s
.
multi
(
4
),
std
::
vector
<
size_t
>
{
0
,
0
,
4
}));
EXPECT
(
migraphx
::
verify_range
(
s
.
multi
(
6
),
std
::
vector
<
size_t
>
{
0
,
1
,
0
}));
EXPECT
(
migraphx
::
verify_range
(
s
.
multi
(
8
),
std
::
vector
<
size_t
>
{
0
,
1
,
2
}));
EXPECT
(
migraphx
::
verify_range
(
s
.
multi
(
24
),
std
::
vector
<
size_t
>
{
1
,
0
,
0
}));
EXPECT
(
migraphx
::
verify_range
(
s
.
multi
(
30
),
std
::
vector
<
size_t
>
{
1
,
1
,
0
}));
EXPECT
(
migraphx
::
verify_range
(
s
.
multi
(
34
),
std
::
vector
<
size_t
>
{
1
,
1
,
4
}));
}
TEST_CASE
(
find_permutation_2d_standard
)
{
migraphx
::
shape
s
=
{
migraphx
::
shape
::
float_type
,
{
2
,
3
}};
std
::
vector
<
int64_t
>
permutation
=
{
0
,
1
};
EXPECT
(
migraphx
::
find_permutation
(
s
)
==
permutation
);
}
TEST_CASE
(
find_permutation_2d_transpose
)
{
migraphx
::
shape
s
=
{
migraphx
::
shape
::
float_type
,
{
2
,
3
},
{
1
,
2
}};
std
::
vector
<
int64_t
>
permutation
=
{
1
,
0
};
EXPECT
(
migraphx
::
find_permutation
(
s
)
==
permutation
);
}
TEST_CASE
(
find_permutation_3d
)
{
migraphx
::
shape
s
=
{
migraphx
::
shape
::
float_type
,
{
2
,
3
,
4
},
{
1
,
8
,
2
}};
std
::
vector
<
int64_t
>
permutation
=
{
1
,
2
,
0
};
EXPECT
(
migraphx
::
find_permutation
(
s
)
==
permutation
);
}
TEST_CASE
(
find_permutation_4d
)
{
// ori_lens = 2, 3, 4, 5
// ori_strides = 60, 20, 5, 1
// perm = 3, 2, 0, 1
// inv_perm = 2, 3, 1, 0
// out_strides = 5, 1, 20, 60
migraphx
::
shape
s
=
{
migraphx
::
shape
::
float_type
,
{
5
,
4
,
2
,
3
},
{
5
,
1
,
20
,
60
}};
std
::
vector
<
int64_t
>
permutation
=
{
3
,
2
,
0
,
1
};
EXPECT
(
migraphx
::
find_permutation
(
s
)
==
permutation
);
}
TEST_CASE
(
from_2d_permutation
)
{
std
::
vector
<
std
::
size_t
>
out_lens
=
{
2
,
3
};
std
::
vector
<
int64_t
>
permutation
=
{
1
,
0
};
migraphx
::
shape
out_shape
=
migraphx
::
shape
::
from_permutation
(
migraphx
::
shape
::
float_type
,
out_lens
,
permutation
);
EXPECT
(
out_shape
.
lens
()
==
out_lens
);
EXPECT
(
migraphx
::
find_permutation
(
out_shape
)
==
permutation
);
}
TEST_CASE
(
from_3d_permutation
)
{
std
::
vector
<
std
::
size_t
>
out_lens
=
{
2
,
3
,
4
};
std
::
vector
<
int64_t
>
permutation
=
{
1
,
2
,
0
};
migraphx
::
shape
out_shape
=
migraphx
::
shape
::
from_permutation
(
migraphx
::
shape
::
float_type
,
out_lens
,
permutation
);
EXPECT
(
out_shape
.
lens
()
==
out_lens
);
EXPECT
(
migraphx
::
find_permutation
(
out_shape
)
==
permutation
);
}
TEST_CASE
(
from_4d_permutation
)
{
std
::
vector
<
std
::
size_t
>
out_lens
=
{
5
,
4
,
2
,
3
};
std
::
vector
<
int64_t
>
permutation
=
{
3
,
2
,
0
,
1
};
migraphx
::
shape
out_shape
=
migraphx
::
shape
::
from_permutation
(
migraphx
::
shape
::
float_type
,
out_lens
,
permutation
);
EXPECT
(
out_shape
.
lens
()
==
out_lens
);
EXPECT
(
migraphx
::
find_permutation
(
out_shape
)
==
permutation
);
}
int
main
(
int
argc
,
const
char
*
argv
[])
{
test
::
run
(
argc
,
argv
);
}
test/simplify_algebra_test.cpp
View file @
cd4ab535
...
...
@@ -509,6 +509,34 @@ TEST_CASE(simplify_dot_add)
EXPECT
(
m1
==
m2
);
}
TEST_CASE
(
simplify_conv_add
)
{
migraphx
::
shape
s
{
migraphx
::
shape
::
float_type
,
{
1
,
3
,
32
,
32
}};
migraphx
::
shape
ws
{
migraphx
::
shape
::
float_type
,
{
4
,
3
,
3
,
3
}};
migraphx
::
module
m1
;
{
auto
x
=
m1
.
add_parameter
(
"x"
,
s
);
auto
c
=
m1
.
add_literal
(
migraphx
::
generate_literal
(
s
,
1
));
auto
w
=
m1
.
add_literal
(
migraphx
::
generate_literal
(
ws
,
2
));
auto
sum
=
m1
.
add_instruction
(
migraphx
::
make_op
(
"add"
),
c
,
x
);
auto
conv
=
m1
.
add_instruction
(
migraphx
::
make_op
(
"convolution"
),
sum
,
w
);
m1
.
add_instruction
(
pass_op
{},
conv
);
}
run_pass
(
m1
);
migraphx
::
module
m2
;
{
auto
x
=
m2
.
add_parameter
(
"x"
,
s
);
auto
c
=
m2
.
add_literal
(
migraphx
::
generate_literal
(
s
,
1
));
auto
w
=
m2
.
add_literal
(
migraphx
::
generate_literal
(
ws
,
2
));
auto
conv1
=
m2
.
add_instruction
(
migraphx
::
make_op
(
"convolution"
),
c
,
w
);
auto
conv2
=
m2
.
add_instruction
(
migraphx
::
make_op
(
"convolution"
),
x
,
w
);
auto
sum
=
m2
.
add_instruction
(
migraphx
::
make_op
(
"add"
),
conv1
,
conv2
);
m2
.
add_instruction
(
pass_op
{},
sum
);
}
EXPECT
(
m1
==
m2
);
}
TEST_CASE
(
simplify_inner_broadcast1
)
{
auto
b
=
migraphx
::
op
::
broadcast
{
1
,
{
2
,
1
,
4
,
5
}};
...
...
@@ -585,6 +613,60 @@ TEST_CASE(simplify_inner_broadcast_scalar)
EXPECT
(
m1
==
m2
);
}
TEST_CASE
(
simplify_inner_broadcast_different_dims
)
{
auto
b
=
migraphx
::
op
::
multibroadcast
{{
2
,
384
,
768
}};
migraphx
::
module
m1
;
{
auto
x
=
m1
.
add_parameter
(
"x"
,
{
migraphx
::
shape
::
int32_type
,
{
384
,
768
}});
auto
y
=
m1
.
add_parameter
(
"y"
,
{
migraphx
::
shape
::
int32_type
,
{
768
}});
auto
xb
=
m1
.
add_instruction
(
b
,
x
);
auto
yb
=
m1
.
add_instruction
(
b
,
y
);
auto
sum
=
m1
.
add_instruction
(
migraphx
::
make_op
(
"add"
),
xb
,
yb
);
m1
.
add_instruction
(
pass_op
{},
sum
);
}
run_pass
(
m1
);
migraphx
::
module
m2
;
{
auto
x
=
m2
.
add_parameter
(
"x"
,
{
migraphx
::
shape
::
int32_type
,
{
384
,
768
}});
auto
y
=
m2
.
add_parameter
(
"y"
,
{
migraphx
::
shape
::
int32_type
,
{
768
}});
auto
yb
=
m2
.
add_instruction
(
migraphx
::
op
::
multibroadcast
{{
384
,
768
}},
y
);
auto
sum
=
m2
.
add_instruction
(
migraphx
::
make_op
(
"add"
),
x
,
yb
);
auto
sumb
=
m2
.
add_instruction
(
b
,
sum
);
m2
.
add_instruction
(
pass_op
{},
sumb
);
}
EXPECT
(
m1
==
m2
);
}
TEST_CASE
(
simplify_inner_broadcast_different_broadcasts
)
{
auto
b
=
migraphx
::
op
::
broadcast
{
1
,
{
1
,
24
,
112
,
112
}};
auto
mb
=
migraphx
::
op
::
multibroadcast
{{
1
,
24
,
112
,
112
}};
migraphx
::
module
m1
;
{
auto
x
=
m1
.
add_parameter
(
"x"
,
{
migraphx
::
shape
::
int32_type
,
{
24
}});
auto
y
=
m1
.
add_parameter
(
"y"
,
{
migraphx
::
shape
::
int32_type
,
{
24
,
1
,
1
}});
auto
xb
=
m1
.
add_instruction
(
b
,
x
);
auto
yb
=
m1
.
add_instruction
(
mb
,
y
);
auto
sum
=
m1
.
add_instruction
(
migraphx
::
make_op
(
"add"
),
xb
,
yb
);
m1
.
add_instruction
(
pass_op
{},
sum
);
}
run_pass
(
m1
);
migraphx
::
module
m2
;
{
auto
x
=
m2
.
add_parameter
(
"x"
,
{
migraphx
::
shape
::
int32_type
,
{
24
}});
auto
y
=
m2
.
add_parameter
(
"y"
,
{
migraphx
::
shape
::
int32_type
,
{
24
,
1
,
1
}});
auto
xs
=
m2
.
add_instruction
(
migraphx
::
make_op
(
"squeeze"
),
x
);
auto
ys
=
m2
.
add_instruction
(
migraphx
::
make_op
(
"squeeze"
),
y
);
auto
sum
=
m2
.
add_instruction
(
migraphx
::
make_op
(
"add"
),
xs
,
ys
);
auto
sumb
=
m2
.
add_instruction
(
b
,
sum
);
m2
.
add_instruction
(
pass_op
{},
sumb
);
}
EXPECT
(
m1
==
m2
);
}
TEST_CASE
(
simplify_add_conv1
)
{
migraphx
::
module
m
;
...
...
@@ -2975,6 +3057,38 @@ TEST_CASE(reorder_slice_ins_deps)
EXPECT
(
m
==
create_module
());
}
TEST_CASE
(
dot_broadcast_different_rank
)
{
migraphx
::
module
m1
;
{
auto
x
=
m1
.
add_parameter
(
"x"
,
{
migraphx
::
shape
::
float_type
,
{
768
}});
auto
y
=
m1
.
add_parameter
(
"y"
,
{
migraphx
::
shape
::
float_type
,
{
768
,
3072
}});
auto
xb
=
m1
.
add_instruction
(
migraphx
::
make_op
(
"multibroadcast"
,
{{
"out_lens"
,
{
2
,
384
,
768
}}}),
x
);
auto
yb
=
m1
.
add_instruction
(
migraphx
::
make_op
(
"multibroadcast"
,
{{
"out_lens"
,
{
2
,
768
,
3072
}}}),
y
);
auto
dot
=
m1
.
add_instruction
(
migraphx
::
make_op
(
"dot"
),
xb
,
yb
);
m1
.
add_return
({
dot
});
};
migraphx
::
module
m2
;
{
auto
x
=
m2
.
add_parameter
(
"x"
,
{
migraphx
::
shape
::
float_type
,
{
768
}});
auto
y
=
m2
.
add_parameter
(
"y"
,
{
migraphx
::
shape
::
float_type
,
{
768
,
3072
}});
auto
xb
=
m2
.
add_instruction
(
migraphx
::
make_op
(
"multibroadcast"
,
{{
"out_lens"
,
{
384
,
768
}}}),
x
);
auto
yb
=
m2
.
add_instruction
(
migraphx
::
make_op
(
"multibroadcast"
,
{{
"out_lens"
,
{
768
,
3072
}}}),
y
);
auto
dot
=
m2
.
add_instruction
(
migraphx
::
make_op
(
"dot"
),
xb
,
yb
);
auto
broadcast
=
m2
.
add_instruction
(
migraphx
::
make_op
(
"multibroadcast"
,
{{
"out_lens"
,
{
2
,
384
,
3072
}}}),
dot
);
m2
.
add_return
({
broadcast
});
};
run_pass
(
m1
);
EXPECT
(
m1
.
sort
()
==
m2
.
sort
());
}
TEST_CASE
(
dot_fusion_reshape
)
{
migraphx
::
module
m1
;
...
...
@@ -3024,4 +3138,257 @@ TEST_CASE(dot_fusion_reshape)
EXPECT
(
m1
.
sort
()
==
m2
.
sort
());
}
TEST_CASE
(
mul_dot_a
)
{
migraphx
::
shape
as
{
migraphx
::
shape
::
float_type
,
{
2
,
256
,
32
}};
migraphx
::
shape
bs
{
migraphx
::
shape
::
float_type
,
{
2
,
32
,
128
}};
migraphx
::
module
m1
;
{
auto
a
=
m1
.
add_parameter
(
"input"
,
as
);
auto
lit
=
m1
.
add_literal
(
migraphx
::
generate_literal
({
migraphx
::
shape
::
float_type
,
{
1
,
1
,
32
}}));
auto
litb
=
m1
.
add_instruction
(
migraphx
::
make_op
(
"multibroadcast"
,
{{
"out_lens"
,
as
.
lens
()}}),
lit
);
auto
mul
=
m1
.
add_instruction
(
migraphx
::
make_op
(
"mul"
),
a
,
litb
);
auto
b
=
m1
.
add_literal
(
migraphx
::
generate_literal
(
bs
));
auto
dot
=
m1
.
add_instruction
(
migraphx
::
make_op
(
"dot"
),
mul
,
b
);
m1
.
add_return
({
dot
});
};
run_pass
(
m1
);
migraphx
::
module
m2
;
{
auto
a
=
m2
.
add_parameter
(
"input"
,
as
);
auto
lit
=
m2
.
add_literal
(
migraphx
::
generate_literal
({
migraphx
::
shape
::
float_type
,
{
1
,
1
,
32
}}));
auto
litb
=
m2
.
add_instruction
(
migraphx
::
make_op
(
"multibroadcast"
,
{{
"out_lens"
,
migraphx
::
reorder_dims
(
bs
.
lens
(),
{
0
,
2
,
1
})}}),
lit
);
auto
litt
=
m2
.
add_instruction
(
migraphx
::
make_op
(
"transpose"
,
{{
"permutation"
,
{
0
,
2
,
1
}}}),
litb
);
auto
b
=
m2
.
add_literal
(
migraphx
::
generate_literal
(
bs
));
auto
mul
=
m2
.
add_instruction
(
migraphx
::
make_op
(
"mul"
),
b
,
litt
);
auto
dot
=
m2
.
add_instruction
(
migraphx
::
make_op
(
"dot"
),
a
,
mul
);
m2
.
add_return
({
dot
});
};
EXPECT
(
m1
.
sort
()
==
m2
.
sort
());
}
TEST_CASE
(
mul_dot_b
)
{
migraphx
::
shape
as
{
migraphx
::
shape
::
float_type
,
{
2
,
256
,
32
}};
migraphx
::
shape
bs
{
migraphx
::
shape
::
float_type
,
{
2
,
32
,
128
}};
migraphx
::
module
m1
;
{
auto
b
=
m1
.
add_parameter
(
"input"
,
bs
);
auto
lit
=
m1
.
add_literal
(
migraphx
::
generate_literal
({
migraphx
::
shape
::
float_type
,
{
1
,
32
,
1
}}));
auto
litb
=
m1
.
add_instruction
(
migraphx
::
make_op
(
"multibroadcast"
,
{{
"out_lens"
,
bs
.
lens
()}}),
lit
);
auto
mul
=
m1
.
add_instruction
(
migraphx
::
make_op
(
"mul"
),
b
,
litb
);
auto
a
=
m1
.
add_literal
(
migraphx
::
generate_literal
(
as
));
auto
dot
=
m1
.
add_instruction
(
migraphx
::
make_op
(
"dot"
),
a
,
mul
);
m1
.
add_return
({
dot
});
};
run_pass
(
m1
);
migraphx
::
module
m2
;
{
auto
b
=
m2
.
add_parameter
(
"input"
,
bs
);
auto
lit
=
m2
.
add_literal
(
migraphx
::
generate_literal
({
migraphx
::
shape
::
float_type
,
{
1
,
32
,
1
}}));
auto
litb
=
m2
.
add_instruction
(
migraphx
::
make_op
(
"multibroadcast"
,
{{
"out_lens"
,
migraphx
::
reorder_dims
(
as
.
lens
(),
{
0
,
2
,
1
})}}),
lit
);
auto
litt
=
m2
.
add_instruction
(
migraphx
::
make_op
(
"transpose"
,
{{
"permutation"
,
{
0
,
2
,
1
}}}),
litb
);
auto
a
=
m2
.
add_literal
(
migraphx
::
generate_literal
(
as
));
auto
mul
=
m2
.
add_instruction
(
migraphx
::
make_op
(
"mul"
),
a
,
litt
);
auto
dot
=
m2
.
add_instruction
(
migraphx
::
make_op
(
"dot"
),
mul
,
b
);
m2
.
add_return
({
dot
});
};
EXPECT
(
m1
.
sort
()
==
m2
.
sort
());
}
TEST_CASE
(
mul_dot_a_not_k_broadcast
)
{
migraphx
::
shape
as
{
migraphx
::
shape
::
float_type
,
{
2
,
256
,
32
}};
migraphx
::
shape
bs
{
migraphx
::
shape
::
float_type
,
{
2
,
32
,
128
}};
migraphx
::
module
m1
;
{
auto
a
=
m1
.
add_parameter
(
"input"
,
as
);
auto
lit
=
m1
.
add_literal
(
migraphx
::
generate_literal
({
migraphx
::
shape
::
float_type
,
{
1
,
256
,
1
}}));
auto
litb
=
m1
.
add_instruction
(
migraphx
::
make_op
(
"multibroadcast"
,
{{
"out_lens"
,
as
.
lens
()}}),
lit
);
auto
mul
=
m1
.
add_instruction
(
migraphx
::
make_op
(
"mul"
),
a
,
litb
);
auto
b
=
m1
.
add_literal
(
migraphx
::
generate_literal
(
bs
));
auto
dot
=
m1
.
add_instruction
(
migraphx
::
make_op
(
"dot"
),
mul
,
b
);
m1
.
add_return
({
dot
});
};
migraphx
::
module
m2
=
m1
;
run_pass
(
m1
);
EXPECT
(
m1
.
sort
()
==
m2
.
sort
());
}
TEST_CASE
(
mul_dot_b_not_k_broadcast
)
{
migraphx
::
shape
as
{
migraphx
::
shape
::
float_type
,
{
2
,
256
,
32
}};
migraphx
::
shape
bs
{
migraphx
::
shape
::
float_type
,
{
2
,
32
,
128
}};
migraphx
::
module
m1
;
{
auto
b
=
m1
.
add_parameter
(
"input"
,
bs
);
auto
lit
=
m1
.
add_literal
(
migraphx
::
generate_literal
({
migraphx
::
shape
::
float_type
,
{
1
,
1
,
128
}}));
auto
litb
=
m1
.
add_instruction
(
migraphx
::
make_op
(
"multibroadcast"
,
{{
"out_lens"
,
bs
.
lens
()}}),
lit
);
auto
mul
=
m1
.
add_instruction
(
migraphx
::
make_op
(
"mul"
),
b
,
litb
);
auto
a
=
m1
.
add_literal
(
migraphx
::
generate_literal
(
as
));
auto
dot
=
m1
.
add_instruction
(
migraphx
::
make_op
(
"dot"
),
a
,
mul
);
m1
.
add_return
({
dot
});
};
migraphx
::
module
m2
=
m1
;
run_pass
(
m1
);
EXPECT
(
m1
.
sort
()
==
m2
.
sort
());
}
TEST_CASE
(
dot_mul_a
)
{
migraphx
::
shape
as
{
migraphx
::
shape
::
float_type
,
{
2
,
256
,
32
}};
migraphx
::
shape
bs
{
migraphx
::
shape
::
float_type
,
{
2
,
32
,
128
}};
migraphx
::
module
m1
;
{
auto
a
=
m1
.
add_parameter
(
"input"
,
as
);
auto
b
=
m1
.
add_literal
(
migraphx
::
generate_literal
(
bs
));
auto
dot
=
m1
.
add_instruction
(
migraphx
::
make_op
(
"dot"
),
a
,
b
);
auto
lit
=
m1
.
add_literal
(
migraphx
::
generate_literal
({
migraphx
::
shape
::
float_type
,
{
1
,
1
,
128
}}));
auto
litb
=
m1
.
add_instruction
(
migraphx
::
make_op
(
"multibroadcast"
,
{{
"out_lens"
,
dot
->
get_shape
().
lens
()}}),
lit
);
auto
mul
=
m1
.
add_instruction
(
migraphx
::
make_op
(
"mul"
),
dot
,
litb
);
m1
.
add_return
({
mul
});
};
run_pass
(
m1
);
migraphx
::
module
m2
;
{
auto
a
=
m2
.
add_parameter
(
"input"
,
as
);
auto
b
=
m2
.
add_literal
(
migraphx
::
generate_literal
(
bs
));
auto
lit
=
m2
.
add_literal
(
migraphx
::
generate_literal
({
migraphx
::
shape
::
float_type
,
{
1
,
1
,
128
}}));
auto
litb
=
m2
.
add_instruction
(
migraphx
::
make_op
(
"multibroadcast"
,
{{
"out_lens"
,
bs
.
lens
()}}),
lit
);
auto
mul
=
m2
.
add_instruction
(
migraphx
::
make_op
(
"mul"
),
b
,
litb
);
auto
dot
=
m2
.
add_instruction
(
migraphx
::
make_op
(
"dot"
),
a
,
mul
);
m2
.
add_return
({
dot
});
};
EXPECT
(
m1
.
sort
()
==
m2
.
sort
());
}
TEST_CASE
(
dot_mul_a_non_const
)
{
migraphx
::
shape
as
{
migraphx
::
shape
::
float_type
,
{
2
,
256
,
32
}};
migraphx
::
shape
bs
{
migraphx
::
shape
::
float_type
,
{
2
,
32
,
128
}};
migraphx
::
module
m1
;
{
auto
a
=
m1
.
add_parameter
(
"input"
,
as
);
auto
b
=
m1
.
add_literal
(
migraphx
::
generate_literal
(
bs
));
auto
dot
=
m1
.
add_instruction
(
migraphx
::
make_op
(
"dot"
),
a
,
b
);
auto
lit
=
m1
.
add_literal
(
migraphx
::
generate_literal
({
migraphx
::
shape
::
float_type
,
{
1
,
256
,
1
}}));
auto
litb
=
m1
.
add_instruction
(
migraphx
::
make_op
(
"multibroadcast"
,
{{
"out_lens"
,
dot
->
get_shape
().
lens
()}}),
lit
);
auto
mul
=
m1
.
add_instruction
(
migraphx
::
make_op
(
"mul"
),
dot
,
litb
);
m1
.
add_return
({
mul
});
};
migraphx
::
module
m2
=
m1
;
run_pass
(
m1
);
EXPECT
(
m1
.
sort
()
==
m2
.
sort
());
}
TEST_CASE
(
dot_mul_b
)
{
migraphx
::
shape
as
{
migraphx
::
shape
::
float_type
,
{
2
,
256
,
32
}};
migraphx
::
shape
bs
{
migraphx
::
shape
::
float_type
,
{
2
,
32
,
128
}};
migraphx
::
module
m1
;
{
auto
a
=
m1
.
add_literal
(
migraphx
::
generate_literal
(
as
));
auto
b
=
m1
.
add_parameter
(
"input"
,
bs
);
auto
dot
=
m1
.
add_instruction
(
migraphx
::
make_op
(
"dot"
),
a
,
b
);
auto
lit
=
m1
.
add_literal
(
migraphx
::
generate_literal
({
migraphx
::
shape
::
float_type
,
{
1
,
256
,
1
}}));
auto
litb
=
m1
.
add_instruction
(
migraphx
::
make_op
(
"multibroadcast"
,
{{
"out_lens"
,
dot
->
get_shape
().
lens
()}}),
lit
);
auto
mul
=
m1
.
add_instruction
(
migraphx
::
make_op
(
"mul"
),
dot
,
litb
);
m1
.
add_return
({
mul
});
};
run_pass
(
m1
);
migraphx
::
module
m2
;
{
auto
a
=
m2
.
add_literal
(
migraphx
::
generate_literal
(
as
));
auto
b
=
m2
.
add_parameter
(
"input"
,
bs
);
auto
lit
=
m2
.
add_literal
(
migraphx
::
generate_literal
({
migraphx
::
shape
::
float_type
,
{
1
,
256
,
1
}}));
auto
litb
=
m2
.
add_instruction
(
migraphx
::
make_op
(
"multibroadcast"
,
{{
"out_lens"
,
as
.
lens
()}}),
lit
);
auto
mul
=
m2
.
add_instruction
(
migraphx
::
make_op
(
"mul"
),
a
,
litb
);
auto
dot
=
m2
.
add_instruction
(
migraphx
::
make_op
(
"dot"
),
mul
,
b
);
m2
.
add_return
({
dot
});
};
EXPECT
(
m1
.
sort
()
==
m2
.
sort
());
}
TEST_CASE
(
dot_mul_b_non_const
)
{
migraphx
::
shape
as
{
migraphx
::
shape
::
float_type
,
{
2
,
256
,
32
}};
migraphx
::
shape
bs
{
migraphx
::
shape
::
float_type
,
{
2
,
32
,
128
}};
migraphx
::
module
m1
;
{
auto
a
=
m1
.
add_literal
(
migraphx
::
generate_literal
(
as
));
auto
b
=
m1
.
add_parameter
(
"input"
,
bs
);
auto
dot
=
m1
.
add_instruction
(
migraphx
::
make_op
(
"dot"
),
a
,
b
);
auto
lit
=
m1
.
add_literal
(
migraphx
::
generate_literal
({
migraphx
::
shape
::
float_type
,
{
1
,
1
,
128
}}));
auto
litb
=
m1
.
add_instruction
(
migraphx
::
make_op
(
"multibroadcast"
,
{{
"out_lens"
,
dot
->
get_shape
().
lens
()}}),
lit
);
auto
mul
=
m1
.
add_instruction
(
migraphx
::
make_op
(
"mul"
),
dot
,
litb
);
m1
.
add_return
({
mul
});
};
migraphx
::
module
m2
=
m1
;
run_pass
(
m1
);
EXPECT
(
m1
.
sort
()
==
m2
.
sort
());
}
int
main
(
int
argc
,
const
char
*
argv
[])
{
test
::
run
(
argc
,
argv
);
}
test/simplify_qdq_test.cpp
View file @
cd4ab535
...
...
@@ -402,9 +402,10 @@ TEST_CASE(conv_bias_add)
auto
bias
=
m1
.
add_parameter
(
"bias"
,
s6
);
auto
scale
=
m1
.
add_literal
(
0.5
f
);
auto
zero
=
m1
.
add_literal
(
std
::
int8_t
{
0
});
auto
zero32
=
m1
.
add_literal
(
std
::
int32_t
{
0
});
auto
d1
=
add_quantize_op
(
m1
,
"dequantizelinear"
,
weights
,
scale
,
zero
);
auto
d2
=
add_quantize_op
(
m1
,
"dequantizelinear"
,
bias
,
scale
,
zero
);
auto
d2
=
add_quantize_op
(
m1
,
"dequantizelinear"
,
bias
,
scale
,
zero
32
);
auto
q1
=
add_quantize_op
(
m1
,
"quantizelinear"
,
input
,
scale
,
zero
);
auto
d5
=
add_quantize_op
(
m1
,
"dequantizelinear"
,
q1
,
scale
,
zero
);
auto
c1
=
m1
.
add_instruction
(
migraphx
::
make_op
(
"convolution"
,
...
...
@@ -428,9 +429,10 @@ TEST_CASE(conv_bias_add)
auto
bias
=
m2
.
add_parameter
(
"bias"
,
s6
);
auto
scale
=
m2
.
add_literal
(
0.5
f
);
auto
zero
=
m2
.
add_literal
(
std
::
int8_t
{
0
});
auto
zero32
=
m2
.
add_literal
(
std
::
int32_t
{
0
});
auto
scale1
=
m2
.
add_literal
(
0.25
f
);
auto
d2
=
add_quantize_op
(
m2
,
"dequantizelinear"
,
bias
,
scale
,
zero
);
auto
d2
=
add_quantize_op
(
m2
,
"dequantizelinear"
,
bias
,
scale
,
zero
32
);
auto
q1
=
add_quantize_op
(
m2
,
"quantizelinear"
,
input
,
scale
,
zero
);
auto
c1
=
m2
.
add_instruction
(
migraphx
::
make_op
(
"quant_convolution"
,
{{
"padding"
,
{
0
,
0
,
0
,
0
}},
...
...
@@ -468,9 +470,10 @@ TEST_CASE(conv_pooling_dot)
auto
input
=
m1
.
add_parameter
(
"input"
,
s7
);
auto
scale
=
m1
.
add_literal
(
0.5
f
);
auto
zero
=
m1
.
add_literal
(
std
::
int8_t
{
0
});
auto
zero32
=
m1
.
add_literal
(
std
::
int32_t
{
0
});
auto
d1
=
add_quantize_op
(
m1
,
"dequantizelinear"
,
weights
,
scale
,
zero
);
auto
d2
=
add_quantize_op
(
m1
,
"dequantizelinear"
,
bias
,
scale
,
zero
);
auto
d2
=
add_quantize_op
(
m1
,
"dequantizelinear"
,
bias
,
scale
,
zero
32
);
auto
d3
=
add_quantize_op
(
m1
,
"dequantizelinear"
,
ab
,
scale
,
zero
);
auto
d4
=
add_quantize_op
(
m1
,
"dequantizelinear"
,
db
,
scale
,
zero
);
auto
q1
=
add_quantize_op
(
m1
,
"quantizelinear"
,
input
,
scale
,
zero
);
...
...
@@ -515,10 +518,11 @@ TEST_CASE(conv_pooling_dot)
auto
input
=
m2
.
add_parameter
(
"input"
,
s7
);
auto
scale
=
m2
.
add_literal
(
0.5
f
);
auto
zero
=
m2
.
add_literal
(
std
::
int8_t
{
0
});
auto
zero32
=
m2
.
add_literal
(
std
::
int32_t
{
0
});
auto
scale1
=
m2
.
add_literal
(
0.25
f
);
auto
scale2
=
m2
.
add_literal
(
0.25
f
);
auto
d2
=
add_quantize_op
(
m2
,
"dequantizelinear"
,
bias
,
scale
,
zero
);
auto
d2
=
add_quantize_op
(
m2
,
"dequantizelinear"
,
bias
,
scale
,
zero
32
);
auto
d3
=
add_quantize_op
(
m2
,
"dequantizelinear"
,
ab
,
scale
,
zero
);
auto
q1
=
add_quantize_op
(
m2
,
"quantizelinear"
,
input
,
scale
,
zero
);
auto
c1
=
m2
.
add_instruction
(
migraphx
::
make_op
(
"quant_convolution"
,
...
...
@@ -572,9 +576,10 @@ TEST_CASE(mobilenet_snippet)
auto
input
=
mm
.
add_parameter
(
"input"
,
s7
);
auto
scale
=
mm
.
add_literal
(
0.5
f
);
auto
zero
=
mm
.
add_literal
(
std
::
int8_t
{
0
});
auto
zero32
=
mm
.
add_literal
(
std
::
int32_t
{
0
});
auto
d1
=
add_quantize_op
(
mm
,
"dequantizelinear"
,
weights
,
scale
,
zero
);
auto
d2
=
add_quantize_op
(
mm
,
"dequantizelinear"
,
bias
,
scale
,
zero
);
auto
d2
=
add_quantize_op
(
mm
,
"dequantizelinear"
,
bias
,
scale
,
zero
32
);
auto
d3
=
add_quantize_op
(
mm
,
"dequantizelinear"
,
ab
,
scale
,
zero
);
auto
d4
=
add_quantize_op
(
mm
,
"dequantizelinear"
,
db
,
scale
,
zero
);
auto
q1
=
add_quantize_op
(
mm
,
"quantizelinear"
,
input
,
scale
,
zero
);
...
...
test/simplify_reshapes_test.cpp
View file @
cd4ab535
...
...
@@ -1322,6 +1322,46 @@ TEST_CASE(transpose_slice)
EXPECT
(
m1
==
m2
);
}
TEST_CASE
(
transpose_slice_unsqueeze
)
{
migraphx
::
module
m1
;
{
auto
x
=
m1
.
add_parameter
(
"x"
,
{
migraphx
::
shape
::
float_type
,
{
4
,
1024
,
96
,
64
}});
auto
transpose1
=
m1
.
add_instruction
(
migraphx
::
make_op
(
"transpose"
,
{{
"permutation"
,
{
0
,
2
,
3
,
1
}}}),
x
);
auto
slice1
=
m1
.
add_instruction
(
migraphx
::
make_op
(
"slice"
,
{{
"axes"
,
{
1
}},
{
"starts"
,
{
0
}},
{
"ends"
,
{
8
}}}),
transpose1
);
auto
slice2
=
m1
.
add_instruction
(
migraphx
::
make_op
(
"slice"
,
{{
"axes"
,
{
1
}},
{
"starts"
,
{
16
}},
{
"ends"
,
{
24
}}}),
transpose1
);
auto
slice3
=
m1
.
add_instruction
(
migraphx
::
make_op
(
"slice"
,
{{
"axes"
,
{
1
}},
{
"starts"
,
{
32
}},
{
"ends"
,
{
40
}}}),
transpose1
);
m1
.
add_return
({
slice1
,
slice2
,
slice3
});
}
run_pass
(
m1
);
migraphx
::
module
m2
;
{
auto
x
=
m2
.
add_parameter
(
"x"
,
{
migraphx
::
shape
::
float_type
,
{
4
,
1024
,
96
,
64
}});
auto
unsq
=
m2
.
add_instruction
(
migraphx
::
make_op
(
"unsqueeze"
,
{{
"axes"
,
{
2
}},
{
"steps"
,
{
12
}}}),
x
);
auto
transpose
=
m2
.
add_instruction
(
migraphx
::
make_op
(
"transpose"
,
{{
"permutation"
,
{
2
,
0
,
3
,
4
,
1
}}}),
unsq
);
auto
slice1
=
m2
.
add_instruction
(
migraphx
::
make_op
(
"slice"
,
{{
"axes"
,
{
0
}},
{
"starts"
,
{
0
}},
{
"ends"
,
{
1
}}}),
transpose
);
auto
sq1
=
m2
.
add_instruction
(
migraphx
::
make_op
(
"squeeze"
,
{{
"axes"
,
{
0
}}}),
slice1
);
auto
slice2
=
m2
.
add_instruction
(
migraphx
::
make_op
(
"slice"
,
{{
"axes"
,
{
0
}},
{
"starts"
,
{
2
}},
{
"ends"
,
{
3
}}}),
transpose
);
auto
sq2
=
m2
.
add_instruction
(
migraphx
::
make_op
(
"squeeze"
,
{{
"axes"
,
{
0
}}}),
slice2
);
auto
slice3
=
m2
.
add_instruction
(
migraphx
::
make_op
(
"slice"
,
{{
"axes"
,
{
0
}},
{
"starts"
,
{
4
}},
{
"ends"
,
{
5
}}}),
transpose
);
auto
sq3
=
m2
.
add_instruction
(
migraphx
::
make_op
(
"squeeze"
,
{{
"axes"
,
{
0
}}}),
slice3
);
m2
.
add_return
({
sq1
,
sq2
,
sq3
});
}
EXPECT
(
m1
==
m2
);
}
TEST_CASE
(
transpose_slice_diff_perm
)
{
migraphx
::
module
m1
;
...
...
test/split_single_dyn_dim_test.cpp
0 → 100644
View file @
cd4ab535
/*
* The MIT License (MIT)
*
* Copyright (c) 2015-2023 Advanced Micro Devices, Inc. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#include <migraphx/split_single_dyn_dim.hpp>
#include <migraphx/program.hpp>
#include <migraphx/dead_code_elimination.hpp>
#include <migraphx/pass_manager.hpp>
#include <migraphx/make_op.hpp>
#include <migraphx/serialize.hpp>
#include <test.hpp>
void
run_pass
(
migraphx
::
program
&
p
)
{
migraphx
::
run_passes
(
p
,
{
migraphx
::
split_single_dyn_dim
{},
migraphx
::
dead_code_elimination
{}});
}
TEST_CASE
(
dynamic_batch
)
{
// Slightly different from ref_ops_test in that the literal is copied over the submodules.
// A different compiler pass will pull the literals from the submodules to the main module.
migraphx
::
program
p0
;
{
auto
*
mm0
=
p0
.
get_main_module
();
// create batch submodules
auto
create_submodule
=
[
&
](
std
::
size_t
batch_size
,
const
std
::
string
&
module_name
)
{
auto
*
submod
=
p0
.
create_module
(
module_name
);
migraphx
::
shape
sm_shape
{
migraphx
::
shape
::
float_type
,
{
batch_size
,
4
}};
auto
sm_input
=
submod
->
add_parameter
(
"data"
,
sm_shape
);
migraphx
::
shape
lit_s
{
migraphx
::
shape
{
migraphx
::
shape
::
float_type
,
{
1
}}};
auto
literal_ins
=
submod
->
add_literal
(
migraphx
::
literal
{
lit_s
,
{
6
}});
auto
broadcast_lit
=
submod
->
add_instruction
(
migraphx
::
make_op
(
"multibroadcast"
,
{{
"out_lens"
,
sm_shape
.
lens
()}}),
literal_ins
);
auto
add_ins
=
submod
->
add_instruction
(
migraphx
::
make_op
(
"add"
),
sm_input
,
broadcast_lit
);
submod
->
add_return
({
add_ins
});
return
submod
;
};
auto
*
dim1
=
create_submodule
(
1
,
"dim_1"
);
auto
*
dim2
=
create_submodule
(
2
,
"dim_2"
);
auto
*
dim3
=
create_submodule
(
3
,
"dim_3"
);
auto
*
dim4
=
create_submodule
(
4
,
"dim_4"
);
migraphx
::
shape
s
{
migraphx
::
shape
::
float_type
,
{{
1
,
4
},
{
4
,
4
}}};
auto
input0
=
mm0
->
add_parameter
(
"data"
,
s
);
std
::
vector
<
migraphx
::
shape
>
sub_shapes
=
{};
sub_shapes
.
push_back
(
migraphx
::
shape
{
migraphx
::
shape
::
float_type
,
{{
1
,
4
},
{
4
,
4
}}});
migraphx
::
shape
out_attr
=
migraphx
::
shape
{
sub_shapes
};
auto
sm_ins
=
mm0
->
add_instruction
(
migraphx
::
make_op
(
"select_module"
,
{{
"output_dyn_shapes"
,
migraphx
::
to_value
(
out_attr
)}}),
{
input0
},
{
dim1
,
dim2
,
dim3
,
dim4
});
auto
ret
=
mm0
->
add_instruction
(
migraphx
::
make_op
(
"get_tuple_elem"
,
{{
"index"
,
0
}}),
sm_ins
);
mm0
->
add_return
({
ret
});
}
migraphx
::
program
p1
;
{
auto
*
mm1
=
p1
.
get_main_module
();
migraphx
::
shape
s
{
migraphx
::
shape
::
float_type
,
{{
1
,
4
},
{
4
,
4
}}};
auto
input1
=
mm1
->
add_parameter
(
"data"
,
s
);
migraphx
::
shape
lit_s
{
migraphx
::
shape
{
migraphx
::
shape
::
float_type
,
{
1
}}};
auto
literal_ins
=
mm1
->
add_literal
(
migraphx
::
literal
{
lit_s
,
{
6
}});
auto
broadcast_lit
=
mm1
->
add_instruction
(
migraphx
::
make_op
(
"multibroadcast"
),
literal_ins
,
input1
);
auto
add_ins
=
mm1
->
add_instruction
(
migraphx
::
make_op
(
"add"
),
input1
,
broadcast_lit
);
mm1
->
add_return
({
add_ins
});
}
run_pass
(
p1
);
EXPECT
(
p0
==
p1
);
}
TEST_CASE
(
multiple_outputs
)
{
migraphx
::
program
p0
;
{
auto
*
mm0
=
p0
.
get_main_module
();
// create batch submodules
auto
create_submodule
=
[
&
](
std
::
size_t
batch_size
,
const
std
::
string
&
module_name
)
{
auto
*
submod
=
p0
.
create_module
(
module_name
);
migraphx
::
shape
sm_shape
{
migraphx
::
shape
::
float_type
,
{
batch_size
,
4
}};
auto
sm_input
=
submod
->
add_parameter
(
"data"
,
sm_shape
);
migraphx
::
shape
lit_s
{
migraphx
::
shape
{
migraphx
::
shape
::
float_type
,
{
1
}}};
auto
literal_ins
=
submod
->
add_literal
(
migraphx
::
literal
{
lit_s
,
{
6
}});
auto
broadcast_lit
=
submod
->
add_instruction
(
migraphx
::
make_op
(
"multibroadcast"
,
{{
"out_lens"
,
sm_shape
.
lens
()}}),
literal_ins
);
auto
add0_ins
=
submod
->
add_instruction
(
migraphx
::
make_op
(
"add"
),
sm_input
,
broadcast_lit
);
auto
add1_ins
=
submod
->
add_instruction
(
migraphx
::
make_op
(
"add"
),
sm_input
,
sm_input
);
submod
->
add_return
({
add0_ins
,
add1_ins
});
return
submod
;
};
auto
*
dim1
=
create_submodule
(
1
,
"dim_1"
);
auto
*
dim2
=
create_submodule
(
2
,
"dim_2"
);
auto
*
dim3
=
create_submodule
(
3
,
"dim_3"
);
auto
*
dim4
=
create_submodule
(
4
,
"dim_4"
);
migraphx
::
shape
s
{
migraphx
::
shape
::
float_type
,
{{
1
,
4
},
{
4
,
4
}}};
auto
input0
=
mm0
->
add_parameter
(
"data"
,
s
);
std
::
vector
<
migraphx
::
shape
>
sub_shapes
=
{};
migraphx
::
shape
tmp_s
{
migraphx
::
shape
::
float_type
,
{{
1
,
4
},
{
4
,
4
}}};
sub_shapes
.
push_back
(
tmp_s
);
sub_shapes
.
push_back
(
tmp_s
);
migraphx
::
shape
out_attr
=
migraphx
::
shape
{
sub_shapes
};
auto
sm_ins
=
mm0
->
add_instruction
(
migraphx
::
make_op
(
"select_module"
,
{{
"output_dyn_shapes"
,
migraphx
::
to_value
(
out_attr
)}}),
{
input0
},
{
dim1
,
dim2
,
dim3
,
dim4
});
auto
ret0
=
mm0
->
add_instruction
(
migraphx
::
make_op
(
"get_tuple_elem"
,
{{
"index"
,
0
}}),
sm_ins
);
auto
ret1
=
mm0
->
add_instruction
(
migraphx
::
make_op
(
"get_tuple_elem"
,
{{
"index"
,
1
}}),
sm_ins
);
mm0
->
add_return
({
ret0
,
ret1
});
}
migraphx
::
program
p1
;
{
auto
*
mm1
=
p1
.
get_main_module
();
migraphx
::
shape
s
{
migraphx
::
shape
::
float_type
,
{{
1
,
4
},
{
4
,
4
}}};
auto
input1
=
mm1
->
add_parameter
(
"data"
,
s
);
migraphx
::
shape
lit_s
{
migraphx
::
shape
{
migraphx
::
shape
::
float_type
,
{
1
}}};
auto
literal_ins
=
mm1
->
add_literal
(
migraphx
::
literal
{
lit_s
,
{
6
}});
auto
broadcast_lit
=
mm1
->
add_instruction
(
migraphx
::
make_op
(
"multibroadcast"
),
literal_ins
,
input1
);
auto
add0_ins
=
mm1
->
add_instruction
(
migraphx
::
make_op
(
"add"
),
input1
,
broadcast_lit
);
auto
add1_ins
=
mm1
->
add_instruction
(
migraphx
::
make_op
(
"add"
),
input1
,
input1
);
mm1
->
add_return
({
add0_ins
,
add1_ins
});
}
run_pass
(
p1
);
EXPECT
(
p0
==
p1
);
}
TEST_CASE
(
broadcast_match
)
{
// Slightly different from ref_ops_test in that the literal is copied over the submodules.
// A different compiler pass will pull the literals from the submodules to the main module.
migraphx
::
program
p0
;
{
auto
*
mm0
=
p0
.
get_main_module
();
// create batch submodules
auto
create_submodule
=
[
&
](
std
::
size_t
batch_size
,
const
std
::
string
&
module_name
)
{
auto
*
submod
=
p0
.
create_module
(
module_name
);
migraphx
::
shape
sm_shape
{
migraphx
::
shape
::
float_type
,
{
batch_size
,
4
}};
auto
sm_input
=
submod
->
add_parameter
(
"data"
,
sm_shape
);
migraphx
::
shape
lit_s
{
migraphx
::
shape
{
migraphx
::
shape
::
float_type
,
{
4
}}};
auto
literal_ins
=
submod
->
add_literal
(
migraphx
::
literal
{
lit_s
,
{
6
,
5
,
4
,
3
}});
auto
broadcast_lit
=
submod
->
add_instruction
(
migraphx
::
make_op
(
"broadcast"
,
{{
"axis"
,
1
},
{
"out_lens"
,
sm_shape
.
lens
()}}),
literal_ins
);
auto
add_ins
=
submod
->
add_instruction
(
migraphx
::
make_op
(
"add"
),
sm_input
,
broadcast_lit
);
submod
->
add_return
({
add_ins
});
return
submod
;
};
auto
*
dim1
=
create_submodule
(
1
,
"dim_1"
);
auto
*
dim2
=
create_submodule
(
2
,
"dim_2"
);
auto
*
dim3
=
create_submodule
(
3
,
"dim_3"
);
auto
*
dim4
=
create_submodule
(
4
,
"dim_4"
);
migraphx
::
shape
s
{
migraphx
::
shape
::
float_type
,
{{
1
,
4
},
{
4
,
4
}}};
auto
input0
=
mm0
->
add_parameter
(
"data"
,
s
);
std
::
vector
<
migraphx
::
shape
>
sub_shapes
=
{};
sub_shapes
.
push_back
(
migraphx
::
shape
{
migraphx
::
shape
::
float_type
,
{{
1
,
4
},
{
4
,
4
}}});
migraphx
::
shape
out_attr
=
migraphx
::
shape
{
sub_shapes
};
auto
sm_ins
=
mm0
->
add_instruction
(
migraphx
::
make_op
(
"select_module"
,
{{
"output_dyn_shapes"
,
migraphx
::
to_value
(
out_attr
)}}),
{
input0
},
{
dim1
,
dim2
,
dim3
,
dim4
});
auto
ret
=
mm0
->
add_instruction
(
migraphx
::
make_op
(
"get_tuple_elem"
,
{{
"index"
,
0
}}),
sm_ins
);
mm0
->
add_return
({
ret
});
}
migraphx
::
program
p1
;
{
auto
*
mm1
=
p1
.
get_main_module
();
migraphx
::
shape
s
{
migraphx
::
shape
::
float_type
,
{{
1
,
4
},
{
4
,
4
}}};
auto
input1
=
mm1
->
add_parameter
(
"data"
,
s
);
migraphx
::
shape
lit_s
{
migraphx
::
shape
{
migraphx
::
shape
::
float_type
,
{
4
}}};
auto
literal_ins
=
mm1
->
add_literal
(
migraphx
::
literal
{
lit_s
,
{
6
,
5
,
4
,
3
}});
auto
broadcast_lit
=
mm1
->
add_instruction
(
migraphx
::
make_op
(
"broadcast"
,
{{
"axis"
,
1
}}),
literal_ins
,
input1
);
auto
add_ins
=
mm1
->
add_instruction
(
migraphx
::
make_op
(
"add"
),
input1
,
broadcast_lit
);
mm1
->
add_return
({
add_ins
});
}
run_pass
(
p1
);
EXPECT
(
p0
==
p1
);
}
int
main
(
int
argc
,
const
char
*
argv
[])
{
test
::
run
(
argc
,
argv
);
}
test/targets.cpp
View file @
cd4ab535
...
...
@@ -41,11 +41,13 @@ TEST_CASE(make_invalid_target)
TEST_CASE
(
targets
)
{
// GCC doesn't load libmigraphx_ref unless necesssary even though it is linked to the test.
// Force it to load by making ref target
#if defined(__GNUC__) && !defined(__clang__)
auto
ref_target
=
migraphx
::
make_target
(
"ref"
);
#endif
auto
ts
=
migraphx
::
get_targets
();
EXPECT
(
ts
.
size
()
==
0
);
auto
ref_t
=
migraphx
::
make_target
(
"ref"
);
ts
=
migraphx
::
get_targets
();
EXPECT
(
ts
.
size
()
==
1
);
EXPECT
(
ts
.
size
()
>=
1
);
}
int
main
(
int
argc
,
const
char
*
argv
[])
{
test
::
run
(
argc
,
argv
);
}
test/verify/main.cpp
View file @
cd4ab535
...
...
@@ -73,7 +73,10 @@ int main(int argc, const char* argv[])
"test_if_literal"
,
"test_select_module_add"
,
"test_select_module_reduce"
,
"test_select_module_conv"
});
"test_select_module_conv"
,
"test_split_single_dyn_dim"
,
"test_instancenorm_large_3d<migraphx::shape::float_type>"
,
"test_instancenorm_large_3d<migraphx::shape::half_type>"
});
rv
.
disable_test_for
(
"gpu"
,
{
"test_conv_bn_add"
});
rv
.
run
(
argc
,
argv
);
}
test/verify/run_verify.cpp
View file @
cd4ab535
...
...
@@ -67,15 +67,17 @@ inline void verify_load_save(const migraphx::program& p)
EXPECT
(
p
==
loaded
);
}
inline
void
compile_check
(
migraphx
::
program
&
p
,
const
migraphx
::
target
&
t
,
bool
show_trace
=
false
)
inline
void
compile_check
(
migraphx
::
program
&
p
,
const
migraphx
::
target
&
t
,
migraphx
::
compile_options
c_opts
,
bool
show_trace
=
false
)
{
auto
name
=
t
.
name
();
auto
shapes
=
p
.
get_output_shapes
();
std
::
stringstream
ss
;
migraphx
::
compile_options
options
;
if
(
show_trace
)
opt
ion
s
.
trace
=
migraphx
::
tracer
{
std
::
cout
};
p
.
compile
(
t
,
opt
ion
s
);
c_
opts
.
trace
=
migraphx
::
tracer
{
std
::
cout
};
p
.
compile
(
t
,
c_
opts
);
if
(
shapes
.
size
()
!=
p
.
get_output_shapes
().
size
())
{
std
::
cout
<<
ss
.
str
()
<<
std
::
endl
;
...
...
@@ -115,19 +117,23 @@ void run_verify::validate(const migraphx::target& t,
}
std
::
vector
<
migraphx
::
argument
>
run_verify
::
run_ref
(
migraphx
::
program
p
,
migraphx
::
parameter_map
inputs
)
const
migraphx
::
parameter_map
inputs
,
const
migraphx
::
compile_options
&
c_opts
)
const
{
migraphx
::
target
t
=
migraphx
::
make_target
(
"ref"
);
auto_print
pp
{
p
,
t
.
name
()};
compile_check
(
p
,
t
);
compile_check
(
p
,
t
,
c_opts
);
return
p
.
eval
(
std
::
move
(
inputs
));
}
std
::
pair
<
migraphx
::
program
,
std
::
vector
<
migraphx
::
argument
>>
run_verify
::
run_target
(
const
migraphx
::
target
&
t
,
migraphx
::
program
p
,
const
migraphx
::
parameter_map
&
inputs
)
const
std
::
pair
<
migraphx
::
program
,
std
::
vector
<
migraphx
::
argument
>>
run_verify
::
run_target
(
const
migraphx
::
target
&
t
,
migraphx
::
program
p
,
const
migraphx
::
parameter_map
&
inputs
,
const
migraphx
::
compile_options
&
c_opts
)
const
{
auto_print
pp
{
p
,
t
.
name
()};
auto
trace_target
=
migraphx
::
string_value_of
(
MIGRAPHX_TRACE_TEST_COMPILE
{});
compile_check
(
p
,
t
,
(
trace_target
==
t
.
name
()));
compile_check
(
p
,
t
,
c_opts
,
(
trace_target
==
t
.
name
()));
migraphx
::
parameter_map
m
;
for
(
auto
&&
input
:
inputs
)
{
...
...
@@ -157,7 +163,9 @@ auto get_hash(const T& x)
return
std
::
hash
<
T
>
{}(
x
);
}
void
run_verify
::
verify
(
const
std
::
string
&
name
,
const
migraphx
::
program
&
p
)
const
void
run_verify
::
verify
(
const
std
::
string
&
name
,
const
migraphx
::
program
&
p
,
const
migraphx
::
compile_options
&
c_opts
)
const
{
using
result_future
=
std
::
future
<
std
::
pair
<
migraphx
::
program
,
std
::
vector
<
migraphx
::
argument
>>>
;
...
...
@@ -197,13 +205,13 @@ void run_verify::verify(const std::string& name, const migraphx::program& p) con
}
}
auto
gold_f
=
detach_async
([
=
]
{
return
run_ref
(
p
,
m
);
});
auto
gold_f
=
detach_async
([
=
]
{
return
run_ref
(
p
,
m
,
c_opts
);
});
for
(
const
auto
&
tname
:
target_names
)
{
target_info
ti
=
get_target_info
(
tname
);
auto
t
=
migraphx
::
make_target
(
tname
);
results
.
emplace_back
(
tname
,
detach_async
([
=
]
{
return
run_target
(
t
,
p
,
m
);
},
ti
.
parallel
));
results
.
emplace_back
(
tname
,
detach_async
([
=
]
{
return
run_target
(
t
,
p
,
m
,
c_opts
);
},
ti
.
parallel
));
}
assert
(
gold_f
.
valid
());
...
...
@@ -244,7 +252,7 @@ void run_verify::run(int argc, const char* argv[]) const
for
(
auto
&&
p
:
get_programs
())
{
labels
[
p
.
section
].
push_back
(
p
.
name
);
test
::
add_test_case
(
p
.
name
,
[
=
]
{
verify
(
p
.
name
,
p
.
get_program
());
});
test
::
add_test_case
(
p
.
name
,
[
=
]
{
verify
(
p
.
name
,
p
.
get_program
()
,
p
.
compile_options
);
});
}
test
::
driver
d
{};
d
.
get_case_names
=
[
&
](
const
std
::
string
&
name
)
->
std
::
vector
<
std
::
string
>
{
...
...
test/verify/run_verify.hpp
View file @
cd4ab535
...
...
@@ -40,15 +40,19 @@ struct target_info
struct
run_verify
{
std
::
vector
<
migraphx
::
argument
>
run_ref
(
migraphx
::
program
p
,
migraphx
::
parameter_map
inputs
)
const
;
migraphx
::
parameter_map
inputs
,
const
migraphx
::
compile_options
&
c_opts
)
const
;
std
::
pair
<
migraphx
::
program
,
std
::
vector
<
migraphx
::
argument
>>
run_target
(
const
migraphx
::
target
&
t
,
migraphx
::
program
p
,
const
migraphx
::
parameter_map
&
inputs
)
const
;
const
migraphx
::
parameter_map
&
inputs
,
const
migraphx
::
compile_options
&
c_opts
)
const
;
void
validate
(
const
migraphx
::
target
&
t
,
const
migraphx
::
program
&
p
,
const
migraphx
::
parameter_map
&
m
)
const
;
void
verify
(
const
std
::
string
&
name
,
const
migraphx
::
program
&
p
)
const
;
void
verify
(
const
std
::
string
&
name
,
const
migraphx
::
program
&
p
,
const
migraphx
::
compile_options
&
c_opts
)
const
;
void
run
(
int
argc
,
const
char
*
argv
[])
const
;
target_info
get_target_info
(
const
std
::
string
&
name
)
const
;
...
...
Prev
1
…
9
10
11
12
13
14
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment