Commit 81fb85e7 authored by Paul's avatar Paul
Browse files

Add test with concurrent merge points

parent 4c6391ca
......@@ -121,14 +121,14 @@ bool check_conflicts(migraphx::program& p, migraphx::instruction_ref x, migraphx
}
void check_conflicts(migraphx::program& p,
std::vector<std::vector<migraphx::instruction_ref>> conflicts)
std::vector<std::vector<migraphx::instruction_ref>> conflicts, bool result = true)
{
migraphx::dfor(conflicts.size(), conflicts.size())([&](auto i, auto j) {
if(i == j)
return;
for(auto ins1 : conflicts[i])
for(auto ins2 : conflicts[j])
CHECK(check_conflicts(p, ins1, ins2));
CHECK(check_conflicts(p, ins1, ins2) == result);
});
}
......@@ -196,7 +196,7 @@ TEST_CASE(double_entry)
// EXPECT(check_conflicts(p, onep, twop));
}
TEST_CASE(two_weights)
TEST_CASE(two_branches)
{
instruction_map stream;
migraphx::program p;
......@@ -214,7 +214,7 @@ TEST_CASE(two_weights)
check_conflicts(p, {c1, {i1}});
}
TEST_CASE(four_weights)
TEST_CASE(four_branches)
{
instruction_map stream;
migraphx::program p;
......@@ -240,7 +240,7 @@ TEST_CASE(four_weights)
check_conflicts(p, {c1, c2, c3, {i1}});
}
TEST_CASE(five_weights)
TEST_CASE(five_branches)
{
instruction_map stream;
migraphx::program p;
......@@ -270,4 +270,73 @@ TEST_CASE(five_weights)
check_conflicts(p, {c1, c2, c3, {i1}});
}
TEST_CASE(seq_merge)
{
instruction_map stream;
migraphx::program p;
auto one = p.add_literal(1);
auto c1 = chain(p, 2, unary_op{}, one);
auto i1 = p.add_instruction(unary_op{}, one);
auto binary1 = p.add_instruction(nary_op{}, i1, c1.back());
auto c2 = chain(p, 2, unary_op{}, binary1);
auto i2 = p.add_instruction(unary_op{}, binary1);
auto binary2 = p.add_instruction(nary_op{}, i2, c2.back());
p.compile(schedule_target{&stream});
EXPECT(stream.count(one) == 0);
EXPECT(stream.at(i1) == 1);
for(auto ins : c1)
EXPECT(stream.at(ins) == 0);
EXPECT(stream.at(binary1) == 0);
EXPECT(get_wait_for(binary1) == get_wait_for(stream[binary1], {stream[c1.back()], stream[i1]}));
check_conflicts(p, {c1, {i1}});
EXPECT(stream.at(i2) == 1);
for(auto ins : c2)
EXPECT(stream.at(ins) == 0);
EXPECT(stream.at(binary2) == 0);
EXPECT(get_wait_for(binary2) == get_wait_for(stream[binary2], {stream[c2.back()], stream[i2]}));
check_conflicts(p, {c2, {i2}});
}
TEST_CASE(par_merge)
{
instruction_map stream;
migraphx::program p;
auto one = p.add_literal(1);
auto start1 = p.add_instruction(unary_op{}, one);
auto c1 = chain(p, 3, unary_op{}, start1);
auto i1 = p.add_instruction(unary_op{}, start1);
auto binary1 = p.add_instruction(nary_op{}, i1, c1.back());
auto start2 = p.add_instruction(unary_op{}, one);
auto c2 = chain(p, 2, unary_op{}, start2);
auto i2 = p.add_instruction(unary_op{}, start2);
auto binary2 = p.add_instruction(nary_op{}, i2, c2.back());
auto binary3 = p.add_instruction(nary_op{}, binary1, binary2);
p.compile(schedule_target{&stream});
EXPECT(stream.count(one) == 0);
EXPECT(stream.at(binary3) == 0);
EXPECT(stream.at(i1) == 1);
for(auto ins : c1)
EXPECT(stream.at(ins) == 0);
EXPECT(stream.at(binary1) == 0);
EXPECT(get_wait_for(binary1) == get_wait_for(stream[binary1], {stream[c1.back()], stream[i1]}));
check_conflicts(p, {c1, {i1}});
EXPECT(stream.at(i2) == 2);
for(auto ins : c2)
EXPECT(stream.at(ins) == 1);
EXPECT(stream.at(binary2) == 1);
EXPECT(get_wait_for(binary2) == get_wait_for(stream[binary2], {stream[c2.back()], stream[i2]}));
check_conflicts(p, {c2, {i2}});
EXPECT(check_conflicts(p, binary1, binary2));
}
int main(int argc, const char* argv[]) { test::run(argc, argv); }
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment