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
df78aadf
"vscode:/vscode.git/clone" did not exist on "19e6796eac59f691c07b1ff9d7fc13b47a53d3c4"
Commit
df78aadf
authored
Aug 23, 2018
by
wsttiger
Browse files
merged from master
parents
ba934fc2
58681660
Changes
32
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
268 additions
and
61 deletions
+268
-61
src/dead_code_elimination.cpp
src/dead_code_elimination.cpp
+2
-2
src/generate.cpp
src/generate.cpp
+8
-2
src/include/migraph/check_shapes.hpp
src/include/migraph/check_shapes.hpp
+2
-2
src/include/migraph/context.hpp
src/include/migraph/context.hpp
+20
-8
src/include/migraph/generate.hpp
src/include/migraph/generate.hpp
+35
-9
src/include/migraph/literal.hpp
src/include/migraph/literal.hpp
+13
-0
src/include/migraph/operators.hpp
src/include/migraph/operators.hpp
+1
-1
src/include/migraph/program.hpp
src/include/migraph/program.hpp
+2
-1
src/include/migraph/requires.hpp
src/include/migraph/requires.hpp
+26
-3
src/include/migraph/tensor_view.hpp
src/include/migraph/tensor_view.hpp
+4
-4
src/include/migraph/tracer.hpp
src/include/migraph/tracer.hpp
+40
-0
src/include/migraph/verify.hpp
src/include/migraph/verify.hpp
+3
-1
src/onnx/verify_onnx.cpp
src/onnx/verify_onnx.cpp
+8
-3
src/program.cpp
src/program.cpp
+46
-22
src/targets/cpu/cpu_lowering.cpp
src/targets/cpu/cpu_lowering.cpp
+3
-0
src/targets/cpu/cpu_target.cpp
src/targets/cpu/cpu_target.cpp
+1
-1
src/targets/cpu/include/migraph/cpu/context.hpp
src/targets/cpu/include/migraph/cpu/context.hpp
+15
-0
src/targets/cpu/include/migraph/cpu/cpu_target.hpp
src/targets/cpu/include/migraph/cpu/cpu_target.hpp
+3
-2
src/targets/gpu/CMakeLists.txt
src/targets/gpu/CMakeLists.txt
+1
-0
src/targets/gpu/eliminate_allocation.cpp
src/targets/gpu/eliminate_allocation.cpp
+35
-0
No files found.
src/dead_code_elimination.cpp
View file @
df78aadf
...
...
@@ -16,8 +16,8 @@ void dead_code_elimination::apply(program& p) const
if
(
ins
==
p
.
begin
())
continue
;
const
auto
i
=
std
::
prev
(
ins
);
// Skip instruction with empty shape as output
if
(
i
->
result
.
elements
()
==
0
)
// Skip instruction with empty shape as output
unless its a builtin
if
(
i
->
result
.
elements
()
==
0
and
not
(
i
->
op
.
name
().
front
()
==
'@'
)
)
continue
;
// Skip the last instruction
if
(
i
==
last
)
...
...
src/generate.cpp
View file @
df78aadf
...
...
@@ -2,7 +2,7 @@
namespace
migraph
{
argument
generate_argument
(
shape
s
,
std
::
mt19937
::
result_type
seed
)
argument
generate_argument
(
shape
s
,
unsigned
long
seed
)
{
argument
result
;
s
.
visit_type
([
&
](
auto
as
)
{
...
...
@@ -13,7 +13,7 @@ argument generate_argument(shape s, std::mt19937::result_type seed)
return
result
;
}
literal
generate_literal
(
shape
s
,
std
::
mt19937
::
result_type
seed
)
literal
generate_literal
(
shape
s
,
unsigned
long
seed
)
{
literal
result
;
s
.
visit_type
([
&
](
auto
as
)
{
...
...
@@ -24,4 +24,10 @@ literal generate_literal(shape s, std::mt19937::result_type seed)
return
result
;
}
// TODO: Move to literal.cpp
literal
abs
(
literal
l
)
{
return
transform
(
std
::
move
(
l
),
[](
auto
x
)
{
return
std
::
fabs
(
x
);
});
}
}
// namespace migraph
src/include/migraph/check_shapes.hpp
View file @
df78aadf
...
...
@@ -97,8 +97,8 @@ struct check_shapes
const
check_shapes
&
not_broadcasted
()
const
{
//
if(!this->all_of([](const shape& s) { return not s.broadcasted(); }))
//
MIGRAPH_THROW(prefix() + "Shapes are broadcasted");
if
(
!
this
->
all_of
([](
const
shape
&
s
)
{
return
not
s
.
broadcasted
();
}))
MIGRAPH_THROW
(
prefix
()
+
"Shapes are broadcasted"
);
return
*
this
;
}
...
...
src/include/migraph/context.hpp
View file @
df78aadf
...
...
@@ -17,19 +17,21 @@ namespace migraph {
/// during `eval`.
struct
context
{
/// Wait for any tasks in the context to complete
void
finish
()
const
;
};
#else
/*
* Type-erased interface for:
*
* struct context
* {
* };
*
*/
* Type-erased interface for:
*
* struct context
* {
* void finish() const;
* };
*
*/
struct
context
{
...
...
@@ -88,12 +90,20 @@ struct context
return
private_detail_te_get_handle
().
type
();
}
void
finish
()
const
{
assert
((
*
this
).
private_detail_te_handle_mem_var
);
return
(
*
this
).
private_detail_te_get_handle
().
finish
();
}
private:
struct
private_detail_te_handle_base_type
{
virtual
~
private_detail_te_handle_base_type
()
{}
virtual
std
::
shared_ptr
<
private_detail_te_handle_base_type
>
clone
()
const
=
0
;
virtual
const
std
::
type_info
&
type
()
const
=
0
;
virtual
void
finish
()
const
=
0
;
};
template
<
typename
PrivateDetailTypeErasedT
>
...
...
@@ -124,6 +134,8 @@ struct context
const
std
::
type_info
&
type
()
const
override
{
return
typeid
(
private_detail_te_value
);
}
void
finish
()
const
override
{
return
private_detail_te_value
.
finish
();
}
PrivateDetailTypeErasedT
private_detail_te_value
;
};
...
...
src/include/migraph/generate.hpp
View file @
df78aadf
...
...
@@ -7,13 +7,37 @@
namespace
migraph
{
template
<
class
T
,
MIGRAPH_REQUIRES
(
std
::
is_floating_point
<
T
>{})
>
constexpr
T
normalize
(
unsigned
long
z
)
{
if
(
z
==
0
)
return
0
;
return
(
2.0
/
z
)
-
1.0
;
}
template
<
class
T
,
MIGRAPH_REQUIRES
(
std
::
is_signed
<
T
>{}
and
not
std
::
is_floating_point
<
T
>
{})
>
constexpr
T
normalize
(
unsigned
long
z
)
{
const
auto
max
=
std
::
numeric_limits
<
T
>::
max
();
const
auto
half_max
=
max
/
2
;
return
half_max
-
(
z
%
max
);
}
template
<
class
T
,
MIGRAPH_REQUIRES
(
not
std
::
is_signed
<
T
>{}
and
std
::
is_integral
<
T
>
{})
>
constexpr
T
normalize
(
unsigned
long
z
)
{
const
auto
max
=
std
::
numeric_limits
<
T
>::
max
();
return
z
%
max
;
}
template
<
class
T
>
struct
xorshf96_generator
{
unsigned
long
max
=
31
;
unsigned
long
x
=
123456789
;
unsigned
long
y
=
362436069
;
unsigned
long
z
=
521288629
;
unsigned
long
x
=
123456789
;
unsigned
long
y
=
362436069
;
unsigned
long
z
;
xorshf96_generator
(
unsigned
long
seed
=
0
)
:
z
(
521288629ULL
^
seed
)
{}
constexpr
T
operator
()()
noexcept
{
...
...
@@ -26,21 +50,23 @@ struct xorshf96_generator
y
=
z
;
z
=
t
^
x
^
y
;
return
z
%
max
;
return
normalize
<
T
>
(
z
)
;
}
};
template
<
class
T
>
std
::
vector
<
T
>
generate_tensor_data
(
const
migraph
::
shape
&
s
,
std
::
mt19937
::
result_type
)
std
::
vector
<
T
>
generate_tensor_data
(
const
migraph
::
shape
&
s
,
unsigned
long
seed
=
0
)
{
std
::
vector
<
T
>
result
(
s
.
elements
());
std
::
generate
(
result
.
begin
(),
result
.
end
(),
xorshf96_generator
<
T
>
{});
std
::
generate
(
result
.
begin
(),
result
.
end
(),
xorshf96_generator
<
T
>
{
seed
});
return
result
;
}
argument
generate_argument
(
shape
s
,
std
::
mt19937
::
result_type
seed
=
0
);
argument
generate_argument
(
shape
s
,
unsigned
long
seed
=
0
);
literal
generate_literal
(
shape
s
,
unsigned
long
seed
=
0
);
literal
generate_literal
(
shape
s
,
std
::
mt19937
::
result_type
seed
=
0
);
literal
abs
(
literal
l
);
}
// namespace migraph
...
...
src/include/migraph/literal.hpp
View file @
df78aadf
...
...
@@ -94,6 +94,19 @@ struct literal : raw_data<literal>
}
};
template
<
class
F
>
literal
transform
(
literal
l
,
F
f
)
{
literal
result
;
l
.
visit
([
&
](
auto
x
)
{
using
type
=
std
::
remove_cv_t
<
typename
decltype
(
x
)
::
value_type
>
;
std
::
vector
<
type
>
output
(
x
.
size
(),
0.0
);
std
::
transform
(
x
.
begin
(),
x
.
end
(),
output
.
begin
(),
f
);
result
=
literal
{
l
.
get_shape
(),
output
};
});
return
result
;
}
}
// namespace migraph
#endif
src/include/migraph/operators.hpp
View file @
df78aadf
...
...
@@ -133,7 +133,7 @@ struct convolution
struct
pooling
{
std
::
string
mode
;
std
::
string
mode
=
"average"
;
std
::
array
<
std
::
size_t
,
2
>
padding
=
{{
0
,
0
}};
std
::
array
<
std
::
size_t
,
2
>
stride
=
{{
1
,
1
}};
std
::
array
<
std
::
size_t
,
2
>
lengths
=
{{
1
,
1
}};
...
...
src/include/migraph/program.hpp
View file @
df78aadf
...
...
@@ -8,6 +8,7 @@
#include <migraph/builtin.hpp>
#include <migraph/instruction_ref.hpp>
#include <migraph/target.hpp>
#include <migraph/tracer.hpp>
#include <algorithm>
#include <iostream>
...
...
@@ -88,7 +89,7 @@ struct program
instruction_ref
validate
()
const
;
void
compile
(
const
target
&
t
);
void
compile
(
const
target
&
t
,
tracer
trace
=
tracer
{}
);
void
perf_report
(
std
::
ostream
&
os
,
std
::
size_t
n
,
parameter_map
params
)
const
;
...
...
src/include/migraph/requires.hpp
View file @
df78aadf
...
...
@@ -13,12 +13,35 @@ struct and_ : std::is_same<and_<Bs...>, and_<(Bs || true)...>> // NOLINT
template
<
bool
B
>
using
bool_c
=
std
::
integral_constant
<
bool
,
B
>
;
template
<
int
N
>
struct
requires_enum
{
enum
e
{
a
=
0
};
};
#define MIGRAPH_REQUIRES_CAT(x, y) x##y
#ifdef CPPCHECK
#define MIGRAPH_REQUIRES(...) class = void
#else
#define MIGRAPH_REQUIRES(...) \
bool PrivateRequires##__LINE__ = true, \
class = typename std::enable_if<and_<__VA_ARGS__, PrivateRequires##__LINE__>{}>::type
#if 0
// TODO: This currently crashed on clang
#define MIGRAPH_REQUIRES(...) \
typename migraph::requires_enum<__LINE__>::e MIGRAPH_REQUIRES_CAT( \
PrivateRequires, \
__LINE__) = migraph::requires_enum<__LINE__>::a, \
class = typename std::enable_if<and_<__VA_ARGS__, \
MIGRAPH_REQUIRES_CAT(PrivateRequires, __LINE__) == \
migraph::requires_enum<__LINE__>::a>{}>::type
#else
#define MIGRAPH_REQUIRES(...) \
typename migraph::requires_enum<__LINE__>::e MIGRAPH_REQUIRES_CAT( \
PrivateRequires, __LINE__) = migraph::requires_enum<__LINE__>::a, \
class = typename std::enable_if<and_<__VA_ARGS__>{}>::type
#endif
#endif
}
// namespace migraph
...
...
src/include/migraph/tensor_view.hpp
View file @
df78aadf
...
...
@@ -94,13 +94,13 @@ struct tensor_view
// TODO: Add iterators so it can handle nonstandard tensors
T
*
begin
()
{
assert
(
this
->
m_shape
.
standard
());
assert
(
this
->
m_shape
.
standard
()
or
this
->
empty
()
);
return
m_data
;
}
T
*
end
()
{
assert
(
this
->
m_shape
.
standard
());
assert
(
this
->
m_shape
.
standard
()
or
this
->
empty
()
);
if
(
this
->
empty
())
return
m_data
;
else
...
...
@@ -109,13 +109,13 @@ struct tensor_view
const
T
*
begin
()
const
{
assert
(
this
->
m_shape
.
standard
());
assert
(
this
->
m_shape
.
standard
()
or
this
->
empty
()
);
return
m_data
;
}
const
T
*
end
()
const
{
assert
(
this
->
m_shape
.
standard
());
assert
(
this
->
m_shape
.
standard
()
or
this
->
empty
()
);
if
(
this
->
empty
())
return
m_data
;
else
...
...
src/include/migraph/tracer.hpp
0 → 100644
View file @
df78aadf
#ifndef MIGRAPH_GUARD_RTGLIB_TRACER_HPP
#define MIGRAPH_GUARD_RTGLIB_TRACER_HPP
#include <ostream>
namespace
migraph
{
struct
swallow
{
template
<
class
...
Ts
>
swallow
(
Ts
&&
...)
{
}
};
struct
tracer
{
tracer
()
{}
tracer
(
std
::
ostream
&
s
)
:
os
(
&
s
)
{}
bool
enabled
()
const
{
return
os
!=
nullptr
;
}
template
<
class
...
Ts
>
void
operator
()(
const
Ts
&
...
xs
)
const
{
if
(
os
!=
nullptr
)
{
swallow
{
*
os
<<
xs
...};
*
os
<<
std
::
endl
;
}
}
private:
std
::
ostream
*
os
=
nullptr
;
};
}
// namespace migraph
#endif
src/include/migraph/verify.hpp
View file @
df78aadf
...
...
@@ -7,6 +7,8 @@
#include <iostream>
#include <numeric>
#include <migraph/float_equal.hpp>
namespace
migraph
{
// Compute the value of a range
...
...
@@ -101,7 +103,7 @@ auto range_distance(R1&& r1)
template
<
class
R1
>
bool
range_zero
(
R1
&&
r1
)
{
return
std
::
all_of
(
r1
.
begin
(),
r1
.
end
(),
[](
auto
x
)
{
return
x
==
0
;
});
return
std
::
all_of
(
r1
.
begin
(),
r1
.
end
(),
[](
auto
x
)
{
return
float_equal
(
x
,
0
)
;
});
}
template
<
class
R1
,
class
R2
,
class
T
,
class
Reducer
,
class
Product
>
...
...
src/onnx/verify_onnx.cpp
View file @
df78aadf
...
...
@@ -41,17 +41,22 @@ int main(int argc, char const* argv[])
if
(
argc
>
1
)
{
std
::
string
file
=
argv
[
1
];
auto
x
=
run_cpu
(
file
);
auto
y
=
run_gpu
(
file
);
auto
p
=
migraph
::
parse_onnx
(
file
);
std
::
cout
<<
p
<<
std
::
endl
;
auto
x
=
run_cpu
(
file
);
auto
y
=
run_gpu
(
file
);
visit_all
(
x
,
y
)([](
auto
cpu
,
auto
gpu
)
{
if
(
migraph
::
verify_range
(
cpu
,
gpu
))
if
(
migraph
::
verify_range
(
cpu
,
gpu
,
100
))
{
std
::
cout
<<
"Passed"
<<
std
::
endl
;
}
else
{
std
::
cout
<<
"Not equal"
<<
std
::
endl
;
std
::
cout
<<
"cpu:"
<<
std
::
endl
;
std
::
cout
<<
cpu
<<
std
::
endl
;
std
::
cout
<<
"gpu:"
<<
std
::
endl
;
std
::
cout
<<
gpu
<<
std
::
endl
;
}
...
...
src/program.cpp
View file @
df78aadf
...
...
@@ -237,23 +237,21 @@ instruction_ref program::validate() const
[
&
](
const
instruction
&
i
)
{
return
!
i
.
valid
(
impl
->
instructions
.
begin
());
});
}
void
program
::
compile
(
const
target
&
t
)
void
program
::
compile
(
const
target
&
t
,
tracer
trace
)
{
assert
(
this
->
validate
()
==
impl
->
instructions
.
end
());
this
->
impl
->
ctx
=
t
.
get_context
();
if
(
enabled
(
MIGRAPH_TRACE_COMPILE
{}))
std
::
cout
<<
*
this
<<
std
::
endl
<<
std
::
endl
;
;
if
(
not
trace
.
enabled
()
and
enabled
(
MIGRAPH_TRACE_COMPILE
{}))
trace
=
tracer
{
std
::
cout
};
trace
(
*
this
);
trace
();
for
(
auto
&&
p
:
t
.
get_passes
(
this
->
impl
->
ctx
))
{
if
(
enabled
(
MIGRAPH_TRACE_COMPILE
{}))
std
::
cout
<<
"Pass: "
<<
p
.
name
()
<<
std
::
endl
;
trace
(
"Pass: "
,
p
.
name
());
p
.
apply
(
*
this
);
if
(
enabled
(
MIGRAPH_TRACE_COMPILE
{}))
std
::
cout
<<
*
this
<<
std
::
endl
;
trace
(
*
this
);
#ifndef NDEBUG
if
(
enabled
(
MIGRAPH_TRACE_COMPILE
{}))
std
::
cout
<<
"Validate ..."
<<
std
::
endl
;
trace
(
"Validate ..."
);
auto
invalid
=
this
->
validate
();
if
(
invalid
!=
impl
->
instructions
.
end
())
{
...
...
@@ -261,8 +259,7 @@ void program::compile(const target& t)
MIGRAPH_THROW
(
p
.
name
()
+
" pass produces invalid program at instruction "
+
std
::
to_string
(
index
)
+
": "
+
invalid
->
op
.
name
());
}
if
(
enabled
(
MIGRAPH_TRACE_COMPILE
{}))
std
::
cout
<<
std
::
endl
;
trace
();
#endif
}
auto
invalid
=
this
->
validate
();
...
...
@@ -334,28 +331,36 @@ double common_average(const std::vector<double>& v)
void
program
::
perf_report
(
std
::
ostream
&
os
,
std
::
size_t
n
,
parameter_map
params
)
const
{
using
milliseconds
=
std
::
chrono
::
duration
<
double
,
std
::
milli
>
;
auto
&
ctx
=
this
->
impl
->
ctx
;
// Run once by itself
eval
(
params
);
ctx
.
finish
();
// Run and time entire program
std
::
vector
<
double
>
total_vec
;
total_vec
.
reserve
(
n
);
for
(
std
::
size_t
i
=
0
;
i
<
n
;
i
++
)
{
total_vec
.
push_back
(
time
<
milliseconds
>
([
&
]
{
eval
(
params
);
}));
total_vec
.
push_back
(
time
<
milliseconds
>
([
&
]
{
eval
(
params
);
ctx
.
finish
();
}));
}
std
::
sort
(
total_vec
.
begin
(),
total_vec
.
end
());
std
::
unordered_map
<
instruction_ref
,
std
::
vector
<
double
>>
ins_vec
;
// Fill the map
generic_eval
(
*
this
,
this
->
impl
->
ctx
,
params
,
[
&
](
auto
ins
,
auto
)
{
generic_eval
(
*
this
,
ctx
,
params
,
[
&
](
auto
ins
,
auto
)
{
ins_vec
[
ins
].
reserve
(
n
);
return
argument
{};
});
// Run and time each instruction
for
(
std
::
size_t
i
=
0
;
i
<
n
;
i
++
)
{
generic_eval
(
*
this
,
this
->
impl
->
ctx
,
params
,
[
&
](
auto
ins
,
auto
f
)
{
generic_eval
(
*
this
,
ctx
,
params
,
[
&
](
auto
ins
,
auto
f
)
{
argument
result
;
ins_vec
[
ins
].
push_back
(
time
<
milliseconds
>
([
&
]
{
result
=
f
();
}));
ins_vec
[
ins
].
push_back
(
time
<
milliseconds
>
([
&
]
{
result
=
f
();
ctx
.
finish
();
}));
return
result
;
});
}
...
...
@@ -366,9 +371,8 @@ void program::perf_report(std::ostream& os, std::size_t n, parameter_map params)
overhead_vec
.
reserve
(
n
);
for
(
std
::
size_t
i
=
0
;
i
<
n
;
i
++
)
{
overhead_vec
.
push_back
(
time
<
milliseconds
>
([
&
]
{
generic_eval
(
*
this
,
this
->
impl
->
ctx
,
params
,
[](
auto
...)
{
return
argument
{};
});
}));
overhead_vec
.
push_back
(
time
<
milliseconds
>
(
[
&
]
{
generic_eval
(
*
this
,
ctx
,
params
,
[](
auto
...)
{
return
argument
{};
});
}));
}
double
total_time
=
common_average
(
total_vec
);
...
...
@@ -376,13 +380,33 @@ void program::perf_report(std::ostream& os, std::size_t n, parameter_map params)
double
overhead_time
=
common_average
(
overhead_vec
);
double
overhead_percent
=
overhead_time
*
100.0
/
total_time
;
double
total_instruction_time
=
0.0
;
std
::
unordered_map
<
std
::
string
,
double
>
op_times
;
for
(
auto
&&
p
:
ins_vec
)
total_instruction_time
+=
common_average
(
p
.
second
);
{
double
avg
=
common_average
(
p
.
second
);
op_times
[
p
.
first
->
op
.
name
()]
+=
avg
;
total_instruction_time
+=
avg
;
}
double
calculate_overhead_time
=
total_time
-
total_instruction_time
;
double
calculate_overhead_percent
=
calculate_overhead_time
*
100.0
/
total_time
;
print_program
(
os
,
*
this
,
[
&
](
auto
ins
,
auto
&&
)
{
os
<<
": "
<<
common_average
(
ins_vec
[
ins
])
<<
"ms"
;
});
print_program
(
os
,
*
this
,
[
&
](
auto
ins
,
auto
&&
)
{
double
avg
=
common_average
(
ins_vec
[
ins
]);
double
percent
=
std
::
ceil
(
100.0
*
avg
/
total_instruction_time
);
os
<<
": "
<<
avg
<<
"ms, "
<<
percent
<<
"%"
;
});
os
<<
std
::
endl
;
os
<<
"Summary:"
<<
std
::
endl
;
for
(
auto
&&
p
:
op_times
)
{
auto
&&
name
=
p
.
first
;
double
avg
=
p
.
second
;
double
percent
=
std
::
ceil
(
100.0
*
avg
/
total_instruction_time
);
os
<<
name
<<
": "
<<
avg
<<
"ms, "
<<
percent
<<
"%"
<<
std
::
endl
;
}
os
<<
std
::
endl
;
os
<<
"Rate: "
<<
rate
<<
"/sec"
<<
std
::
endl
;
os
<<
"Total time: "
<<
total_time
<<
"ms"
<<
std
::
endl
;
...
...
src/targets/cpu/cpu_lowering.cpp
View file @
df78aadf
...
...
@@ -65,6 +65,7 @@ struct cpu_batch_norm_inference
dfor
(
num_batch
,
num_channels
,
image_height
,
image_width
)(
[
&
](
std
::
size_t
n
,
std
::
size_t
c
,
std
::
size_t
h
,
std
::
size_t
w
)
{
assert
((
variance
(
c
)
+
epsilon
)
>
0
);
result
(
n
,
c
,
h
,
w
)
=
gamma
(
c
)
*
(
buffer
(
n
,
c
,
h
,
w
)
-
mean
(
c
))
/
std
::
sqrt
(
variance
(
c
)
+
epsilon
)
+
bias
(
c
);
...
...
@@ -79,6 +80,7 @@ struct cpu_batch_norm_inference
dfor
(
num_batch
,
num_channels
,
image_height
,
image_width
)(
[
&
](
std
::
size_t
n
,
std
::
size_t
c
,
std
::
size_t
h
,
std
::
size_t
w
)
{
assert
((
variance
(
c
,
h
,
w
)
+
epsilon
)
>
0
);
result
(
n
,
c
,
h
,
w
)
=
gamma
(
c
,
h
,
w
)
*
(
buffer
(
n
,
c
,
h
,
w
)
-
mean
(
c
,
h
,
w
))
/
std
::
sqrt
(
variance
(
c
,
h
,
w
)
+
epsilon
)
+
...
...
@@ -212,6 +214,7 @@ struct cpu_contiguous
shape
compute_shape
(
const
std
::
vector
<
shape
>&
inputs
)
const
{
return
op
.
compute_shape
(
inputs
);
}
argument
compute
(
context
&
,
const
shape
&
output_shape
,
std
::
vector
<
argument
>
args
)
const
{
assert
(
output_shape
.
standard
());
argument
result
{
output_shape
};
visit_all
(
result
,
args
[
0
])([
&
](
auto
output
,
auto
input
)
{
shape_for_each
(
output
.
get_shape
(),
[
&
](
const
auto
&
idx
)
{
...
...
src/targets/cpu/cpu_target.cpp
View file @
df78aadf
...
...
@@ -8,7 +8,7 @@ namespace cpu {
std
::
string
cpu_target
::
name
()
const
{
return
"cpu"
;
}
std
::
vector
<
pass
>
cpu_target
::
get_passes
(
context
&
)
const
std
::
vector
<
pass
>
cpu_target
::
get_passes
(
migraph
::
context
&
)
const
{
return
{
auto_contiguous
{},
cpu_lowering
{}};
}
...
...
src/targets/cpu/include/migraph/cpu/context.hpp
0 → 100644
View file @
df78aadf
#ifndef MIGRAPH_GUARD_RTGLIB_CONTEXT_HPP
#define MIGRAPH_GUARD_RTGLIB_CONTEXT_HPP
namespace
migraph
{
namespace
cpu
{
struct
context
{
void
finish
()
const
{}
};
}
// namespace cpu
}
// namespace migraph
#endif
src/targets/cpu/include/migraph/cpu/cpu_target.hpp
View file @
df78aadf
...
...
@@ -2,6 +2,7 @@
#define MIGRAPH_GUARD_MIGRAPHLIB_CPU_TARGET_HPP
#include <migraph/program.hpp>
#include <migraph/cpu/context.hpp>
namespace
migraph
{
namespace
cpu
{
...
...
@@ -9,8 +10,8 @@ namespace cpu {
struct
cpu_target
{
std
::
string
name
()
const
;
std
::
vector
<
pass
>
get_passes
(
context
&
ctx
)
const
;
context
get_context
()
const
{
return
{};
}
std
::
vector
<
pass
>
get_passes
(
migraph
::
context
&
ctx
)
const
;
migraph
::
context
get_context
()
const
{
return
context
{};
}
};
}
// namespace cpu
...
...
src/targets/gpu/CMakeLists.txt
View file @
df78aadf
...
...
@@ -18,6 +18,7 @@ target_link_libraries(migraph_device migraph hip::device)
target_include_directories
(
migraph_device PUBLIC $<BUILD_INTERFACE:
${
CMAKE_CURRENT_SOURCE_DIR
}
/include>
)
add_library
(
migraph_gpu
eliminate_allocation.cpp
eliminate_workspace.cpp
hip.cpp
target.cpp
...
...
src/targets/gpu/eliminate_allocation.cpp
0 → 100644
View file @
df78aadf
#include <migraph/gpu/eliminate_allocation.hpp>
#include <migraph/gpu/hip.hpp>
#include <migraph/program.hpp>
#include <migraph/instruction.hpp>
#include <migraph/operators.hpp>
#include <migraph/iterator_for.hpp>
#include <migraph/ranges.hpp>
#include <migraph/stringutils.hpp>
namespace
migraph
{
namespace
gpu
{
void
eliminate_allocation
::
apply
(
program
&
p
)
const
{
std
::
size_t
n
=
0
;
std
::
vector
<
std
::
pair
<
instruction_ref
,
std
::
size_t
>>
allocs
;
for
(
auto
ins
:
iterator_for
(
p
))
{
if
(
ins
->
op
.
name
()
!=
"hip::allocate"
)
continue
;
allocs
.
emplace_back
(
ins
,
n
);
std
::
size_t
size
=
ins
->
get_shape
().
bytes
();
n
+=
size
+
(
size
%
4
);
}
auto
mem
=
p
.
add_parameter
(
"memory"
,
shape
{
shape
::
int8_type
,
{
n
}});
for
(
auto
&&
pp
:
allocs
)
{
auto
ins
=
pp
.
first
;
auto
s
=
ins
->
get_shape
();
auto
offset
=
pp
.
second
;
p
.
replace_instruction
(
ins
,
hip_load
{
s
,
offset
},
mem
);
}
}
}
// namespace gpu
}
// namespace migraph
Prev
1
2
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