Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
MegEngine 天元
MegEngine
提交
3c61e0e0
MegEngine
项目概览
MegEngine 天元
/
MegEngine
大约 1 年 前同步成功
通知
399
Star
4705
Fork
582
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
MegEngine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
3c61e0e0
编写于
9月 26, 2021
作者:
M
Megvii Engine Team
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feat(ops): add JITFusion op
GitOrigin-RevId: 7dc35d4e80f1ac9334ebb49b0202b96b004e45b1
上级
aa587446
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
89 addition
and
0 deletion
+89
-0
imperative/src/impl/ops/utility.cpp
imperative/src/impl/ops/utility.cpp
+81
-0
imperative/src/include/megbrain/imperative/ops/utility.h
imperative/src/include/megbrain/imperative/ops/utility.h
+8
-0
未找到文件。
imperative/src/impl/ops/utility.cpp
浏览文件 @
3c61e0e0
...
...
@@ -657,6 +657,85 @@ OP_TRAIT_REG(CompiledOp, CompiledOp)
}
// namespace compiled_op
}
// namespace
namespace
{
namespace
jit_fusion
{
static
thread_local
bool
tm_enabled
=
true
;
auto
apply_on_var_node
(
const
OpDef
&
def
,
const
VarNodeArray
&
inputs
)
{
auto
&
op
=
def
.
cast_final_safe
<
JITFusionOp
>
();
op
.
op
->
set_scope
(
op
.
scope
());
auto
outputs
=
OpDef
::
apply_on_var_node
(
*
op
.
op
,
inputs
);
if
(
!
tm_enabled
)
{
// skip for dump (JITExecutor can not be dumped)
return
outputs
;
}
for
(
auto
&
output
:
outputs
)
{
jit
::
InternalGraphGenerator
igg
{
output
->
owner_opr
()};
std
::
vector
<
cg
::
OperatorNodeBase
*>
reverse_order
;
cg
::
DepOprIter
iter
{
[
&
](
cg
::
OperatorNodeBase
*
opr
)
{
reverse_order
.
push_back
(
opr
);
}};
for
(
auto
&&
input
:
inputs
)
{
iter
.
set_visited
(
input
->
owner_opr
());
}
iter
.
add
(
output
->
owner_opr
());
std
::
reverse
(
reverse_order
.
begin
(),
reverse_order
.
end
());
for
(
auto
&&
opr
:
reverse_order
)
{
igg
.
add_opr
(
opr
);
}
auto
ig
=
igg
.
generate
();
output
=
jit
::
JITExecutor
::
make
(
ig
,
igg
.
orig_inps
()).
node
();
}
return
outputs
;
}
auto
infer_output_attrs_fallible
(
const
OpDef
&
def
,
const
SmallVector
<
LogicalTensorDesc
>&
input_descs
)
{
return
OpDef
::
infer_output_attrs_fallible
(
*
def
.
cast_final_safe
<
JITFusionOp
>
().
op
,
input_descs
);
}
auto
props
(
const
OpDef
&
def
)
{
return
OpDef
::
props
(
*
def
.
cast_final_safe
<
JITFusionOp
>
().
op
);
}
auto
hash
(
const
OpDef
&
def
)
{
return
def
.
cast_final_safe
<
JITFusionOp
>
().
op
->
hash
();
}
auto
is_samt_st
(
const
OpDef
&
def
,
const
OpDef
&
another
)
{
if
(
!
another
.
same_type
<
JITFusionOp
>
())
{
return
false
;
}
auto
&
lhs
=
def
.
cast_final_safe
<
JITFusionOp
>
();
auto
&
rhs
=
another
.
cast_final_safe
<
JITFusionOp
>
();
return
lhs
.
op
->
is_same
(
*
rhs
.
op
);
}
EncodedSubgraph
make_backward_graph
(
const
OpDef
&
def
,
const
SmallVector
<
LogicalTensorDesc
>&
inputs
,
const
SmallVector
<
bool
>&
input_requires_grad
,
const
SmallVector
<
bool
>&
output_has_grad
)
{
return
{};
}
OP_TRAIT_REG
(
JITFusionOp
,
JITFusionOp
)
.
apply_on_var_node
(
apply_on_var_node
)
.
infer_output_attrs_fallible
(
infer_output_attrs_fallible
)
.
props
(
props
)
.
hash
(
hash
)
.
is_same_st
(
is_samt_st
)
.
make_backward_graph
(
make_backward_graph
)
.
fallback
();
}
// namespace jit_fusion
}
// namespace
bool
JITFusionOp
::
set_enabled
(
bool
enabled
)
{
std
::
swap
(
enabled
,
jit_fusion
::
tm_enabled
);
return
enabled
;
}
MGB_DYN_TYPE_OBJ_FINAL_IMPL
(
UniqueKey
);
MGB_DYN_TYPE_OBJ_FINAL_IMPL
(
SubgraphOp
);
...
...
@@ -665,4 +744,6 @@ MGB_DYN_TYPE_OBJ_FINAL_IMPL(BackwardOpKey);
MGB_DYN_TYPE_OBJ_FINAL_IMPL
(
CompiledOp
);
MGB_DYN_TYPE_OBJ_FINAL_IMPL
(
JITFusionOp
);
}
// namespace mgb::imperative
imperative/src/include/megbrain/imperative/ops/utility.h
浏览文件 @
3c61e0e0
...
...
@@ -111,4 +111,12 @@ struct CompiledOp final : OpDefImplBase<CompiledOp> {
MGB_DYN_TYPE_OBJ_FINAL_DECL
;
};
struct
JITFusionOp
final
:
OpDefImplBase
<
JITFusionOp
>
{
std
::
shared_ptr
<
OpDef
>
op
;
JITFusionOp
()
=
default
;
JITFusionOp
(
std
::
shared_ptr
<
OpDef
>
op
)
:
op
{
op
}
{}
static
bool
set_enabled
(
bool
enabled
);
MGB_DYN_TYPE_OBJ_FINAL_DECL
;
};
}
// namespace mgb::imperative
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录