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
3e141c95
Commit
3e141c95
authored
Aug 20, 2018
by
Paul
Browse files
Add finish method to context
parent
74b3d019
Changes
10
Show whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
83 additions
and
19 deletions
+83
-19
src/include/migraph/context.hpp
src/include/migraph/context.hpp
+20
-8
src/include/migraph/verify.hpp
src/include/migraph/verify.hpp
+3
-1
src/program.cpp
src/program.cpp
+7
-5
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
+16
-0
src/targets/cpu/include/migraph/cpu/cpu_target.hpp
src/targets/cpu/include/migraph/cpu/cpu_target.hpp
+3
-2
src/targets/gpu/include/migraph/gpu/context.hpp
src/targets/gpu/include/migraph/gpu/context.hpp
+5
-0
src/targets/gpu/lowering.cpp
src/targets/gpu/lowering.cpp
+0
-1
test/gpu/miopen.cpp
test/gpu/miopen.cpp
+23
-0
tools/include/context.hpp
tools/include/context.hpp
+5
-1
No files found.
src/include/migraph/context.hpp
View file @
3e141c95
...
@@ -17,19 +17,21 @@ namespace migraph {
...
@@ -17,19 +17,21 @@ namespace migraph {
/// during `eval`.
/// during `eval`.
struct
context
struct
context
{
{
/// Wait for any tasks in the context to complete
void
finish
()
const
;
};
};
#else
#else
/*
/*
* Type-erased interface for:
* Type-erased interface for:
*
*
* struct context
* struct context
* {
* {
* void finish() const;
* };
* };
*
*
*/
*/
struct
context
struct
context
{
{
...
@@ -88,12 +90,20 @@ struct context
...
@@ -88,12 +90,20 @@ struct context
return
private_detail_te_get_handle
().
type
();
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:
private:
struct
private_detail_te_handle_base_type
struct
private_detail_te_handle_base_type
{
{
virtual
~
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
std
::
shared_ptr
<
private_detail_te_handle_base_type
>
clone
()
const
=
0
;
virtual
const
std
::
type_info
&
type
()
const
=
0
;
virtual
const
std
::
type_info
&
type
()
const
=
0
;
virtual
void
finish
()
const
=
0
;
};
};
template
<
typename
PrivateDetailTypeErasedT
>
template
<
typename
PrivateDetailTypeErasedT
>
...
@@ -124,6 +134,8 @@ struct context
...
@@ -124,6 +134,8 @@ struct context
const
std
::
type_info
&
type
()
const
override
{
return
typeid
(
private_detail_te_value
);
}
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
;
PrivateDetailTypeErasedT
private_detail_te_value
;
};
};
...
...
src/include/migraph/verify.hpp
View file @
3e141c95
...
@@ -7,6 +7,8 @@
...
@@ -7,6 +7,8 @@
#include <iostream>
#include <iostream>
#include <numeric>
#include <numeric>
#include <migraph/float_equal.hpp>
namespace
migraph
{
namespace
migraph
{
// Compute the value of a range
// Compute the value of a range
...
@@ -101,7 +103,7 @@ auto range_distance(R1&& r1)
...
@@ -101,7 +103,7 @@ auto range_distance(R1&& r1)
template
<
class
R1
>
template
<
class
R1
>
bool
range_zero
(
R1
&&
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
>
template
<
class
R1
,
class
R2
,
class
T
,
class
Reducer
,
class
Product
>
...
...
src/program.cpp
View file @
3e141c95
...
@@ -331,28 +331,30 @@ double common_average(const std::vector<double>& v)
...
@@ -331,28 +331,30 @@ double common_average(const std::vector<double>& v)
void
program
::
perf_report
(
std
::
ostream
&
os
,
std
::
size_t
n
,
parameter_map
params
)
const
void
program
::
perf_report
(
std
::
ostream
&
os
,
std
::
size_t
n
,
parameter_map
params
)
const
{
{
using
milliseconds
=
std
::
chrono
::
duration
<
double
,
std
::
milli
>
;
using
milliseconds
=
std
::
chrono
::
duration
<
double
,
std
::
milli
>
;
auto
&
ctx
=
this
->
impl
->
ctx
;
// Run once by itself
// Run once by itself
eval
(
params
);
eval
(
params
);
ctx
.
finish
();
// Run and time entire program
// Run and time entire program
std
::
vector
<
double
>
total_vec
;
std
::
vector
<
double
>
total_vec
;
total_vec
.
reserve
(
n
);
total_vec
.
reserve
(
n
);
for
(
std
::
size_t
i
=
0
;
i
<
n
;
i
++
)
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
::
sort
(
total_vec
.
begin
(),
total_vec
.
end
());
std
::
unordered_map
<
instruction_ref
,
std
::
vector
<
double
>>
ins_vec
;
std
::
unordered_map
<
instruction_ref
,
std
::
vector
<
double
>>
ins_vec
;
// Fill the map
// 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
);
ins_vec
[
ins
].
reserve
(
n
);
return
argument
{};
return
argument
{};
});
});
// Run and time each instruction
// Run and time each instruction
for
(
std
::
size_t
i
=
0
;
i
<
n
;
i
++
)
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
;
argument
result
;
ins_vec
[
ins
].
push_back
(
time
<
milliseconds
>
([
&
]
{
result
=
f
();
}));
ins_vec
[
ins
].
push_back
(
time
<
milliseconds
>
([
&
]
{
result
=
f
();
ctx
.
finish
();
}));
return
result
;
return
result
;
});
});
}
}
...
@@ -364,7 +366,7 @@ void program::perf_report(std::ostream& os, std::size_t n, parameter_map params)
...
@@ -364,7 +366,7 @@ void program::perf_report(std::ostream& os, std::size_t n, parameter_map params)
for
(
std
::
size_t
i
=
0
;
i
<
n
;
i
++
)
for
(
std
::
size_t
i
=
0
;
i
<
n
;
i
++
)
{
{
overhead_vec
.
push_back
(
time
<
milliseconds
>
([
&
]
{
overhead_vec
.
push_back
(
time
<
milliseconds
>
([
&
]
{
generic_eval
(
*
this
,
this
->
impl
->
ctx
,
params
,
[](
auto
...)
{
return
argument
{};
});
generic_eval
(
*
this
,
ctx
,
params
,
[](
auto
...)
{
return
argument
{};
});
}));
}));
}
}
...
...
src/targets/cpu/cpu_target.cpp
View file @
3e141c95
...
@@ -8,7 +8,7 @@ namespace cpu {
...
@@ -8,7 +8,7 @@ namespace cpu {
std
::
string
cpu_target
::
name
()
const
{
return
"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
{}};
return
{
auto_contiguous
{},
cpu_lowering
{}};
}
}
...
...
src/targets/cpu/include/migraph/cpu/context.hpp
0 → 100644
View file @
3e141c95
#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 @
3e141c95
...
@@ -2,6 +2,7 @@
...
@@ -2,6 +2,7 @@
#define MIGRAPH_GUARD_MIGRAPHLIB_CPU_TARGET_HPP
#define MIGRAPH_GUARD_MIGRAPHLIB_CPU_TARGET_HPP
#include <migraph/program.hpp>
#include <migraph/program.hpp>
#include <migraph/cpu/context.hpp>
namespace
migraph
{
namespace
migraph
{
namespace
cpu
{
namespace
cpu
{
...
@@ -9,8 +10,8 @@ namespace cpu {
...
@@ -9,8 +10,8 @@ namespace cpu {
struct
cpu_target
struct
cpu_target
{
{
std
::
string
name
()
const
;
std
::
string
name
()
const
;
std
::
vector
<
pass
>
get_passes
(
context
&
ctx
)
const
;
std
::
vector
<
pass
>
get_passes
(
migraph
::
context
&
ctx
)
const
;
context
get_context
()
const
{
return
{};
}
migraph
::
context
get_context
()
const
{
return
context
{};
}
};
};
}
// namespace cpu
}
// namespace cpu
...
...
src/targets/gpu/include/migraph/gpu/context.hpp
View file @
3e141c95
...
@@ -3,6 +3,7 @@
...
@@ -3,6 +3,7 @@
#include <migraph/gpu/miopen.hpp>
#include <migraph/gpu/miopen.hpp>
#include <migraph/gpu/rocblas.hpp>
#include <migraph/gpu/rocblas.hpp>
#include <migraph/gpu/hip.hpp>
namespace
migraph
{
namespace
migraph
{
namespace
gpu
{
namespace
gpu
{
...
@@ -11,6 +12,10 @@ struct context
...
@@ -11,6 +12,10 @@ struct context
{
{
shared
<
miopen_handle
>
handle
;
shared
<
miopen_handle
>
handle
;
shared
<
rocblas_handle_ptr
>
rbhandle
;
shared
<
rocblas_handle_ptr
>
rbhandle
;
void
finish
()
const
{
gpu_sync
();
}
};
};
}
// namespace gpu
}
// namespace gpu
...
...
src/targets/gpu/lowering.cpp
View file @
3e141c95
...
@@ -332,7 +332,6 @@ struct miopen_apply
...
@@ -332,7 +332,6 @@ struct miopen_apply
check_shape
(
s
,
apply_batch_norm_inference
(
it
));
check_shape
(
s
,
apply_batch_norm_inference
(
it
));
}
}
}
}
prog
->
insert_instruction
(
prog
->
end
(),
hip_sync
{},
std
::
prev
(
prog
->
end
()));
}
}
instruction_ref
insert_allocation
(
instruction_ref
ins
,
const
shape
&
s
,
std
::
string
tag
=
""
)
instruction_ref
insert_allocation
(
instruction_ref
ins
,
const
shape
&
s
,
std
::
string
tag
=
""
)
...
...
test/gpu/miopen.cpp
View file @
3e141c95
...
@@ -127,6 +127,29 @@ void verify_program()
...
@@ -127,6 +127,29 @@ void verify_program()
{
{
// TODO: Check for nans
// TODO: Check for nans
std
::
cout
<<
"FAILED: "
<<
migraph
::
get_type_name
<
V
>
()
<<
std
::
endl
;
std
::
cout
<<
"FAILED: "
<<
migraph
::
get_type_name
<
V
>
()
<<
std
::
endl
;
// std::cout << cpu << std::endl;
// std::cout << gpu << std::endl;
if
(
migraph
::
range_zero
(
cpu
))
std
::
cout
<<
"Cpu data is all zeros"
<<
std
::
endl
;
if
(
migraph
::
range_zero
(
gpu
))
std
::
cout
<<
"Gpu data is all zeros"
<<
std
::
endl
;
auto
idx
=
migraph
::
mismatch_idx
(
cpu
,
gpu
,
migraph
::
float_equal
);
if
(
idx
<
migraph
::
range_distance
(
cpu
))
{
std
::
cout
<<
"Mismatch at "
<<
idx
<<
": "
<<
cpu
[
idx
]
<<
" != "
<<
gpu
[
idx
]
<<
std
::
endl
;
}
auto
cpu_nan_idx
=
find_idx
(
cpu
,
migraph
::
not_finite
);
if
(
cpu_nan_idx
>=
0
)
std
::
cout
<<
"Non finite number found in cpu at "
<<
cpu_nan_idx
<<
": "
<<
cpu
[
cpu_nan_idx
]
<<
std
::
endl
;
auto
gpu_nan_idx
=
find_idx
(
gpu
,
migraph
::
not_finite
);
if
(
gpu_nan_idx
>=
0
)
std
::
cout
<<
"Non finite number found in gpu at "
<<
gpu_nan_idx
<<
": "
<<
gpu
[
gpu_nan_idx
]
<<
std
::
endl
;
}
}
});
});
std
::
set_terminate
(
nullptr
);
std
::
set_terminate
(
nullptr
);
...
...
tools/include/context.hpp
View file @
3e141c95
...
@@ -17,12 +17,16 @@ namespace migraph {
...
@@ -17,12 +17,16 @@ namespace migraph {
/// during `eval`.
/// during `eval`.
struct
context
struct
context
{
{
/// Wait for any tasks in the context to complete
void
finish
()
const
;
};
};
#else
#else
<%
<%
interface
(
'
context
'
)
interface
(
'
context
'
,
virtual
(
'
finish
'
,
returns
=
'
void
'
,
const
=
True
)
)
%>
%>
#endif
#endif
...
...
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