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
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
12 changed files
with
210 additions
and
72 deletions
+210
-72
src/targets/gpu/hip.cpp
src/targets/gpu/hip.cpp
+2
-0
src/targets/gpu/include/migraph/gpu/context.hpp
src/targets/gpu/include/migraph/gpu/context.hpp
+3
-0
src/targets/gpu/include/migraph/gpu/eliminate_allocation.hpp
src/targets/gpu/include/migraph/gpu/eliminate_allocation.hpp
+20
-0
src/targets/gpu/include/migraph/gpu/hip.hpp
src/targets/gpu/include/migraph/gpu/hip.hpp
+39
-0
src/targets/gpu/include/migraph/gpu/write_literals.hpp
src/targets/gpu/include/migraph/gpu/write_literals.hpp
+2
-0
src/targets/gpu/lowering.cpp
src/targets/gpu/lowering.cpp
+18
-32
src/targets/gpu/target.cpp
src/targets/gpu/target.cpp
+7
-5
src/targets/gpu/write_literals.cpp
src/targets/gpu/write_literals.cpp
+21
-3
test/CMakeLists.txt
test/CMakeLists.txt
+4
-1
test/gpu/miopen.cpp
test/gpu/miopen.cpp
+87
-28
test/onnx/onnx_test.cpp
test/onnx/onnx_test.cpp
+2
-2
tools/include/context.hpp
tools/include/context.hpp
+5
-1
No files found.
src/targets/gpu/hip.cpp
View file @
df78aadf
...
@@ -88,6 +88,8 @@ argument from_gpu(argument arg)
...
@@ -88,6 +88,8 @@ argument from_gpu(argument arg)
return
result
;
return
result
;
}
}
void
gpu_sync
()
{
hipDeviceSynchronize
();
}
}
// namespace gpu
}
// namespace gpu
}
// namespace migraph
}
// namespace migraph
src/targets/gpu/include/migraph/gpu/context.hpp
View file @
df78aadf
...
@@ -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,8 @@ struct context
...
@@ -11,6 +12,8 @@ struct context
{
{
shared
<
miopen_handle
>
handle
;
shared
<
miopen_handle
>
handle
;
shared
<
rocblas_handle_ptr
>
rbhandle
;
shared
<
rocblas_handle_ptr
>
rbhandle
;
std
::
vector
<
argument
>
literals
{};
void
finish
()
const
{
gpu_sync
();
}
};
};
}
// namespace gpu
}
// namespace gpu
...
...
src/targets/gpu/include/migraph/gpu/eliminate_allocation.hpp
0 → 100644
View file @
df78aadf
#ifndef MIGRAPH_GUARD_RTGLIB_ELIMINATE_ALLOCATION_HPP
#define MIGRAPH_GUARD_RTGLIB_ELIMINATE_ALLOCATION_HPP
#include <string>
#include <migraph/instruction_ref.hpp>
namespace
migraph
{
struct
program
;
namespace
gpu
{
struct
eliminate_allocation
{
std
::
string
name
()
const
{
return
"eliminate_allocation"
;
}
void
apply
(
program
&
p
)
const
;
};
}
// namespace gpu
}
// namespace migraph
#endif
src/targets/gpu/include/migraph/gpu/hip.hpp
View file @
df78aadf
...
@@ -13,6 +13,8 @@ migraph::argument to_gpu(migraph::argument arg, bool host = false);
...
@@ -13,6 +13,8 @@ migraph::argument to_gpu(migraph::argument arg, bool host = false);
migraph
::
argument
from_gpu
(
migraph
::
argument
arg
);
migraph
::
argument
from_gpu
(
migraph
::
argument
arg
);
void
gpu_sync
();
struct
hip_allocate
struct
hip_allocate
{
{
std
::
string
tag
{};
std
::
string
tag
{};
...
@@ -28,6 +30,43 @@ struct hip_allocate
...
@@ -28,6 +30,43 @@ struct hip_allocate
}
}
};
};
struct
hip_load
{
shape
s
;
std
::
size_t
offset
=
0
;
std
::
string
name
()
const
{
return
"hip::load"
;
}
shape
compute_shape
(
const
std
::
vector
<
shape
>&
inputs
)
const
{
check_shapes
{
inputs
}.
has
(
1
);
return
s
;
}
argument
compute
(
context
&
,
const
shape
&
,
const
std
::
vector
<
argument
>&
args
)
const
{
return
{
s
,
args
[
0
].
data
()
+
offset
};
}
};
struct
hip_sync
{
std
::
string
tag
{};
std
::
string
name
()
const
{
return
"hip::sync"
;
}
shape
compute_shape
(
const
std
::
vector
<
shape
>&
inputs
)
const
{
if
(
inputs
.
empty
())
return
{};
else
return
inputs
.
front
();
}
argument
compute
(
context
&
,
const
shape
&
,
const
std
::
vector
<
argument
>&
args
)
const
{
gpu_sync
();
if
(
args
.
empty
())
return
{};
else
return
args
.
front
();
}
};
struct
hip_write
struct
hip_write
{
{
std
::
string
name
()
const
{
return
"hip::write"
;
}
std
::
string
name
()
const
{
return
"hip::write"
;
}
...
...
src/targets/gpu/include/migraph/gpu/write_literals.hpp
View file @
df78aadf
...
@@ -2,6 +2,7 @@
...
@@ -2,6 +2,7 @@
#define MIGRAPH_GUARD_RTGLIB_MIOPEN_WRITE_LITERALS_HPP
#define MIGRAPH_GUARD_RTGLIB_MIOPEN_WRITE_LITERALS_HPP
#include <migraph/program.hpp>
#include <migraph/program.hpp>
#include <migraph/gpu/context.hpp>
namespace
migraph
{
namespace
migraph
{
...
@@ -9,6 +10,7 @@ namespace gpu {
...
@@ -9,6 +10,7 @@ namespace gpu {
struct
write_literals
struct
write_literals
{
{
context
*
ctx
=
nullptr
;
std
::
string
name
()
const
{
return
"gpu::write_literals"
;
}
std
::
string
name
()
const
{
return
"gpu::write_literals"
;
}
void
apply
(
program
&
p
)
const
;
void
apply
(
program
&
p
)
const
;
...
...
src/targets/gpu/lowering.cpp
View file @
df78aadf
...
@@ -180,38 +180,22 @@ struct miopen_add
...
@@ -180,38 +180,22 @@ struct miopen_add
argument
argument
compute
(
context
&
ctx
,
const
shape
&
output_shape
,
const
std
::
vector
<
argument
>&
args
)
const
compute
(
context
&
ctx
,
const
shape
&
output_shape
,
const
std
::
vector
<
argument
>&
args
)
const
{
{
if
(
args
[
1
].
get_shape
().
broadcasted
())
float
alpha
=
1
,
beta
=
0
;
{
auto
a_desc
=
make_tensor
(
args
[
0
].
get_shape
());
argument
result
{
output_shape
};
auto
b_desc
=
make_tensor
(
args
[
1
].
get_shape
());
auto
c_desc
=
make_tensor
(
output_shape
);
visit_all
(
result
,
from_gpu
(
args
[
0
]),
from_gpu
(
args
[
1
]))(
miopenOpTensor
(
ctx
.
handle
.
get
(),
[
&
](
auto
output
,
auto
input1
,
auto
input2
)
{
miopenTensorOpAdd
,
shape_for_each
(
output
.
get_shape
(),
[
&
](
const
auto
&
idx
)
{
&
alpha
,
output
(
idx
.
begin
(),
idx
.
end
())
=
a_desc
.
get
(),
input1
(
idx
.
begin
(),
idx
.
end
())
+
input2
(
idx
.
begin
(),
idx
.
end
());
args
[
0
].
implicit
(),
});
&
alpha
,
});
b_desc
.
get
(),
return
to_gpu
(
result
);
args
[
1
].
implicit
(),
}
&
beta
,
else
c_desc
.
get
(),
{
args
[
2
].
implicit
());
float
alpha
=
1
,
beta
=
0
;
return
args
[
2
];
auto
a_desc
=
make_tensor
(
args
[
0
].
get_shape
());
auto
b_desc
=
make_tensor
(
args
[
1
].
get_shape
());
auto
c_desc
=
make_tensor
(
output_shape
);
miopenOpTensor
(
ctx
.
handle
.
get
(),
miopenTensorOpAdd
,
&
alpha
,
a_desc
.
get
(),
args
[
0
].
implicit
(),
&
alpha
,
b_desc
.
get
(),
args
[
1
].
implicit
(),
&
beta
,
c_desc
.
get
(),
args
[
2
].
implicit
());
return
args
[
2
];
}
}
}
};
};
...
@@ -266,6 +250,8 @@ struct miopen_contiguous
...
@@ -266,6 +250,8 @@ struct miopen_contiguous
}
}
argument
compute
(
context
&
,
shape
output_shape
,
const
std
::
vector
<
argument
>&
args
)
const
argument
compute
(
context
&
,
shape
output_shape
,
const
std
::
vector
<
argument
>&
args
)
const
{
{
assert
(
output_shape
==
args
[
1
].
get_shape
());
assert
(
output_shape
.
standard
());
hip_contiguous
(
std
::
move
(
output_shape
),
args
.
at
(
0
),
args
.
at
(
1
));
hip_contiguous
(
std
::
move
(
output_shape
),
args
.
at
(
0
),
args
.
at
(
1
));
return
args
.
at
(
1
);
return
args
.
at
(
1
);
}
}
...
...
src/targets/gpu/target.cpp
View file @
df78aadf
...
@@ -3,6 +3,7 @@
...
@@ -3,6 +3,7 @@
#include <migraph/gpu/write_literals.hpp>
#include <migraph/gpu/write_literals.hpp>
#include <migraph/gpu/context.hpp>
#include <migraph/gpu/context.hpp>
#include <migraph/gpu/eliminate_workspace.hpp>
#include <migraph/gpu/eliminate_workspace.hpp>
#include <migraph/gpu/eliminate_allocation.hpp>
#include <migraph/check_context.hpp>
#include <migraph/check_context.hpp>
#include <migraph/auto_contiguous.hpp>
#include <migraph/auto_contiguous.hpp>
#include <migraph/dead_code_elimination.hpp>
#include <migraph/dead_code_elimination.hpp>
...
@@ -18,16 +19,17 @@ std::vector<pass> target::get_passes(migraph::context& gctx) const
...
@@ -18,16 +19,17 @@ std::vector<pass> target::get_passes(migraph::context& gctx) const
// clang-format off
// clang-format off
return
return
{
{
//
dead_code_elimination{},
dead_code_elimination
{},
auto_contiguous
{},
auto_contiguous
{},
//
simplify_reshapes{},
simplify_reshapes
{},
//
dead_code_elimination{},
dead_code_elimination
{},
lowering
{
ctx
},
lowering
{
ctx
},
eliminate_workspace
{},
eliminate_workspace
{},
eliminate_contiguous
{},
eliminate_contiguous
{},
dead_code_elimination
{},
dead_code_elimination
{},
write_literals
{},
write_literals
{
&
ctx
},
//check_context<context>{},
eliminate_allocation
{},
check_context
<
context
>
{},
dead_code_elimination
{}
dead_code_elimination
{}
};
};
// clang-format on
// clang-format on
...
...
src/targets/gpu/write_literals.cpp
View file @
df78aadf
...
@@ -7,15 +7,33 @@ namespace migraph {
...
@@ -7,15 +7,33 @@ namespace migraph {
namespace
gpu
{
namespace
gpu
{
struct
hip_load_literal
{
shape
s
;
std
::
size_t
n
=
0
;
std
::
string
name
()
const
{
return
"hip::load_literal"
;
}
shape
compute_shape
(
const
std
::
vector
<
shape
>&
inputs
)
const
{
check_shapes
{
inputs
}.
has
(
0
);
return
s
;
}
argument
compute
(
context
&
ctx
,
const
shape
&
,
const
std
::
vector
<
argument
>&
)
const
{
return
ctx
.
literals
.
at
(
n
);
}
};
void
write_literals
::
apply
(
program
&
p
)
const
void
write_literals
::
apply
(
program
&
p
)
const
{
{
assert
(
ctx
!=
nullptr
);
for
(
auto
ins
:
iterator_for
(
p
))
for
(
auto
ins
:
iterator_for
(
p
))
{
{
if
(
ins
->
op
.
name
()
==
"@literal"
)
if
(
ins
->
op
.
name
()
==
"@literal"
)
{
{
literal
l
=
ins
->
lit
;
argument
a
=
to_gpu
(
ins
->
lit
.
get_argument
());
auto
pre
=
p
.
add_literal
(
l
);
std
::
size_t
n
=
ctx
->
literals
.
size
();
p
.
replace_instruction
(
ins
,
hip_write
{},
pre
);
ctx
->
literals
.
push_back
(
a
);
p
.
replace_instruction
(
ins
,
hip_load_literal
{
a
.
get_shape
(),
n
});
}
}
}
}
}
}
...
...
test/CMakeLists.txt
View file @
df78aadf
...
@@ -68,7 +68,6 @@ endfunction()
...
@@ -68,7 +68,6 @@ endfunction()
function
(
add_test_executable TEST_NAME
)
function
(
add_test_executable TEST_NAME
)
add_executable
(
${
TEST_NAME
}
EXCLUDE_FROM_ALL
${
ARGN
}
)
add_executable
(
${
TEST_NAME
}
EXCLUDE_FROM_ALL
${
ARGN
}
)
rocm_clang_tidy_check
(
${
TEST_NAME
}
)
target_link_libraries
(
${
TEST_NAME
}
${
CMAKE_THREAD_LIBS_INIT
}
)
target_link_libraries
(
${
TEST_NAME
}
${
CMAKE_THREAD_LIBS_INIT
}
)
# Cmake does not add flags correctly for gcc
# Cmake does not add flags correctly for gcc
if
(
CMAKE_CXX_COMPILER_ID MATCHES
"GNU"
)
if
(
CMAKE_CXX_COMPILER_ID MATCHES
"GNU"
)
...
@@ -93,6 +92,7 @@ file(GLOB TESTS *.cpp)
...
@@ -93,6 +92,7 @@ file(GLOB TESTS *.cpp)
foreach
(
TEST
${
TESTS
}
)
foreach
(
TEST
${
TESTS
}
)
get_filename_component
(
BASE_NAME
${
TEST
}
NAME_WE
)
get_filename_component
(
BASE_NAME
${
TEST
}
NAME_WE
)
add_test_executable
(
test_
${
BASE_NAME
}
${
TEST
}
)
add_test_executable
(
test_
${
BASE_NAME
}
${
TEST
}
)
rocm_clang_tidy_check
(
test_
${
BASE_NAME
}
)
endforeach
()
endforeach
()
if
(
MIGRAPH_ENABLE_GPU
)
if
(
MIGRAPH_ENABLE_GPU
)
...
@@ -102,12 +102,15 @@ if(MIGRAPH_ENABLE_GPU)
...
@@ -102,12 +102,15 @@ if(MIGRAPH_ENABLE_GPU)
foreach
(
TEST
${
GPU_TESTS
}
)
foreach
(
TEST
${
GPU_TESTS
}
)
get_filename_component
(
BASE_NAME
${
TEST
}
NAME_WE
)
get_filename_component
(
BASE_NAME
${
TEST
}
NAME_WE
)
add_test_executable
(
test_gpu_
${
BASE_NAME
}
${
TEST
}
)
add_test_executable
(
test_gpu_
${
BASE_NAME
}
${
TEST
}
)
rocm_clang_tidy_check
(
test_gpu_
${
BASE_NAME
}
)
set_tests_properties
(
test_gpu_
${
BASE_NAME
}
PROPERTIES COST 10
)
target_link_libraries
(
test_gpu_
${
BASE_NAME
}
migraph_gpu
)
target_link_libraries
(
test_gpu_
${
BASE_NAME
}
migraph_gpu
)
endforeach
()
endforeach
()
endif
()
endif
()
# Onnx test
# Onnx test
add_executable
(
test_onnx onnx/onnx_test.cpp
)
add_executable
(
test_onnx onnx/onnx_test.cpp
)
rocm_clang_tidy_check
(
test_onnx
)
target_link_libraries
(
test_onnx migraph_onnx
)
target_link_libraries
(
test_onnx migraph_onnx
)
target_include_directories
(
test_onnx PUBLIC include
)
target_include_directories
(
test_onnx PUBLIC include
)
add_test
(
NAME test_onnx COMMAND $<TARGET_FILE:test_onnx> WORKING_DIRECTORY
${
CMAKE_CURRENT_SOURCE_DIR
}
/onnx
)
add_test
(
NAME test_onnx COMMAND $<TARGET_FILE:test_onnx> WORKING_DIRECTORY
${
CMAKE_CURRENT_SOURCE_DIR
}
/onnx
)
...
...
test/gpu/miopen.cpp
View file @
df78aadf
...
@@ -24,17 +24,44 @@
...
@@ -24,17 +24,44 @@
// An improved async, that doesn't block
// An improved async, that doesn't block
template
<
class
Function
>
template
<
class
Function
>
std
::
future
<
typename
std
::
result_of
<
Function
()
>::
type
>
detach_async
(
Function
&&
f
)
std
::
future
<
typename
std
::
result_of
<
Function
()
>::
type
>
detach_async
(
Function
&&
f
,
bool
parallel
=
true
)
{
{
using
result_type
=
typename
std
::
result_of
<
Function
()
>::
type
;
if
(
parallel
)
std
::
packaged_task
<
result_type
()
>
task
(
std
::
forward
<
Function
>
(
f
));
{
auto
fut
=
task
.
get_future
();
using
result_type
=
typename
std
::
result_of
<
Function
()
>::
type
;
std
::
thread
(
std
::
move
(
task
)).
detach
();
std
::
packaged_task
<
result_type
()
>
task
(
std
::
forward
<
Function
>
(
f
));
return
std
::
move
(
fut
);
auto
fut
=
task
.
get_future
();
std
::
thread
(
std
::
move
(
task
)).
detach
();
return
std
::
move
(
fut
);
}
else
{
return
std
::
async
(
std
::
launch
::
deferred
,
std
::
forward
<
Function
>
(
f
));
}
}
}
struct
auto_print
struct
auto_print
{
{
static
void
set_terminate_handler
(
const
std
::
string
&
name
)
{
static
std
::
string
pname
;
pname
=
name
;
std
::
set_terminate
(
+
[]
{
std
::
cout
<<
"FAILED: "
<<
pname
<<
std
::
endl
;
try
{
std
::
rethrow_exception
(
std
::
current_exception
());
}
catch
(
const
std
::
exception
&
e
)
{
std
::
cout
<<
" what(): "
<<
e
.
what
()
<<
std
::
endl
;
}
std
::
cout
<<
std
::
endl
;
for
(
auto
&&
handle
:
auto_print
::
handlers
)
handle
();
});
}
static
std
::
array
<
std
::
function
<
void
()
>
,
2
>
handlers
;
static
std
::
array
<
std
::
function
<
void
()
>
,
2
>
handlers
;
int
index
;
int
index
;
template
<
class
T
>
template
<
class
T
>
...
@@ -50,13 +77,26 @@ struct auto_print
...
@@ -50,13 +77,26 @@ struct auto_print
};
};
std
::
array
<
std
::
function
<
void
()
>
,
2
>
auto_print
::
handlers
=
{};
std
::
array
<
std
::
function
<
void
()
>
,
2
>
auto_print
::
handlers
=
{};
void
compile_check
(
migraph
::
program
&
p
,
const
migraph
::
target
&
t
)
{
auto
name
=
t
.
name
();
auto
s
=
p
.
get_shape
();
std
::
stringstream
ss
;
p
.
compile
(
t
,
migraph
::
tracer
{
ss
});
if
(
p
.
get_shape
()
!=
s
)
{
std
::
cout
<<
ss
.
str
()
<<
std
::
endl
;
throw
std
::
runtime_error
(
"Compiling program with "
+
name
+
" alters its shape"
);
}
}
template
<
class
V
>
template
<
class
V
>
migraph
::
argument
run_cpu
()
migraph
::
argument
run_cpu
()
{
{
V
v
;
V
v
;
auto
p
=
v
.
create_program
();
auto
p
=
v
.
create_program
();
auto_print
pp
{
p
,
0
};
auto_print
pp
{
p
,
0
};
p
.
compile
(
migraph
::
cpu
::
cpu_target
{});
compile
_check
(
p
,
migraph
::
cpu
::
cpu_target
{});
migraph
::
program
::
parameter_map
m
;
migraph
::
program
::
parameter_map
m
;
for
(
auto
&&
x
:
p
.
get_parameter_shapes
())
for
(
auto
&&
x
:
p
.
get_parameter_shapes
())
{
{
...
@@ -71,7 +111,7 @@ migraph::argument run_gpu()
...
@@ -71,7 +111,7 @@ migraph::argument run_gpu()
V
v
;
V
v
;
auto
p
=
v
.
create_program
();
auto
p
=
v
.
create_program
();
auto_print
pp
{
p
,
1
};
auto_print
pp
{
p
,
1
};
p
.
compile
(
migraph
::
gpu
::
target
{});
compile
_check
(
p
,
migraph
::
gpu
::
target
{});
migraph
::
program
::
parameter_map
m
;
migraph
::
program
::
parameter_map
m
;
for
(
auto
&&
x
:
p
.
get_parameter_shapes
())
for
(
auto
&&
x
:
p
.
get_parameter_shapes
())
...
@@ -82,32 +122,49 @@ migraph::argument run_gpu()
...
@@ -82,32 +122,49 @@ migraph::argument run_gpu()
return
migraph
::
gpu
::
from_gpu
(
p
.
eval
(
m
));
return
migraph
::
gpu
::
from_gpu
(
p
.
eval
(
m
));
}
}
template
<
class
V
>
void
verify_args
(
const
std
::
string
&
name
,
void
verify_program
()
const
migraph
::
argument
&
cpu_arg
,
const
migraph
::
argument
&
gpu_arg
)
{
{
std
::
set_terminate
(
+
[]
{
visit_all
(
cpu_arg
,
gpu_arg
)([
&
](
auto
cpu
,
auto
gpu
)
{
std
::
cout
<<
"FAILED: "
<<
migraph
::
get_type_name
<
V
>
()
<<
std
::
endl
;
try
{
std
::
rethrow_exception
(
std
::
current_exception
());
}
catch
(
const
std
::
exception
&
e
)
{
std
::
cout
<<
" what(): "
<<
e
.
what
()
<<
std
::
endl
;
}
std
::
cout
<<
std
::
endl
;
for
(
auto
&&
handle
:
auto_print
::
handlers
)
handle
();
});
auto
cpu_arg_f
=
detach_async
([]
{
return
run_cpu
<
V
>
();
});
auto
gpu_arg
=
run_gpu
<
V
>
();
visit_all
(
cpu_arg_f
.
get
(),
gpu_arg
)([](
auto
cpu
,
auto
gpu
)
{
if
(
not
migraph
::
verify_range
(
cpu
,
gpu
))
if
(
not
migraph
::
verify_range
(
cpu
,
gpu
))
{
{
// TODO: Check for nans
// TODO: Check for nans
std
::
cout
<<
"FAILED: "
<<
migraph
::
get_type_name
<
V
>
()
<<
std
::
endl
;
std
::
cout
<<
"FAILED: "
<<
name
<<
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
;
}
}
});
});
}
template
<
class
V
>
void
verify_program
()
{
auto_print
::
set_terminate_handler
(
migraph
::
get_type_name
<
V
>
());
auto
cpu_arg_f
=
detach_async
([]
{
return
run_cpu
<
V
>
();
});
auto
gpu_arg
=
run_gpu
<
V
>
();
verify_args
(
migraph
::
get_type_name
<
V
>
(),
cpu_arg_f
.
get
(),
gpu_arg
);
std
::
set_terminate
(
nullptr
);
std
::
set_terminate
(
nullptr
);
}
}
...
@@ -255,6 +312,7 @@ struct test_contiguous
...
@@ -255,6 +312,7 @@ struct test_contiguous
migraph
::
shape
s
{
migraph
::
shape
::
float_type
,
{
4
,
4
,
4
,
3
},
{
48
,
4
,
1
,
16
}};
migraph
::
shape
s
{
migraph
::
shape
::
float_type
,
{
4
,
4
,
4
,
3
},
{
48
,
4
,
1
,
16
}};
auto
x
=
p
.
add_parameter
(
"x"
,
s
);
auto
x
=
p
.
add_parameter
(
"x"
,
s
);
p
.
add_instruction
(
migraph
::
contiguous
{},
x
);
p
.
add_instruction
(
migraph
::
contiguous
{},
x
);
EXPECT
(
p
.
get_shape
().
standard
());
return
p
;
return
p
;
}
}
};
};
...
@@ -358,4 +416,5 @@ int main()
...
@@ -358,4 +416,5 @@ int main()
verify_program
<
test_transpose
>
();
verify_program
<
test_transpose
>
();
verify_program
<
test_batchnorm_inference
>
();
verify_program
<
test_batchnorm_inference
>
();
verify_program
<
test_batchnorm_inference_2
>
();
verify_program
<
test_batchnorm_inference_2
>
();
verify_program
<
test_conv_bn_relu_pooling
>
();
}
}
test/onnx/onnx_test.cpp
View file @
df78aadf
...
@@ -61,7 +61,7 @@ void pytorch_conv_bn_relu_maxpool()
...
@@ -61,7 +61,7 @@ void pytorch_conv_bn_relu_maxpool()
EXPECT
(
p
==
prog
);
EXPECT
(
p
==
prog
);
}
}
void
pytorch_conv_relu_maxpool
X
2
()
void
pytorch_conv_relu_maxpool
_x
2
()
{
{
migraph
::
program
p
;
migraph
::
program
p
;
auto
l0
=
p
.
add_parameter
(
"0"
,
{
migraph
::
shape
::
float_type
,
{
1
,
3
,
32
,
32
}});
auto
l0
=
p
.
add_parameter
(
"0"
,
{
migraph
::
shape
::
float_type
,
{
1
,
3
,
32
,
32
}});
...
@@ -92,5 +92,5 @@ int main()
...
@@ -92,5 +92,5 @@ int main()
pytorch_conv_bias_test
();
pytorch_conv_bias_test
();
pytorch_conv_relu_maxpool
();
pytorch_conv_relu_maxpool
();
pytorch_conv_bn_relu_maxpool
();
pytorch_conv_bn_relu_maxpool
();
pytorch_conv_relu_maxpool
X
2
();
pytorch_conv_relu_maxpool
_x
2
();
}
}
tools/include/context.hpp
View file @
df78aadf
...
@@ -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
...
...
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