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
23ef67a7
Commit
23ef67a7
authored
Jul 25, 2018
by
Scott Thornton
Browse files
Merge branch 'master' into onnx_fixes
parents
7e23d5c4
68d69739
Changes
42
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
394 additions
and
60 deletions
+394
-60
src/targets/gpu/CMakeLists.txt
src/targets/gpu/CMakeLists.txt
+29
-0
src/targets/gpu/hip.cpp
src/targets/gpu/hip.cpp
+3
-3
src/targets/gpu/hip_contiguous.cpp
src/targets/gpu/hip_contiguous.cpp
+134
-0
src/targets/gpu/include/migraph/gpu/context.hpp
src/targets/gpu/include/migraph/gpu/context.hpp
+4
-4
src/targets/gpu/include/migraph/gpu/hip.hpp
src/targets/gpu/include/migraph/gpu/hip.hpp
+2
-2
src/targets/gpu/include/migraph/gpu/kernels.hpp
src/targets/gpu/include/migraph/gpu/kernels.hpp
+12
-0
src/targets/gpu/include/migraph/gpu/lowering.hpp
src/targets/gpu/include/migraph/gpu/lowering.hpp
+3
-3
src/targets/gpu/include/migraph/gpu/miopen.hpp
src/targets/gpu/include/migraph/gpu/miopen.hpp
+2
-2
src/targets/gpu/include/migraph/gpu/rocblas.hpp
src/targets/gpu/include/migraph/gpu/rocblas.hpp
+2
-2
src/targets/gpu/include/migraph/gpu/target.hpp
src/targets/gpu/include/migraph/gpu/target.hpp
+2
-2
src/targets/gpu/include/migraph/gpu/write_literals.hpp
src/targets/gpu/include/migraph/gpu/write_literals.hpp
+3
-3
src/targets/gpu/lowering.cpp
src/targets/gpu/lowering.cpp
+67
-12
src/targets/gpu/rocblas.cpp
src/targets/gpu/rocblas.cpp
+3
-3
src/targets/gpu/target.cpp
src/targets/gpu/target.cpp
+6
-6
src/targets/gpu/write_literals.cpp
src/targets/gpu/write_literals.cpp
+4
-4
test/CMakeLists.txt
test/CMakeLists.txt
+6
-6
test/gpu/miopen.cpp
test/gpu/miopen.cpp
+50
-8
tools/include/context.hpp
tools/include/context.hpp
+13
-0
tools/include/operation.hpp
tools/include/operation.hpp
+33
-0
tools/include/pass.hpp
tools/include/pass.hpp
+16
-0
No files found.
src/targets/
miopen
/CMakeLists.txt
→
src/targets/
gpu
/CMakeLists.txt
View file @
23ef67a7
...
...
@@ -10,13 +10,20 @@ if(NOT TARGET MIOpen)
message
(
SEND_ERROR
"Cant find miopen"
)
endif
()
add_library
(
migraph_miopen
add_library
(
migraph_device
hip_contiguous.cpp
)
rocm_clang_tidy_check
(
migraph_device
)
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
hip.cpp
target.cpp
lowering.cpp
write_literals.cpp
rocblas.cpp
)
rocm_clang_tidy_check
(
migraph_
miopen
)
target_link_libraries
(
migraph_
miopen
migraph MIOpen roc::rocblas
)
target_include_directories
(
migraph_
miopen
PUBLIC $<BUILD_INTERFACE:
${
CMAKE_CURRENT_SOURCE_DIR
}
/include>
)
rocm_clang_tidy_check
(
migraph_
gpu
)
target_link_libraries
(
migraph_
gpu
migraph MIOpen
migraph_device
roc::rocblas
)
target_include_directories
(
migraph_
gpu
PUBLIC $<BUILD_INTERFACE:
${
CMAKE_CURRENT_SOURCE_DIR
}
/include>
)
src/targets/
miopen
/hip.cpp
→
src/targets/
gpu
/hip.cpp
View file @
23ef67a7
#include <migraph/
miopen
/hip.hpp>
#include <migraph/
gpu
/hip.hpp>
#include <migraph/manage_ptr.hpp>
#include <miopen/miopen.h>
...
...
@@ -7,7 +7,7 @@
#include <vector>
namespace
migraph
{
namespace
miopen
{
namespace
gpu
{
using
hip_ptr
=
MIGRAPH_MANAGE_PTR
(
void
,
hipFree
);
...
...
@@ -67,6 +67,6 @@ migraph::argument from_gpu(migraph::argument arg)
return
result
;
}
}
// namespace
miopen
}
// namespace
gpu
}
// namespace migraph
src/targets/gpu/hip_contiguous.cpp
0 → 100644
View file @
23ef67a7
#include <hip/hip_runtime.h>
#include <migraph/operators.hpp>
namespace
migraph
{
namespace
gpu
{
template
<
class
F
>
void
visit_tensor_size
(
std
::
size_t
n
,
F
f
)
{
switch
(
n
)
{
case
0
:
{
f
(
std
::
integral_constant
<
std
::
size_t
,
0
>
{});
break
;
}
case
1
:
{
f
(
std
::
integral_constant
<
std
::
size_t
,
1
>
{});
break
;
}
case
2
:
{
f
(
std
::
integral_constant
<
std
::
size_t
,
2
>
{});
break
;
}
case
3
:
{
f
(
std
::
integral_constant
<
std
::
size_t
,
3
>
{});
break
;
}
case
4
:
{
f
(
std
::
integral_constant
<
std
::
size_t
,
4
>
{});
break
;
}
case
5
:
{
f
(
std
::
integral_constant
<
std
::
size_t
,
5
>
{});
break
;
}
default:
throw
std
::
runtime_error
(
"Unknown tensor size"
);
}
}
template
<
size_t
NDim
>
struct
hip_index
{
size_t
d
[
NDim
];
__device__
__host__
size_t
&
operator
[](
size_t
i
)
{
return
d
[
i
];
}
__device__
__host__
size_t
operator
[](
size_t
i
)
const
{
return
d
[
i
];
}
};
template
<
size_t
NDim
>
struct
hip_tensor_descriptor
{
__device__
__host__
hip_tensor_descriptor
()
=
default
;
template
<
typename
T
,
typename
V
>
__device__
__host__
hip_tensor_descriptor
(
const
T
&
lens_ext
,
const
V
&
strides_ext
)
{
for
(
size_t
i
=
0
;
i
<
NDim
;
i
++
)
lens
[
i
]
=
lens_ext
[
i
];
for
(
size_t
i
=
0
;
i
<
NDim
;
i
++
)
strides
[
i
]
=
strides_ext
[
i
];
}
__device__
__host__
hip_index
<
NDim
>
multi
(
size_t
idx
)
{
hip_index
<
NDim
>
result
{};
size_t
tidx
=
idx
;
for
(
size_t
is
=
0
;
is
<
NDim
;
is
++
)
{
result
[
is
]
=
tidx
/
strides
[
is
];
tidx
=
tidx
%
strides
[
is
];
}
return
result
;
}
__device__
__host__
size_t
linear
(
hip_index
<
NDim
>
s
)
{
size_t
idx
=
0
;
for
(
size_t
i
=
0
;
i
<
NDim
;
i
++
)
idx
+=
s
[
i
]
*
strides
[
i
];
return
idx
;
}
size_t
lens
[
NDim
]
=
{};
size_t
strides
[
NDim
]
=
{};
};
template
<
typename
T
,
size_t
NDim
>
__global__
void
contiguous_gpu
(
const
T
*
a
,
hip_tensor_descriptor
<
NDim
>
a_desc
,
T
*
at
,
hip_tensor_descriptor
<
NDim
>
at_desc
,
size_t
nelements
)
{
for
(
size_t
i
=
blockIdx
.
x
*
blockDim
.
x
+
threadIdx
.
x
;
i
<
nelements
;
i
+=
blockDim
.
x
*
gridDim
.
x
)
{
hip_index
<
NDim
>
s
=
at_desc
.
multi
(
i
);
size_t
lidx
=
a_desc
.
linear
(
s
);
at
[
i
]
=
a
[
lidx
];
}
}
void
hip_contiguous
(
migraph
::
shape
output_shape
,
migraph
::
argument
arg
,
migraph
::
argument
result
)
{
size_t
ndim
=
output_shape
.
lens
().
size
();
visit_all
(
result
,
arg
)([
&
](
auto
output
,
auto
input
)
{
if
(
ndim
==
4
)
{
const
auto
&
s
=
arg
.
get_shape
();
hip_tensor_descriptor
<
4
>
a_desc
(
s
.
lens
(),
s
.
strides
());
hip_tensor_descriptor
<
4
>
at_desc
(
output_shape
.
lens
(),
output_shape
.
strides
());
dim3
nblocks
(
512
);
dim3
nthreads
(
512
);
hipLaunchKernelGGL
((
contiguous_gpu
<
int
,
4
>
),
nblocks
,
nthreads
,
0
,
nullptr
,
input
.
data
(),
a_desc
,
output
.
data
(),
at_desc
,
s
.
elements
());
}
else
{
MIGRAPH_THROW
(
"contiguous is only valid for 4D tensors"
);
}
});
}
}
// namespace gpu
}
// namespace migraph
src/targets/
miopen
/include/migraph/
miopen
/context.hpp
→
src/targets/
gpu
/include/migraph/
gpu
/context.hpp
View file @
23ef67a7
#ifndef MIGRAPH_GUARD_RTGLIB_CONTEXT_HPP
#define MIGRAPH_GUARD_RTGLIB_CONTEXT_HPP
#include <migraph/
miopen
/miopen.hpp>
#include <migraph/
miopen
/rocblas.hpp>
#include <migraph/
gpu
/miopen.hpp>
#include <migraph/
gpu
/rocblas.hpp>
namespace
migraph
{
namespace
miopen
{
namespace
gpu
{
struct
context
{
...
...
@@ -13,7 +13,7 @@ struct context
shared
<
rocblas_handle_ptr
>
rbhandle
;
};
}
// namespace
miopen
}
// namespace
gpu
}
// namespace migraph
...
...
src/targets/
miopen
/include/migraph/
miopen
/hip.hpp
→
src/targets/
gpu
/include/migraph/
gpu
/hip.hpp
View file @
23ef67a7
...
...
@@ -4,7 +4,7 @@
#include <migraph/operators.hpp>
namespace
migraph
{
namespace
miopen
{
namespace
gpu
{
migraph
::
argument
allocate_gpu
(
migraph
::
shape
s
);
...
...
@@ -40,7 +40,7 @@ struct hip_write
}
};
}
// namespace
miopen
}
// namespace
gpu
}
// namespace migraph
...
...
src/targets/gpu/include/migraph/gpu/kernels.hpp
0 → 100644
View file @
23ef67a7
#ifndef MIGRAPH_GUARD_MIGRAPHLIB_KERNELS_HPP
#define MIGRAPH_GUARD_MIGRAPHLIB_KERNELS_HPP
namespace
migraph
{
namespace
gpu
{
void
hip_contiguous
(
migraph
::
shape
output_shape
,
migraph
::
argument
arg
,
migraph
::
argument
result
);
}
// namespace gpu
}
// namespace migraph
#endif
src/targets/
miopen
/include/migraph/
miopen
/lowering.hpp
→
src/targets/
gpu
/include/migraph/
gpu
/lowering.hpp
View file @
23ef67a7
...
...
@@ -4,15 +4,15 @@
#include <migraph/program.hpp>
namespace
migraph
{
namespace
miopen
{
namespace
gpu
{
struct
lowering
{
std
::
string
name
()
const
{
return
"
miopen
::lowering"
;
}
std
::
string
name
()
const
{
return
"
gpu
::lowering"
;
}
void
apply
(
program
&
p
)
const
;
};
}
// namespace
miopen
}
// namespace
gpu
}
// namespace migraph
...
...
src/targets/
miopen
/include/migraph/
miopen
/miopen.hpp
→
src/targets/
gpu
/include/migraph/
gpu
/miopen.hpp
View file @
23ef67a7
...
...
@@ -6,7 +6,7 @@
#include <miopen/miopen.h>
namespace
migraph
{
namespace
miopen
{
namespace
gpu
{
using
miopen_handle
=
MIGRAPH_MANAGE_PTR
(
miopenHandle_t
,
miopenDestroy
);
using
tensor_descriptor
=
MIGRAPH_MANAGE_PTR
(
miopenTensorDescriptor_t
,
...
...
@@ -84,7 +84,7 @@ inline activation_descriptor make_relu()
return
ad
;
}
}
// namespace
miopen
}
// namespace
gpu
}
// namespace migraph
...
...
src/targets/
miopen
/include/migraph/
miopen
/rocblas.hpp
→
src/targets/
gpu
/include/migraph/
gpu
/rocblas.hpp
View file @
23ef67a7
...
...
@@ -6,13 +6,13 @@
#include <rocblas.h>
namespace
migraph
{
namespace
miopen
{
namespace
gpu
{
using
rocblas_handle_ptr
=
MIGRAPH_MANAGE_PTR
(
rocblas_handle
,
rocblas_destroy_handle
);
rocblas_handle_ptr
create_rocblas_handle_ptr
();
}
// namespace
miopen
}
// namespace
gpu
}
// namespace migraph
...
...
src/targets/
miopen
/include/migraph/
miopen
/target.hpp
→
src/targets/
gpu
/include/migraph/
gpu
/target.hpp
View file @
23ef67a7
...
...
@@ -4,7 +4,7 @@
#include <migraph/program.hpp>
namespace
migraph
{
namespace
miopen
{
namespace
gpu
{
struct
target
{
...
...
@@ -13,7 +13,7 @@ struct target
migraph
::
context
get_context
()
const
;
};
}
// namespace
miopen
}
// namespace
gpu
}
// namespace migraph
...
...
src/targets/
miopen
/include/migraph/
miopen
/write_literals.hpp
→
src/targets/
gpu
/include/migraph/
gpu
/write_literals.hpp
View file @
23ef67a7
...
...
@@ -5,16 +5,16 @@
namespace
migraph
{
namespace
miopen
{
namespace
gpu
{
struct
write_literals
{
std
::
string
name
()
const
{
return
"
miopen
::write_literals"
;
}
std
::
string
name
()
const
{
return
"
gpu
::write_literals"
;
}
void
apply
(
program
&
p
)
const
;
};
}
// namespace
miopen
}
// namespace
gpu
}
// namespace migraph
...
...
src/targets/
miopen
/lowering.cpp
→
src/targets/
gpu
/lowering.cpp
View file @
23ef67a7
#include <rocblas.h>
#include <migraph/
miopen
/lowering.hpp>
#include <migraph/
gpu
/lowering.hpp>
#include <migraph/manage_ptr.hpp>
#include <migraph/instruction.hpp>
#include <migraph/operators.hpp>
#include <migraph/shape_for_each.hpp>
#include <migraph/
miopen
/miopen.hpp>
#include <migraph/
miopen
/hip.hpp>
#include <migraph/
gpu
/miopen.hpp>
#include <migraph/
gpu
/hip.hpp>
#include <migraph/dfor.hpp>
#include <migraph/gpu/kernels.hpp>
#include <migraph/iterator_for.hpp>
#include <migraph/
miopen
/rocblas.hpp>
#include <migraph/
miopen
/context.hpp>
#include <migraph/
gpu
/rocblas.hpp>
#include <migraph/
gpu
/context.hpp>
namespace
migraph
{
namespace
miopen
{
namespace
gpu
{
struct
miopen_convolution
{
convolution
op
;
shared
<
convolution_descriptor
>
cd
;
std
::
string
name
()
const
{
return
"
miopen
::convolution"
;
}
std
::
string
name
()
const
{
return
"
gpu
::convolution"
;
}
shape
compute_shape
(
std
::
vector
<
shape
>
inputs
)
const
{
check_shapes
{
inputs
,
*
this
}.
has
(
3
);
...
...
@@ -70,7 +71,7 @@ struct miopen_pooling
pooling
op
;
shared
<
pooling_descriptor
>
pd
;
std
::
string
name
()
const
{
return
"
miopen
::pooling"
;
}
std
::
string
name
()
const
{
return
"
gpu
::pooling"
;
}
shape
compute_shape
(
std
::
vector
<
shape
>
inputs
)
const
{
check_shapes
{
inputs
,
*
this
}.
has
(
2
);
...
...
@@ -101,7 +102,7 @@ struct miopen_pooling
struct
miopen_add
{
std
::
string
name
()
const
{
return
"
miopen
::add"
;
}
std
::
string
name
()
const
{
return
"
gpu
::add"
;
}
shape
compute_shape
(
std
::
vector
<
shape
>
inputs
)
const
{
check_shapes
{
inputs
,
*
this
}.
has
(
3
);
...
...
@@ -148,7 +149,7 @@ struct miopen_add
struct
miopen_gemm
{
gemm
op
;
std
::
string
name
()
const
{
return
"
miopen
::convolution"
;
}
std
::
string
name
()
const
{
return
"
gpu
::convolution"
;
}
shape
compute_shape
(
std
::
vector
<
shape
>
inputs
)
const
{
check_shapes
{
inputs
,
*
this
}.
has
(
3
);
...
...
@@ -182,10 +183,42 @@ struct miopen_gemm
}
};
struct
miopen_transpose
{
transpose
op
;
std
::
string
name
()
const
{
return
"gpu::transpose"
;
}
shape
compute_shape
(
std
::
vector
<
shape
>
inputs
)
const
{
check_shapes
{
inputs
,
*
this
}.
has
(
2
);
return
op
.
compute_shape
({
inputs
.
at
(
0
)});
}
argument
compute
(
context
&
,
shape
output_shape
,
std
::
vector
<
argument
>
args
)
const
{
return
{
output_shape
,
std
::
move
(
args
.
front
().
data
)};
}
};
struct
miopen_contiguous
{
contiguous
op
;
std
::
string
name
()
const
{
return
"gpu::contiguous"
;
}
shape
compute_shape
(
std
::
vector
<
shape
>
inputs
)
const
{
check_shapes
{
inputs
,
*
this
}.
has
(
2
);
return
op
.
compute_shape
({
inputs
.
at
(
0
)});
}
argument
compute
(
context
&
,
shape
output_shape
,
std
::
vector
<
argument
>
args
)
const
{
hip_contiguous
(
output_shape
,
args
.
at
(
0
),
args
.
at
(
1
));
return
args
.
at
(
1
);
}
};
struct
miopen_relu
{
shared
<
activation_descriptor
>
ad
;
std
::
string
name
()
const
{
return
"
miopen
::relu"
;
}
std
::
string
name
()
const
{
return
"
gpu
::relu"
;
}
shape
compute_shape
(
std
::
vector
<
shape
>
inputs
)
const
{
check_shapes
{
inputs
,
*
this
}.
has
(
2
);
...
...
@@ -239,6 +272,14 @@ struct miopen_apply
{
apply_gemm
(
it
);
}
else
if
(
it
->
op
.
name
()
==
"transpose"
)
{
apply_transpose
(
it
);
}
else
if
(
it
->
op
.
name
()
==
"contiguous"
)
{
apply_contiguous
(
it
);
}
}
}
...
...
@@ -305,10 +346,24 @@ struct miopen_apply
prog
->
replace_instruction
(
ins
,
miopen_gemm
{
op
},
ins
->
arguments
.
at
(
0
),
ins
->
arguments
.
at
(
1
),
output
);
}
void
apply_transpose
(
instruction_ref
ins
)
{
auto
&&
op
=
any_cast
<
transpose
>
(
ins
->
op
);
auto
output
=
insert_allocation
(
ins
,
ins
->
result
);
prog
->
replace_instruction
(
ins
,
miopen_transpose
{
op
},
ins
->
arguments
.
at
(
0
),
output
);
}
void
apply_contiguous
(
instruction_ref
ins
)
{
auto
&&
op
=
any_cast
<
contiguous
>
(
ins
->
op
);
auto
output
=
insert_allocation
(
ins
,
ins
->
result
);
prog
->
replace_instruction
(
ins
,
miopen_contiguous
{
op
},
ins
->
arguments
.
at
(
0
),
output
);
}
};
void
lowering
::
apply
(
program
&
p
)
const
{
miopen_apply
{
&
p
}.
apply
();
}
}
// namespace
miopen
}
// namespace
gpu
}
// namespace migraph
src/targets/
miopen
/rocblas.cpp
→
src/targets/
gpu
/rocblas.cpp
View file @
23ef67a7
#include <migraph/
miopen
/rocblas.hpp>
#include <migraph/
gpu
/rocblas.hpp>
namespace
migraph
{
namespace
miopen
{
namespace
gpu
{
rocblas_handle_ptr
create_rocblas_handle_ptr
()
{
...
...
@@ -10,6 +10,6 @@ rocblas_handle_ptr create_rocblas_handle_ptr()
return
rocblas_handle_ptr
{
handle
};
}
}
// namespace
miopen
}
// namespace
gpu
}
// namespace migraph
src/targets/
miopen
/target.cpp
→
src/targets/
gpu
/target.cpp
View file @
23ef67a7
#include <migraph/
miopen
/target.hpp>
#include <migraph/
miopen
/lowering.hpp>
#include <migraph/
miopen
/write_literals.hpp>
#include <migraph/
miopen
/context.hpp>
#include <migraph/
gpu
/target.hpp>
#include <migraph/
gpu
/lowering.hpp>
#include <migraph/
gpu
/write_literals.hpp>
#include <migraph/
gpu
/context.hpp>
namespace
migraph
{
namespace
miopen
{
namespace
gpu
{
std
::
vector
<
pass
>
target
::
get_passes
(
migraph
::
context
&
)
const
{
...
...
@@ -19,6 +19,6 @@ migraph::context target::get_context() const
share
(
create_rocblas_handle_ptr
())};
}
}
// namespace
miopen
}
// namespace
gpu
}
// namespace migraph
src/targets/
miopen
/write_literals.cpp
→
src/targets/
gpu
/write_literals.cpp
View file @
23ef67a7
#include <migraph/
miopen
/write_literals.hpp>
#include <migraph/
gpu
/write_literals.hpp>
#include <migraph/iterator_for.hpp>
#include <migraph/
miopen
/hip.hpp>
#include <migraph/
gpu
/hip.hpp>
#include <migraph/instruction.hpp>
namespace
migraph
{
namespace
miopen
{
namespace
gpu
{
void
write_literals
::
apply
(
program
&
p
)
const
{
...
...
@@ -20,6 +20,6 @@ void write_literals::apply(program& p) const
}
}
}
// namespace
miopen
}
// namespace
gpu
}
// namespace migraph
test/CMakeLists.txt
View file @
23ef67a7
...
...
@@ -95,13 +95,13 @@ foreach(TEST ${TESTS})
add_test_executable
(
test_
${
BASE_NAME
}
${
TEST
}
)
endforeach
()
if
(
MIGRAPH_ENABLE_
MIOPEN
)
#
miopen
tests
file
(
GLOB
MIOPEN
_TESTS
miopen
/*.cpp
)
if
(
MIGRAPH_ENABLE_
GPU
)
#
gpu
tests
file
(
GLOB
GPU
_TESTS
gpu
/*.cpp
)
foreach
(
TEST
${
MIOPEN
_TESTS
}
)
foreach
(
TEST
${
GPU
_TESTS
}
)
get_filename_component
(
BASE_NAME
${
TEST
}
NAME_WE
)
add_test_executable
(
test_
miopen
_
${
BASE_NAME
}
${
TEST
}
)
target_link_libraries
(
test_
miopen
_
${
BASE_NAME
}
migraph_
miopen
)
add_test_executable
(
test_
gpu
_
${
BASE_NAME
}
${
TEST
}
)
target_link_libraries
(
test_
gpu
_
${
BASE_NAME
}
migraph_
gpu
)
endforeach
()
endif
()
test/
miopen
/miopen.cpp
→
test/
gpu
/miopen.cpp
View file @
23ef67a7
...
...
@@ -3,9 +3,9 @@
#include <migraph/operators.hpp>
#include <migraph/generate.hpp>
#include <migraph/cpu/cpu_target.hpp>
#include <migraph/
miopen
/target.hpp>
#include <migraph/
miopen
/miopen.hpp>
#include <migraph/
miopen
/hip.hpp>
#include <migraph/
gpu
/target.hpp>
#include <migraph/
gpu
/miopen.hpp>
#include <migraph/
gpu
/hip.hpp>
#include <migraph/manage_ptr.hpp>
#include <miopen/miopen.h>
...
...
@@ -27,18 +27,17 @@ migraph::argument run_gpu()
{
V
v
;
auto
p
=
v
.
create_program
();
p
.
compile
(
migraph
::
miopen
::
target
{});
p
.
compile
(
migraph
::
gpu
::
target
{});
auto
m
=
v
.
create_params
();
for
(
auto
&&
e
:
m
)
{
e
.
second
=
migraph
::
miopen
::
to_gpu
(
e
.
second
);
e
.
second
=
migraph
::
gpu
::
to_gpu
(
e
.
second
);
}
m
[
"output"
]
=
migraph
::
miopen
::
to_gpu
(
migraph
::
generate_argument
(
p
.
get_parameter_shape
(
"output"
)));
m
[
"output"
]
=
migraph
::
gpu
::
to_gpu
(
migraph
::
generate_argument
(
p
.
get_parameter_shape
(
"output"
)));
return
migraph
::
miopen
::
from_gpu
(
p
.
eval
(
m
));
return
migraph
::
gpu
::
from_gpu
(
p
.
eval
(
m
));
}
template
<
class
V
>
...
...
@@ -175,6 +174,47 @@ struct test_gemm
}
};
struct
test_contiguous
{
migraph
::
program
create_program
()
const
{
migraph
::
program
p
;
migraph
::
shape
s
{
migraph
::
shape
::
float_type
,
{
4
,
4
,
4
,
3
},
{
48
,
4
,
1
,
16
}};
auto
x
=
p
.
add_parameter
(
"x"
,
s
);
p
.
add_instruction
(
migraph
::
contiguous
{},
x
);
return
p
;
}
migraph
::
program
::
parameter_map
create_params
()
const
{
migraph
::
program
::
parameter_map
m
;
m
[
"x"
]
=
migraph
::
generate_argument
({
migraph
::
shape
::
float_type
,
{
4
,
4
,
4
,
3
},
{
48
,
4
,
1
,
16
}});
return
m
;
}
};
struct
test_transpose
{
migraph
::
program
create_program
()
const
{
migraph
::
program
p
;
migraph
::
shape
s
{
migraph
::
shape
::
float_type
,
{
4
,
3
,
4
,
4
}};
auto
x
=
p
.
add_parameter
(
"x"
,
s
);
std
::
vector
<
int64_t
>
perm
=
{
0
,
2
,
3
,
1
};
auto
l
=
p
.
add_instruction
(
migraph
::
transpose
{
perm
},
x
);
p
.
add_instruction
(
migraph
::
contiguous
{},
l
);
return
p
;
}
migraph
::
program
::
parameter_map
create_params
()
const
{
migraph
::
program
::
parameter_map
m
;
m
[
"x"
]
=
migraph
::
generate_argument
({
migraph
::
shape
::
float_type
,
{
4
,
3
,
4
,
4
}});
return
m
;
}
};
int
main
()
{
verify_program
<
test_add
>
();
...
...
@@ -182,4 +222,6 @@ int main()
verify_program
<
test_conv_relu
>
();
verify_program
<
test_conv_pooling
>
();
verify_program
<
test_gemm
>
();
verify_program
<
test_contiguous
>
();
verify_program
<
test_transpose
>
();
}
tools/include/context.hpp
View file @
23ef67a7
...
...
@@ -9,10 +9,23 @@
namespace
migraph
{
#ifdef DOXYGEN
/// A context is used to store internal data for a `target`. A context is
/// constructed by a target during compilation and passed to the operations
/// during `eval`.
struct
context
{
};
#else
<%
interface
(
'
context
'
)
%>
#endif
}
// namespace migraph
#endif
tools/include/operation.hpp
View file @
23ef67a7
...
...
@@ -13,6 +13,37 @@
namespace
migraph
{
#ifdef DOXYGEN
/// The operation interface represents an action an instruction will perform. All
/// operation classes must be CopyConstructible.
struct
operation
{
/// A unique name identifying the operation
std
::
string
name
()
const
;
/// This is used to compute the resulting shape from an operation. If an
/// operation cannot be run with input shapes, then it should throw an
/// exception.
shape
compute_shape
(
std
::
vector
<
shape
>
input
)
const
;
/**
* @brief This performs the operation's computation
*
* @param ctx This is the context created by the `target` during compilation. Implementations
* can use the target's `context` class rather than the `context` interface class.
* @param output This is the output shape. It is equivalent to running `compute_shape` with each
* `shape` of the `argument`.
* @param input This is the `argument` result from the previous instuction's computation.
* @return Return an `argument` of the result computation. The `shape` of `argument` should be
* the same the `output` shape.
*/
argument
compute
(
context
&
ctx
,
shape
output
,
std
::
vector
<
argument
>
input
)
const
;
/// An optional stream operator to print the operation. When this is not
/// implemented, it will just print the operation's name.
friend
std
::
ostream
&
operator
<<
(
std
::
ostream
&
os
,
const
operation
&
op
);
};
#else
namespace
operation_stream
{
template
<
class
T
>
...
...
@@ -38,6 +69,8 @@ interface('operation',
)
%>
#endif
}
// namespace migraph
#endif
tools/include/pass.hpp
View file @
23ef67a7
...
...
@@ -11,6 +11,20 @@ namespace migraph {
struct
program
;
#ifdef DOXYGEN
/// An interface for applying a transformation to the instructions in a
/// `program`
struct
pass
{
/// A unique name used to identify the pass
std
::
string
name
()
const
;
/// Run the pass on the program
void
apply
(
program
&
p
)
const
;
};
#else
<%
interface
(
'
pass
'
,
virtual
(
'
name
'
,
returns
=
'
std
::
string
'
,
const
=
True
),
...
...
@@ -18,6 +32,8 @@ interface('pass',
)
%>
#endif
}
// namespace migraph
#endif
Prev
1
2
3
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