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
65cf0713
Commit
65cf0713
authored
Mar 07, 2019
by
Paul
Browse files
Fix unit tests
parent
2f7db364
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
115 additions
and
96 deletions
+115
-96
test/schedule_test.cpp
test/schedule_test.cpp
+115
-96
No files found.
test/schedule_test.cpp
View file @
65cf0713
...
@@ -49,11 +49,11 @@ struct nary_op
...
@@ -49,11 +49,11 @@ struct nary_op
struct
wait_event
struct
wait_event
{
{
std
::
vector
<
std
::
size_t
>
wait_for
;
std
::
shared_ptr
<
std
::
vector
<
std
::
size_t
>
>
wait_for
=
std
::
make_shared
<
std
::
vector
<
std
::
size_t
>>
()
;
template
<
class
Self
,
class
F
>
template
<
class
Self
,
class
F
>
static
auto
reflect
(
Self
&
self
,
F
f
)
static
auto
reflect
(
Self
&
self
,
F
f
)
{
{
return
migraphx
::
pack
(
f
(
self
.
wait_for
,
"wait_for"
));
return
migraphx
::
pack
(
f
(
*
self
.
wait_for
,
"wait_for"
));
}
}
std
::
string
name
()
const
{
return
"wait_event"
;
}
std
::
string
name
()
const
{
return
"wait_event"
;
}
migraphx
::
shape
compute_shape
(
const
std
::
vector
<
migraphx
::
shape
>&
)
const
{
return
{};
}
migraphx
::
shape
compute_shape
(
const
std
::
vector
<
migraphx
::
shape
>&
)
const
{
return
{};
}
...
@@ -62,28 +62,39 @@ struct wait_event
...
@@ -62,28 +62,39 @@ struct wait_event
const
migraphx
::
shape
&
,
const
migraphx
::
shape
&
,
const
std
::
vector
<
migraphx
::
argument
>&
)
const
const
std
::
vector
<
migraphx
::
argument
>&
)
const
{
{
assert
(
not
wait_for
.
empty
());
assert
(
wait_for
!=
nullptr
);
assert
(
not
wait_for
->
empty
());
return
{};
return
{};
}
}
};
};
using
instruction_map
=
std
::
unordered_map
<
migraphx
::
instruction_ref
,
std
::
size_t
>
;
using
instruction_map
=
std
::
unordered_map
<
migraphx
::
instruction_ref
,
std
::
size_t
>
;
using
wait_map
=
std
::
unordered_map
<
migraphx
::
instruction_ref
,
std
::
shared_ptr
<
std
::
vector
<
std
::
size_t
>>>
;
struct
schedule_model_test
struct
schedule_model_test
{
{
instruction_map
*
ins2stream
;
std
::
shared_ptr
<
instruction_map
>
ins2stream
=
std
::
make_shared
<
instruction_map
>
();
std
::
shared_ptr
<
std
::
unordered_map
<
std
::
size_t
,
std
::
size_t
>>
wait2stream
=
std
::
make_shared
<
std
::
unordered_map
<
std
::
size_t
,
std
::
size_t
>>
();
std
::
shared_ptr
<
wait_map
>
ins2wait_for
=
std
::
make_shared
<
wait_map
>
();
std
::
size_t
concurrency
()
const
{
return
4
;
}
std
::
size_t
concurrency
()
const
{
return
4
;
}
void
void
sched
ule_instruction
(
migraphx
::
program
&
,
migraphx
::
instruction_ref
ins
,
std
::
size_t
n
)
const
sched
(
migraphx
::
program
&
,
migraphx
::
instruction_ref
ins
,
std
::
size_t
n
)
const
{
{
(
*
ins2stream
)[
ins
]
=
n
;
(
*
ins2stream
)[
ins
]
=
n
;
}
}
void
wait
(
migraphx
::
program
&
p
,
void
wait
(
migraphx
::
program
&
p
,
migraphx
::
instruction_ref
ins
,
std
::
size_t
wait_id
)
const
migraphx
::
instruction_ref
ins
,
std
::
size_t
,
const
std
::
vector
<
std
::
size_t
>&
wait_for
)
const
{
{
p
.
insert_instruction
(
ins
,
wait_event
{
wait_for
});
if
(
ins2wait_for
->
count
(
ins
)
==
0
)
{
auto
event
=
wait_event
{};
p
.
insert_instruction
(
ins
,
event
);
(
*
ins2wait_for
)[
ins
]
=
event
.
wait_for
;
}
(
*
ins2wait_for
)[
ins
]
->
push_back
(
wait2stream
->
at
(
wait_id
));
}
void
record
(
migraphx
::
program
&
p
,
migraphx
::
instruction_ref
ins
,
std
::
size_t
wait_id
)
const
{
(
*
wait2stream
)[
wait_id
]
=
ins2stream
->
at
(
ins
);
}
}
std
::
size_t
weight
(
const
migraphx
::
operation
&
op
)
const
std
::
size_t
weight
(
const
migraphx
::
operation
&
op
)
const
{
{
...
@@ -96,13 +107,23 @@ struct schedule_model_test
...
@@ -96,13 +107,23 @@ struct schedule_model_test
struct
schedule_target
struct
schedule_target
{
{
instruction_map
*
ins2stream
;
schedule_model_test
model
{}
;
std
::
string
name
()
const
{
return
"schedule"
;
}
std
::
string
name
()
const
{
return
"schedule"
;
}
std
::
vector
<
migraphx
::
pass
>
get_passes
(
migraphx
::
context
&
)
const
std
::
vector
<
migraphx
::
pass
>
get_passes
(
migraphx
::
context
&
)
const
{
{
return
{
migraphx
::
schedule
{
schedule_model_test
{
ins2stream
}
}};
return
{
migraphx
::
schedule
{
model
}};
}
}
migraphx
::
context
get_context
()
const
{
return
{};
}
migraphx
::
context
get_context
()
const
{
return
{};
}
std
::
size_t
get_stream
(
migraphx
::
instruction_ref
ins
)
{
return
model
.
ins2stream
->
at
(
ins
);
}
bool
has_stream
(
migraphx
::
instruction_ref
ins
)
{
return
model
.
ins2stream
->
count
(
ins
)
>
0
;
}
};
};
bool
check_conflicts
(
migraphx
::
program
&
p
,
migraphx
::
instruction_ref
x
,
migraphx
::
instruction_ref
y
)
bool
check_conflicts
(
migraphx
::
program
&
p
,
migraphx
::
instruction_ref
x
,
migraphx
::
instruction_ref
y
)
...
@@ -166,7 +187,7 @@ std::vector<std::size_t> get_wait_for(migraphx::instruction_ref ins)
...
@@ -166,7 +187,7 @@ std::vector<std::size_t> get_wait_for(migraphx::instruction_ref ins)
auto
wait_ins
=
std
::
prev
(
ins
);
auto
wait_ins
=
std
::
prev
(
ins
);
if
(
wait_ins
->
name
()
!=
"wait_event"
)
if
(
wait_ins
->
name
()
!=
"wait_event"
)
return
{};
return
{};
auto
wf
=
migraphx
::
any_cast
<
wait_event
>
(
wait_ins
->
get_operator
()).
wait_for
;
auto
wf
=
*
migraphx
::
any_cast
<
wait_event
>
(
wait_ins
->
get_operator
()).
wait_for
;
std
::
sort
(
wf
.
begin
(),
wf
.
end
());
std
::
sort
(
wf
.
begin
(),
wf
.
end
());
return
wf
;
return
wf
;
}
}
...
@@ -183,36 +204,35 @@ chain(migraphx::program& p, std::size_t n, T x, migraphx::instruction_ref input)
...
@@ -183,36 +204,35 @@ chain(migraphx::program& p, std::size_t n, T x, migraphx::instruction_ref input)
}
}
return
result
;
return
result
;
}
}
TEST_CASE
(
single_entry
)
TEST_CASE
(
single_entry
)
{
{
instruction_map
stream
;
schedule_target
t
{}
;
migraphx
::
program
p
;
migraphx
::
program
p
;
auto
one
=
p
.
add_literal
(
1
);
auto
one
=
p
.
add_literal
(
1
);
auto
onep1
=
p
.
add_instruction
(
unary_op
{},
one
);
auto
onep1
=
p
.
add_instruction
(
unary_op
{},
one
);
auto
onep2
=
p
.
add_instruction
(
unary_op
{},
one
);
auto
onep2
=
p
.
add_instruction
(
unary_op
{},
one
);
auto
binary
=
p
.
add_instruction
(
nary_op
{},
onep1
,
onep2
);
auto
binary
=
p
.
add_instruction
(
nary_op
{},
onep1
,
onep2
);
p
.
compile
(
schedule_target
{
&
stream
}
);
p
.
compile
(
t
);
EXPECT
(
stream
.
count
(
one
)
==
0
);
EXPECT
(
not
t
.
has_stream
(
one
)
);
EXPECT
(
stream
.
at
(
onep1
)
!=
stream
.
at
(
onep2
));
EXPECT
(
t
.
get_
stream
(
onep1
)
!=
t
.
get_
stream
(
onep2
));
EXPECT
(
stream
.
at
(
binary
)
==
0
);
EXPECT
(
t
.
get_
stream
(
binary
)
==
0
);
EXPECT
(
get_wait_for
(
binary
)
==
get_wait_for
(
stream
[
binary
]
,
{
stream
[
onep1
]
,
stream
[
onep2
]
}));
EXPECT
(
get_wait_for
(
binary
)
==
get_wait_for
(
t
.
get_
stream
(
binary
)
,
{
t
.
get_
stream
(
onep1
)
,
t
.
get_
stream
(
onep2
)
}));
EXPECT
(
check_conflicts
(
p
,
onep1
,
onep2
));
EXPECT
(
check_conflicts
(
p
,
onep1
,
onep2
));
}
}
TEST_CASE
(
zero_merge1
)
TEST_CASE
(
zero_merge1
)
{
{
instruction_map
stream
;
schedule_target
t
{}
;
migraphx
::
program
p
;
migraphx
::
program
p
;
auto
one
=
p
.
add_literal
(
1
);
auto
one
=
p
.
add_literal
(
1
);
auto
onep1
=
p
.
add_instruction
(
unary_op
{},
one
);
auto
onep1
=
p
.
add_instruction
(
unary_op
{},
one
);
auto
onep2
=
p
.
add_instruction
(
unary_op
{},
one
);
auto
onep2
=
p
.
add_instruction
(
unary_op
{},
one
);
auto
binary
=
p
.
add_instruction
(
migraphx
::
op
::
identity
{},
onep1
,
onep2
);
auto
binary
=
p
.
add_instruction
(
migraphx
::
op
::
identity
{},
onep1
,
onep2
);
p
.
compile
(
schedule_target
{
&
stream
}
);
p
.
compile
(
t
);
EXPECT
(
stream
.
count
(
one
)
==
0
);
EXPECT
(
not
t
.
has_stream
(
one
)
);
EXPECT
(
stream
.
at
(
onep1
)
!=
stream
.
at
(
onep2
));
EXPECT
(
t
.
get_
stream
(
onep1
)
!=
t
.
get_
stream
(
onep2
));
// No stream assignment
// No stream assignment
EXPECT
(
stream
.
count
(
binary
)
==
0
);
EXPECT
(
not
t
.
has_
stream
(
binary
));
// There is no wait
// There is no wait
EXPECT
(
get_wait_for
(
binary
).
empty
());
EXPECT
(
get_wait_for
(
binary
).
empty
());
EXPECT
(
check_conflicts
(
p
,
onep1
,
onep2
));
EXPECT
(
check_conflicts
(
p
,
onep1
,
onep2
));
...
@@ -220,7 +240,7 @@ TEST_CASE(zero_merge1)
...
@@ -220,7 +240,7 @@ TEST_CASE(zero_merge1)
TEST_CASE
(
zero_merge2
)
TEST_CASE
(
zero_merge2
)
{
{
instruction_map
stream
;
schedule_target
t
{}
;
migraphx
::
program
p
;
migraphx
::
program
p
;
auto
one
=
p
.
add_literal
(
1
);
auto
one
=
p
.
add_literal
(
1
);
auto
onep1
=
p
.
add_instruction
(
unary_op
{},
one
);
auto
onep1
=
p
.
add_instruction
(
unary_op
{},
one
);
...
@@ -228,11 +248,11 @@ TEST_CASE(zero_merge2)
...
@@ -228,11 +248,11 @@ TEST_CASE(zero_merge2)
auto
binary
=
p
.
add_instruction
(
migraphx
::
op
::
identity
{},
auto
binary
=
p
.
add_instruction
(
migraphx
::
op
::
identity
{},
p
.
add_instruction
(
migraphx
::
op
::
identity
{},
onep1
),
p
.
add_instruction
(
migraphx
::
op
::
identity
{},
onep1
),
p
.
add_instruction
(
migraphx
::
op
::
identity
{},
onep2
));
p
.
add_instruction
(
migraphx
::
op
::
identity
{},
onep2
));
p
.
compile
(
schedule_target
{
&
stream
}
);
p
.
compile
(
t
);
EXPECT
(
stream
.
count
(
one
)
==
0
);
EXPECT
(
not
t
.
has_stream
(
one
)
);
EXPECT
(
stream
.
at
(
onep1
)
!=
stream
.
at
(
onep2
));
EXPECT
(
t
.
get_
stream
(
onep1
)
!=
t
.
get_
stream
(
onep2
));
// No stream assignment
// No stream assignment
EXPECT
(
stream
.
count
(
binary
)
==
0
);
EXPECT
(
not
t
.
has_
stream
(
binary
));
// There is no wait
// There is no wait
EXPECT
(
get_wait_for
(
binary
).
empty
());
EXPECT
(
get_wait_for
(
binary
).
empty
());
EXPECT
(
check_conflicts
(
p
,
onep1
,
onep2
));
EXPECT
(
check_conflicts
(
p
,
onep1
,
onep2
));
...
@@ -240,43 +260,43 @@ TEST_CASE(zero_merge2)
...
@@ -240,43 +260,43 @@ TEST_CASE(zero_merge2)
TEST_CASE
(
double_entry
)
TEST_CASE
(
double_entry
)
{
{
instruction_map
stream
;
schedule_target
t
{}
;
migraphx
::
program
p
;
migraphx
::
program
p
;
auto
one
=
p
.
add_literal
(
1
);
auto
one
=
p
.
add_literal
(
1
);
auto
two
=
p
.
add_literal
(
2
);
auto
two
=
p
.
add_literal
(
2
);
auto
onep
=
p
.
add_instruction
(
unary_op
{},
one
);
auto
onep
=
p
.
add_instruction
(
unary_op
{},
one
);
auto
twop
=
p
.
add_instruction
(
unary_op
{},
two
);
auto
twop
=
p
.
add_instruction
(
unary_op
{},
two
);
auto
binary
=
p
.
add_instruction
(
nary_op
{},
onep
,
twop
);
auto
binary
=
p
.
add_instruction
(
nary_op
{},
onep
,
twop
);
p
.
compile
(
schedule_target
{
&
stream
}
);
p
.
compile
(
t
);
EXPECT
(
stream
.
count
(
one
)
==
0
);
EXPECT
(
not
t
.
has_stream
(
one
)
);
EXPECT
(
stream
.
count
(
two
)
==
0
);
EXPECT
(
not
t
.
has_stream
(
two
)
);
EXPECT
(
stream
.
at
(
onep
)
!=
stream
.
at
(
twop
));
EXPECT
(
t
.
get_
stream
(
onep
)
!=
t
.
get_
stream
(
twop
));
EXPECT
(
stream
.
at
(
binary
)
==
0
);
EXPECT
(
t
.
get_
stream
(
binary
)
==
0
);
EXPECT
(
get_wait_for
(
binary
)
==
get_wait_for
(
stream
[
binary
]
,
{
stream
[
onep
]
,
stream
[
twop
]
}));
EXPECT
(
get_wait_for
(
binary
)
==
get_wait_for
(
t
.
get_
stream
(
binary
)
,
{
t
.
get_
stream
(
onep
)
,
t
.
get_
stream
(
twop
)
}));
// EXPECT(check_conflicts(p, onep, twop));
// EXPECT(check_conflicts(p, onep, twop));
}
}
TEST_CASE
(
two_branches
)
TEST_CASE
(
two_branches
)
{
{
instruction_map
stream
;
schedule_target
t
{}
;
migraphx
::
program
p
;
migraphx
::
program
p
;
auto
one
=
p
.
add_literal
(
1
);
auto
one
=
p
.
add_literal
(
1
);
auto
c1
=
chain
(
p
,
2
,
unary_op
{},
one
);
auto
c1
=
chain
(
p
,
2
,
unary_op
{},
one
);
auto
i1
=
p
.
add_instruction
(
unary_op
{},
one
);
auto
i1
=
p
.
add_instruction
(
unary_op
{},
one
);
auto
binary
=
p
.
add_instruction
(
nary_op
{},
i1
,
c1
.
back
());
auto
binary
=
p
.
add_instruction
(
nary_op
{},
i1
,
c1
.
back
());
p
.
compile
(
schedule_target
{
&
stream
}
);
p
.
compile
(
t
);
EXPECT
(
stream
.
count
(
one
)
==
0
);
EXPECT
(
not
t
.
has_stream
(
one
)
);
EXPECT
(
stream
.
at
(
i1
)
==
1
);
EXPECT
(
t
.
get_
stream
(
i1
)
==
1
);
for
(
auto
ins
:
c1
)
for
(
auto
ins
:
c1
)
EXPECT
(
stream
.
at
(
ins
)
==
0
);
EXPECT
(
t
.
get_
stream
(
ins
)
==
0
);
EXPECT
(
stream
.
at
(
binary
)
==
0
);
EXPECT
(
t
.
get_
stream
(
binary
)
==
0
);
EXPECT
(
get_wait_for
(
binary
)
==
get_wait_for
(
stream
[
binary
]
,
{
stream
[
c1
.
back
()
]
,
stream
[
i1
]
}));
EXPECT
(
get_wait_for
(
binary
)
==
get_wait_for
(
t
.
get_
stream
(
binary
)
,
{
t
.
get_
stream
(
c1
.
back
()
)
,
t
.
get_
stream
(
i1
)
}));
check_conflicts
(
p
,
{
c1
,
{
i1
}});
check_conflicts
(
p
,
{
c1
,
{
i1
}});
}
}
TEST_CASE
(
four_branches
)
TEST_CASE
(
four_branches
)
{
{
instruction_map
stream
;
schedule_target
t
{}
;
migraphx
::
program
p
;
migraphx
::
program
p
;
auto
one
=
p
.
add_literal
(
1
);
auto
one
=
p
.
add_literal
(
1
);
auto
c1
=
chain
(
p
,
4
,
unary_op
{},
one
);
auto
c1
=
chain
(
p
,
4
,
unary_op
{},
one
);
...
@@ -284,25 +304,25 @@ TEST_CASE(four_branches)
...
@@ -284,25 +304,25 @@ TEST_CASE(four_branches)
auto
c3
=
chain
(
p
,
2
,
unary_op
{},
one
);
auto
c3
=
chain
(
p
,
2
,
unary_op
{},
one
);
auto
i1
=
p
.
add_instruction
(
unary_op
{},
one
);
auto
i1
=
p
.
add_instruction
(
unary_op
{},
one
);
auto
binary
=
p
.
add_instruction
(
nary_op
{},
i1
,
c1
.
back
(),
c2
.
back
(),
c3
.
back
());
auto
binary
=
p
.
add_instruction
(
nary_op
{},
i1
,
c1
.
back
(),
c2
.
back
(),
c3
.
back
());
p
.
compile
(
schedule_target
{
&
stream
}
);
p
.
compile
(
t
);
EXPECT
(
stream
.
count
(
one
)
==
0
);
EXPECT
(
not
t
.
has_stream
(
one
)
);
EXPECT
(
stream
.
at
(
i1
)
==
3
);
EXPECT
(
t
.
get_
stream
(
i1
)
==
3
);
for
(
auto
ins
:
c1
)
for
(
auto
ins
:
c1
)
EXPECT
(
stream
.
at
(
ins
)
==
0
);
EXPECT
(
t
.
get_
stream
(
ins
)
==
0
);
for
(
auto
ins
:
c2
)
for
(
auto
ins
:
c2
)
EXPECT
(
stream
.
at
(
ins
)
==
1
);
EXPECT
(
t
.
get_
stream
(
ins
)
==
1
);
for
(
auto
ins
:
c3
)
for
(
auto
ins
:
c3
)
EXPECT
(
stream
.
at
(
ins
)
==
2
);
EXPECT
(
t
.
get_
stream
(
ins
)
==
2
);
EXPECT
(
stream
.
at
(
binary
)
==
0
);
EXPECT
(
t
.
get_
stream
(
binary
)
==
0
);
EXPECT
(
get_wait_for
(
binary
)
==
EXPECT
(
get_wait_for
(
binary
)
==
get_wait_for
(
stream
[
binary
]
,
get_wait_for
(
t
.
get_
stream
(
binary
)
,
{
stream
[
c1
.
back
()
]
,
stream
[
c2
.
back
()
]
,
stream
[
c3
.
back
()
]
,
stream
[
i1
]
}));
{
t
.
get_
stream
(
c1
.
back
()
)
,
t
.
get_
stream
(
c2
.
back
()
)
,
t
.
get_
stream
(
c3
.
back
()
)
,
t
.
get_
stream
(
i1
)
}));
check_conflicts
(
p
,
{
c1
,
c2
,
c3
,
{
i1
}});
check_conflicts
(
p
,
{
c1
,
c2
,
c3
,
{
i1
}});
}
}
TEST_CASE
(
five_branches
)
TEST_CASE
(
five_branches
)
{
{
instruction_map
stream
;
schedule_target
t
{}
;
migraphx
::
program
p
;
migraphx
::
program
p
;
auto
one
=
p
.
add_literal
(
1
);
auto
one
=
p
.
add_literal
(
1
);
auto
c1
=
chain
(
p
,
5
,
unary_op
{},
one
);
auto
c1
=
chain
(
p
,
5
,
unary_op
{},
one
);
...
@@ -311,28 +331,28 @@ TEST_CASE(five_branches)
...
@@ -311,28 +331,28 @@ TEST_CASE(five_branches)
auto
c4
=
chain
(
p
,
2
,
unary_op
{},
one
);
auto
c4
=
chain
(
p
,
2
,
unary_op
{},
one
);
auto
i1
=
p
.
add_instruction
(
unary_op
{},
one
);
auto
i1
=
p
.
add_instruction
(
unary_op
{},
one
);
auto
binary
=
p
.
add_instruction
(
nary_op
{},
i1
,
c1
.
back
(),
c2
.
back
(),
c3
.
back
(),
c4
.
back
());
auto
binary
=
p
.
add_instruction
(
nary_op
{},
i1
,
c1
.
back
(),
c2
.
back
(),
c3
.
back
(),
c4
.
back
());
p
.
compile
(
schedule_target
{
&
stream
}
);
p
.
compile
(
t
);
EXPECT
(
stream
.
count
(
one
)
==
0
);
EXPECT
(
not
t
.
has_stream
(
one
)
);
EXPECT
(
stream
.
at
(
i1
)
==
3
);
EXPECT
(
t
.
get_
stream
(
i1
)
==
3
);
for
(
auto
ins
:
c1
)
for
(
auto
ins
:
c1
)
EXPECT
(
stream
.
at
(
ins
)
==
0
);
EXPECT
(
t
.
get_
stream
(
ins
)
==
0
);
for
(
auto
ins
:
c2
)
for
(
auto
ins
:
c2
)
EXPECT
(
stream
.
at
(
ins
)
==
1
);
EXPECT
(
t
.
get_
stream
(
ins
)
==
1
);
for
(
auto
ins
:
c3
)
for
(
auto
ins
:
c3
)
EXPECT
(
stream
.
at
(
ins
)
==
2
);
EXPECT
(
t
.
get_
stream
(
ins
)
==
2
);
for
(
auto
ins
:
c4
)
for
(
auto
ins
:
c4
)
EXPECT
(
stream
.
at
(
ins
)
==
3
);
EXPECT
(
t
.
get_
stream
(
ins
)
==
3
);
EXPECT
(
stream
.
at
(
binary
)
==
0
);
EXPECT
(
t
.
get_
stream
(
binary
)
==
0
);
EXPECT
(
get_wait_for
(
binary
)
==
EXPECT
(
get_wait_for
(
binary
)
==
get_wait_for
(
stream
[
binary
]
,
get_wait_for
(
t
.
get_
stream
(
binary
)
,
{
stream
[
c1
.
back
()
]
,
stream
[
c2
.
back
()
]
,
stream
[
c3
.
back
()
]
,
stream
[
i1
]
}));
{
t
.
get_
stream
(
c1
.
back
()
)
,
t
.
get_
stream
(
c2
.
back
()
)
,
t
.
get_
stream
(
c3
.
back
()
)
,
t
.
get_
stream
(
i1
)
}));
check_conflicts
(
p
,
{
c1
,
c2
,
c3
,
c4
});
check_conflicts
(
p
,
{
c1
,
c2
,
c3
,
c4
});
check_conflicts
(
p
,
{
c1
,
c2
,
c3
,
{
i1
}});
check_conflicts
(
p
,
{
c1
,
c2
,
c3
,
{
i1
}});
}
}
TEST_CASE
(
four_branches_eq
)
TEST_CASE
(
four_branches_eq
)
{
{
instruction_map
stream
;
schedule_target
t
{}
;
migraphx
::
program
p
;
migraphx
::
program
p
;
auto
one
=
p
.
add_literal
(
1
);
auto
one
=
p
.
add_literal
(
1
);
auto
onep1
=
p
.
add_instruction
(
unary_op
{},
one
);
auto
onep1
=
p
.
add_instruction
(
unary_op
{},
one
);
...
@@ -340,22 +360,22 @@ TEST_CASE(four_branches_eq)
...
@@ -340,22 +360,22 @@ TEST_CASE(four_branches_eq)
auto
onep3
=
p
.
add_instruction
(
unary_op
{},
one
);
auto
onep3
=
p
.
add_instruction
(
unary_op
{},
one
);
auto
onep4
=
p
.
add_instruction
(
unary_op
{},
one
);
auto
onep4
=
p
.
add_instruction
(
unary_op
{},
one
);
auto
binary
=
p
.
add_instruction
(
nary_op
{},
onep1
,
onep2
,
onep3
,
onep4
);
auto
binary
=
p
.
add_instruction
(
nary_op
{},
onep1
,
onep2
,
onep3
,
onep4
);
p
.
compile
(
schedule_target
{
&
stream
}
);
p
.
compile
(
t
);
EXPECT
(
stream
.
count
(
one
)
==
0
);
EXPECT
(
not
t
.
has_stream
(
one
)
);
EXPECT
(
sorted
<
std
::
size_t
>
(
EXPECT
(
sorted
<
std
::
size_t
>
(
{
stream
.
at
(
onep1
),
stream
.
at
(
onep2
),
stream
.
at
(
onep3
),
stream
.
at
(
onep4
)})
==
{
t
.
get_
stream
(
onep1
),
t
.
get_
stream
(
onep2
),
t
.
get_
stream
(
onep3
),
t
.
get_
stream
(
onep4
)})
==
unique
<
std
::
size_t
>
(
unique
<
std
::
size_t
>
(
{
stream
.
at
(
onep1
),
stream
.
at
(
onep2
),
stream
.
at
(
onep3
),
stream
.
at
(
onep4
)}));
{
t
.
get_
stream
(
onep1
),
t
.
get_
stream
(
onep2
),
t
.
get_
stream
(
onep3
),
t
.
get_
stream
(
onep4
)}));
EXPECT
(
stream
.
at
(
binary
)
==
0
);
EXPECT
(
t
.
get_
stream
(
binary
)
==
0
);
EXPECT
(
EXPECT
(
get_wait_for
(
binary
)
==
get_wait_for
(
binary
)
==
get_wait_for
(
stream
[
binary
]
,
{
stream
[
onep1
]
,
stream
[
onep2
]
,
stream
[
onep3
]
,
stream
[
onep4
]
}));
get_wait_for
(
t
.
get_
stream
(
binary
)
,
{
t
.
get_
stream
(
onep1
)
,
t
.
get_
stream
(
onep2
)
,
t
.
get_
stream
(
onep3
)
,
t
.
get_
stream
(
onep4
)
}));
check_conflicts
(
p
,
{{
onep1
},
{
onep2
},
{
onep3
},
{
onep4
}});
check_conflicts
(
p
,
{{
onep1
},
{
onep2
},
{
onep3
},
{
onep4
}});
}
}
TEST_CASE
(
seq_merge
)
TEST_CASE
(
seq_merge
)
{
{
instruction_map
stream
;
schedule_target
t
{}
;
migraphx
::
program
p
;
migraphx
::
program
p
;
auto
one
=
p
.
add_literal
(
1
);
auto
one
=
p
.
add_literal
(
1
);
auto
c1
=
chain
(
p
,
2
,
unary_op
{},
one
);
auto
c1
=
chain
(
p
,
2
,
unary_op
{},
one
);
...
@@ -366,27 +386,27 @@ TEST_CASE(seq_merge)
...
@@ -366,27 +386,27 @@ TEST_CASE(seq_merge)
auto
i2
=
p
.
add_instruction
(
unary_op
{},
binary1
);
auto
i2
=
p
.
add_instruction
(
unary_op
{},
binary1
);
auto
binary2
=
p
.
add_instruction
(
nary_op
{},
i2
,
c2
.
back
());
auto
binary2
=
p
.
add_instruction
(
nary_op
{},
i2
,
c2
.
back
());
p
.
compile
(
schedule_target
{
&
stream
}
);
p
.
compile
(
t
);
EXPECT
(
stream
.
count
(
one
)
==
0
);
EXPECT
(
not
t
.
has_stream
(
one
)
);
EXPECT
(
stream
.
at
(
i1
)
==
2
);
EXPECT
(
t
.
get_
stream
(
i1
)
==
2
);
for
(
auto
ins
:
c1
)
for
(
auto
ins
:
c1
)
EXPECT
(
stream
.
at
(
ins
)
==
3
);
EXPECT
(
t
.
get_
stream
(
ins
)
==
3
);
EXPECT
(
stream
.
at
(
binary1
)
==
3
);
EXPECT
(
t
.
get_
stream
(
binary1
)
==
3
);
EXPECT
(
get_wait_for
(
binary1
)
==
get_wait_for
(
stream
[
binary1
]
,
{
stream
[
c1
.
back
()
]
,
stream
[
i1
]
}));
EXPECT
(
get_wait_for
(
binary1
)
==
get_wait_for
(
t
.
get_
stream
(
binary1
)
,
{
t
.
get_
stream
(
c1
.
back
()
)
,
t
.
get_
stream
(
i1
)
}));
check_conflicts
(
p
,
{
c1
,
{
i1
}});
check_conflicts
(
p
,
{
c1
,
{
i1
}});
EXPECT
(
stream
.
at
(
i2
)
==
3
);
EXPECT
(
t
.
get_
stream
(
i2
)
==
3
);
for
(
auto
ins
:
c2
)
for
(
auto
ins
:
c2
)
EXPECT
(
stream
.
at
(
ins
)
==
0
);
EXPECT
(
t
.
get_
stream
(
ins
)
==
0
);
EXPECT
(
stream
.
at
(
binary2
)
==
0
);
EXPECT
(
t
.
get_
stream
(
binary2
)
==
0
);
EXPECT
(
get_wait_for
(
binary2
)
==
get_wait_for
(
stream
[
binary2
]
,
{
stream
[
c2
.
back
()
]
,
stream
[
i2
]
}));
EXPECT
(
get_wait_for
(
binary2
)
==
get_wait_for
(
t
.
get_
stream
(
binary2
)
,
{
t
.
get_
stream
(
c2
.
back
()
)
,
t
.
get_
stream
(
i2
)
}));
check_conflicts
(
p
,
{
c2
,
{
i2
}});
check_conflicts
(
p
,
{
c2
,
{
i2
}});
}
}
TEST_CASE
(
par_merge
)
TEST_CASE
(
par_merge
)
{
{
instruction_map
stream
;
schedule_target
t
{}
;
migraphx
::
program
p
;
migraphx
::
program
p
;
auto
one
=
p
.
add_literal
(
1
);
auto
one
=
p
.
add_literal
(
1
);
auto
start1
=
p
.
add_instruction
(
unary_op
{},
one
);
auto
start1
=
p
.
add_instruction
(
unary_op
{},
one
);
...
@@ -401,25 +421,24 @@ TEST_CASE(par_merge)
...
@@ -401,25 +421,24 @@ TEST_CASE(par_merge)
auto
binary3
=
p
.
add_instruction
(
nary_op
{},
binary1
,
binary2
);
auto
binary3
=
p
.
add_instruction
(
nary_op
{},
binary1
,
binary2
);
p
.
compile
(
schedule_target
{
&
stream
}
);
p
.
compile
(
t
);
EXPECT
(
stream
.
count
(
one
)
==
0
);
EXPECT
(
not
t
.
has_stream
(
one
)
);
EXPECT
(
stream
.
at
(
binary3
)
==
0
);
EXPECT
(
t
.
get_
stream
(
binary3
)
==
0
);
EXPECT
(
stream
.
at
(
i1
)
==
1
);
EXPECT
(
t
.
get_
stream
(
i1
)
==
2
);
for
(
auto
ins
:
c1
)
for
(
auto
ins
:
c1
)
EXPECT
(
stream
.
at
(
ins
)
==
0
);
EXPECT
(
t
.
get_
stream
(
ins
)
==
0
);
EXPECT
(
stream
.
at
(
binary1
)
==
0
);
EXPECT
(
t
.
get_
stream
(
binary1
)
==
0
);
EXPECT
(
get_wait_for
(
binary1
)
==
get_wait_for
(
stream
[
binary1
]
,
{
stream
[
c1
.
back
()
]
,
stream
[
i1
]
}));
EXPECT
(
get_wait_for
(
binary1
)
==
get_wait_for
(
t
.
get_
stream
(
binary1
)
,
{
t
.
get_
stream
(
c1
.
back
()
)
,
t
.
get_
stream
(
i1
)
}));
check_conflicts
(
p
,
{
c1
,
{
i1
}});
check_conflicts
(
p
,
{
c1
,
{
i1
}});
EXPECT
(
stream
.
at
(
i2
)
==
2
);
EXPECT
(
t
.
get_
stream
(
i2
)
==
1
);
for
(
auto
ins
:
c2
)
for
(
auto
ins
:
c2
)
EXPECT
(
stream
.
at
(
ins
)
==
3
);
EXPECT
(
t
.
get_
stream
(
ins
)
==
3
);
EXPECT
(
stream
.
at
(
binary2
)
==
3
);
EXPECT
(
t
.
get_
stream
(
binary2
)
==
3
);
EXPECT
(
get_wait_for
(
binary2
)
==
get_wait_for
(
stream
[
binary2
]
,
{
stream
[
c2
.
back
()
]
,
stream
[
i2
]
}));
EXPECT
(
get_wait_for
(
binary2
)
==
get_wait_for
(
t
.
get_
stream
(
binary2
)
,
{
t
.
get_
stream
(
c2
.
back
()
)
,
t
.
get_
stream
(
i2
)
}));
check_conflicts
(
p
,
{
c2
,
{
i2
}});
check_conflicts
(
p
,
{
c2
,
{
i2
}});
EXPECT
(
check_conflicts
(
p
,
binary1
,
binary2
));
EXPECT
(
check_conflicts
(
p
,
binary1
,
binary2
));
}
}
int
main
(
int
argc
,
const
char
*
argv
[])
{
test
::
run
(
argc
,
argv
);
}
int
main
(
int
argc
,
const
char
*
argv
[])
{
test
::
run
(
argc
,
argv
);
}
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