Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
magicwindyyd
mindspore
提交
3fa31b34
M
mindspore
项目概览
magicwindyyd
/
mindspore
与 Fork 源项目一致
Fork自
MindSpore / mindspore
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
M
mindspore
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
3fa31b34
编写于
4月 22, 2020
作者:
M
mindspore-ci-bot
提交者:
Gitee
4月 22, 2020
浏览文件
操作
浏览文件
下载
差异文件
!566 support buffer fusion
Merge pull request !566 from jjfeing/master
上级
d6bdd37a
5e7e34f5
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
87 addition
and
38 deletion
+87
-38
mindspore/ccsrc/kernel/tbe/tbe_kernel_build.cc
mindspore/ccsrc/kernel/tbe/tbe_kernel_build.cc
+79
-33
mindspore/ccsrc/kernel/tbe/tbe_kernel_build.h
mindspore/ccsrc/kernel/tbe/tbe_kernel_build.h
+8
-5
未找到文件。
mindspore/ccsrc/kernel/tbe/tbe_kernel_build.cc
浏览文件 @
3fa31b34
...
...
@@ -513,36 +513,36 @@ bool TbeKernelBuild::GenFusionScopeJson(const vector<mindspore::AnfNodePtr> &inp
return
true
;
}
void
TbeKernelBuild
::
GenDescJson
(
const
s
hared_ptr
<
mindspore
::
AnfNode
>
&
anf_node
,
size_t
out_idx
,
nlohmann
::
json
*
output_desc
)
{
void
TbeKernelBuild
::
GenDescJson
(
const
s
td
::
shared_ptr
<
mindspore
::
AnfNode
>
&
anf_node
,
size_t
node_
out_idx
,
size_t
desc_output_idx
,
nlohmann
::
json
*
output_desc
)
{
std
::
string
output_desc_name
=
anf_node
->
fullname_with_scope
();
if
(
out_idx
>
0
)
{
output_desc_name
=
output_desc_name
+
"_"
+
std
::
to_string
(
out_idx
);
if
(
node_
out_idx
>
0
)
{
output_desc_name
=
output_desc_name
+
"_"
+
std
::
to_string
(
node_
out_idx
);
}
(
*
output_desc
)[
"name"
]
=
NormalizeFullScopeName
(
output_desc_name
);
auto
type_id
=
AnfAlgo
::
GetOutputDeviceDataType
(
anf_node
,
out_idx
);
auto
type_id
=
AnfAlgo
::
GetOutputDeviceDataType
(
anf_node
,
node_
out_idx
);
(
*
output_desc
)[
"data_type"
]
=
tbe
::
TypeIdToString
(
type_id
);
auto
ori_shape
=
AnfAlgo
::
GetOutputInferShape
(
anf_node
,
out_idx
);
auto
ori_shape
=
AnfAlgo
::
GetOutputInferShape
(
anf_node
,
node_
out_idx
);
if
(
ori_shape
.
empty
())
{
ori_shape
.
emplace_back
(
1
);
}
(
*
output_desc
)[
"ori_shape"
]
=
ori_shape
;
auto
shape
=
AnfAlgo
::
GetOutputDeviceShape
(
anf_node
,
out_idx
);
auto
shape
=
AnfAlgo
::
GetOutputDeviceShape
(
anf_node
,
node_
out_idx
);
if
(
shape
.
empty
())
{
shape
.
emplace_back
(
1
);
}
(
*
output_desc
)[
"shape"
]
=
shape
;
auto
format
=
AnfAlgo
::
GetOutputFormat
(
anf_node
,
out_idx
);
auto
format
=
AnfAlgo
::
GetOutputFormat
(
anf_node
,
node_
out_idx
);
if
(
format
==
kOpFormat_DEFAULT
)
{
if
(
ori_shape
.
size
()
==
4
)
{
format
=
kOpFormat_NCHW
;
}
else
{
format
=
"ND"
;
format
=
kOpFormat_ND
;
}
}
(
*
output_desc
)[
"format"
]
=
format
;
(
*
output_desc
)[
"ori_format"
]
=
kOpFormat_NCHW
;
(
*
output_desc
)[
"output_index"
]
=
o
ut_idx
;
(
*
output_desc
)[
"output_index"
]
=
desc_outp
ut_idx
;
}
void
TbeKernelBuild
::
GenReusedOutputDesc
(
const
shared_ptr
<
mindspore
::
AnfNode
>
&
anf_node
,
size_t
index
,
...
...
@@ -605,7 +605,7 @@ bool TbeKernelBuild::GenFusionDataInputJson(const shared_ptr<mindspore::AnfNode>
MS_LOG
(
INFO
)
<<
"real name "
<<
real_node
->
fullname_with_scope
()
<<
" index:"
<<
real_idx
;
// "output_desc"
nlohmann
::
json
output_desc
;
GenDescJson
(
real_node
,
real_idx
,
&
output_desc
);
GenDescJson
(
real_node
,
real_idx
,
real_idx
,
&
output_desc
);
output_desc_list
.
push_back
(
output_desc
);
(
*
data_str
)[
"name"
]
=
NormalizeFullScopeName
(
real_node
->
fullname_with_scope
());
}
...
...
@@ -653,9 +653,9 @@ size_t TbeKernelBuild::GetOptionalInput(const mindspore::CNodePtr &cnode, bool i
return
(
op_info
->
inputs_ptr
().
size
()
+
1
-
cnode
->
inputs
().
size
());
}
bool
TbeKernelBuild
::
GenFusionComputeInput
e
Json
(
const
mindspore
::
CNodePtr
&
cnode
,
std
::
vector
<
std
::
vector
<
mindspore
::
AnfNodePtr
>>::
iterator
*
layer_iter
,
std
::
vector
<
nlohmann
::
json
>
*
input_desc_list
,
size_t
*
index
)
{
bool
TbeKernelBuild
::
GenFusionComputeInputJson
(
const
mindspore
::
CNodePtr
&
cnode
,
std
::
vector
<
std
::
vector
<
mindspore
::
AnfNodePtr
>>::
iterator
*
layer_iter
,
std
::
vector
<
nlohmann
::
json
>
*
input_desc_list
,
size_t
*
index
)
{
MS_EXCEPTION_IF_NULL
(
cnode
);
MS_EXCEPTION_IF_NULL
(
input_desc_list
);
bool
is_dynamic_input
=
IsDynamicInput
(
cnode
);
...
...
@@ -666,7 +666,7 @@ bool TbeKernelBuild::GenFusionComputeInputeJson(const mindspore::CNodePtr &cnode
size_t
real_idx
=
kernel_idx
.
second
;
MS_LOG
(
INFO
)
<<
"real name"
<<
real_node
->
fullname_with_scope
()
<<
"index:"
<<
real_idx
;
nlohmann
::
json
input_desc
;
GenDescJson
(
real_node
,
real_idx
,
&
input_desc
);
GenDescJson
(
real_node
,
real_idx
,
real_idx
,
&
input_desc
);
if
(
is_dynamic_input
)
{
MS_LOG
(
INFO
)
<<
"node has dynamic input."
;
input_desc
[
"dyn_index"
]
=
(
i
-
1
);
...
...
@@ -687,6 +687,66 @@ bool TbeKernelBuild::GenFusionComputeInputeJson(const mindspore::CNodePtr &cnode
return
true
;
}
std
::
vector
<
size_t
>
TbeKernelBuild
::
GetDescOutputIndex
(
const
std
::
vector
<
int
>
&
output_used_nums
)
{
std
::
vector
<
size_t
>
desc_output_index
=
{};
bool
find_reused
=
false
;
size_t
reused_num
=
0
;
for
(
size_t
idx
=
0
;
idx
<
output_used_nums
.
size
();
++
idx
)
{
auto
output_use_num_item
=
output_used_nums
[
idx
];
MS_LOG
(
INFO
)
<<
"output used num["
<<
idx
<<
"] = "
<<
output_use_num_item
;
if
(
output_use_num_item
==
1
||
output_use_num_item
==
0
)
{
desc_output_index
.
emplace_back
(
idx
);
}
else
{
if
(
!
find_reused
)
{
desc_output_index
.
emplace_back
(
idx
);
}
else
{
desc_output_index
.
emplace_back
(
output_used_nums
[
idx
-
1
]);
}
reused_num
+=
(
output_use_num_item
-
1
);
find_reused
=
true
;
}
}
auto
pad_value
=
output_used_nums
.
size
()
==
1
?
0
:
desc_output_index
[
desc_output_index
.
size
()
-
1
]
+
1
;
for
(
size_t
i
=
0
;
i
<
reused_num
;
++
i
)
{
desc_output_index
.
emplace_back
(
pad_value
);
}
return
desc_output_index
;
}
bool
TbeKernelBuild
::
GenFusionComputeOutputJson
(
const
mindspore
::
CNodePtr
&
cnode
,
std
::
vector
<
nlohmann
::
json
>
*
output_desc_list
)
{
auto
output_size
=
AnfAlgo
::
GetOutputTensorNum
(
cnode
);
if
(
AnfAlgo
::
HasNodeAttr
(
kAttrOutputUsedNum
,
cnode
))
{
auto
output_used_nums
=
AnfAlgo
::
GetNodeAttr
<
std
::
vector
<
int
>>
(
cnode
,
kAttrOutputUsedNum
);
MS_LOG
(
INFO
)
<<
"This node's output has been reused, node name: "
<<
cnode
->
fullname_with_scope
();
if
(
output_used_nums
.
size
()
!=
output_size
)
{
MS_LOG
(
INFO
)
<<
"Fusion error: output tenor num("
<<
output_size
<<
")"
<<
" is not match output used num("
<<
output_used_nums
.
size
()
<<
")"
;
return
false
;
}
auto
desc_output_index
=
GetDescOutputIndex
(
output_used_nums
);
for
(
size_t
i
=
0
;
i
<
output_size
;
++
i
)
{
MS_LOG
(
INFO
)
<<
"Fusion index: "
<<
i
<<
", desc_output_index: "
<<
desc_output_index
[
i
];
nlohmann
::
json
output_desc
;
GenDescJson
(
cnode
,
i
,
desc_output_index
[
i
],
&
output_desc
);
output_desc_list
->
emplace_back
(
output_desc
);
}
for
(
size_t
j
=
output_size
;
j
<
desc_output_index
.
size
();
++
j
)
{
MS_LOG
(
INFO
)
<<
"Fusion index: "
<<
j
<<
", desc_output_index: "
<<
desc_output_index
[
j
];
nlohmann
::
json
output_desc
;
GenReusedOutputDesc
(
cnode
,
j
,
desc_output_index
[
j
],
&
output_desc
);
output_desc_list
->
emplace_back
(
output_desc
);
}
}
else
{
for
(
size_t
i
=
0
;
i
<
output_size
;
++
i
)
{
nlohmann
::
json
output_desc
;
GenDescJson
(
cnode
,
i
,
i
,
&
output_desc
);
output_desc_list
->
push_back
(
output_desc
);
}
}
return
true
;
}
bool
TbeKernelBuild
::
GenFusionComputeJson
(
const
mindspore
::
AnfNodePtr
&
compute_node
,
std
::
vector
<
std
::
vector
<
mindspore
::
AnfNodePtr
>>::
iterator
*
layer_iter
,
nlohmann
::
json
*
compute_op_str
,
std
::
string
*
fusion_kernel_name
,
...
...
@@ -696,28 +756,14 @@ bool TbeKernelBuild::GenFusionComputeJson(const mindspore::AnfNodePtr &compute_n
MS_EXCEPTION_IF_NULL
(
cnode
);
// gen input desc
std
::
vector
<
nlohmann
::
json
>
input_desc_list
;
(
void
)
GenFusionComputeInput
e
Json
(
cnode
,
layer_iter
,
&
input_desc_list
,
index
);
(
void
)
GenFusionComputeInputJson
(
cnode
,
layer_iter
,
&
input_desc_list
,
index
);
(
*
compute_op_str
)[
"input_desc"
]
=
input_desc_list
;
// gen output desc
std
::
vector
<
nlohmann
::
json
>
output_desc_list
;
auto
output_size
=
AnfAlgo
::
GetOutputTensorNum
(
cnode
);
for
(
size_t
i
=
0
;
i
<
output_size
;
++
i
)
{
nlohmann
::
json
output_desc
;
GenDescJson
(
cnode
,
i
,
&
output_desc
);
output_desc_list
.
push_back
(
output_desc
);
}
if
(
AnfAlgo
::
GetCNodeName
(
cnode
)
==
prim
::
kPrimConv2D
->
name
())
{
if
(
AnfAlgo
::
HasNodeAttr
(
kAttrOutputUsedNum
,
compute_node
))
{
auto
output_used_num
=
AnfAlgo
::
GetNodeAttr
<
size_t
>
(
compute_node
,
kAttrOutputUsedNum
);
for
(
size_t
i
=
output_size
;
i
<
output_used_num
;
++
i
)
{
nlohmann
::
json
output_desc
;
GenReusedOutputDesc
(
cnode
,
i
,
0
,
&
output_desc
);
output_desc_list
.
push_back
(
output_desc
);
}
}
if
(
!
GenFusionComputeOutputJson
(
cnode
,
&
output_desc_list
))
{
MS_LOG
(
INFO
)
<<
"Fusion Error: gen fusion output desc faild, node full name: "
<<
cnode
->
fullname_with_scope
();
return
false
;
}
(
*
compute_op_str
)[
"output_desc"
]
=
output_desc_list
;
// gen others
auto
type
=
AnfAlgo
::
GetCNodeName
(
cnode
);
...
...
mindspore/ccsrc/kernel/tbe/tbe_kernel_build.h
浏览文件 @
3fa31b34
...
...
@@ -53,11 +53,14 @@ class TbeKernelBuild {
static
bool
GenFusionComputeJson
(
const
mindspore
::
AnfNodePtr
&
compute_node
,
std
::
vector
<
std
::
vector
<
mindspore
::
AnfNodePtr
>>::
iterator
*
layer_iter
,
nlohmann
::
json
*
compute_op_str
,
std
::
string
*
fusion_kernel_name
,
size_t
*
index
);
static
bool
GenFusionComputeInputeJson
(
const
mindspore
::
CNodePtr
&
cnode
,
std
::
vector
<
std
::
vector
<
mindspore
::
AnfNodePtr
>>::
iterator
*
layer_iter
,
std
::
vector
<
nlohmann
::
json
>
*
input_desc_list
,
size_t
*
index
);
static
void
GenDescJson
(
const
std
::
shared_ptr
<
mindspore
::
AnfNode
>
&
anf_node
,
size_t
out_idx
,
nlohmann
::
json
*
output_desc
);
static
bool
GenFusionComputeInputJson
(
const
mindspore
::
CNodePtr
&
cnode
,
std
::
vector
<
std
::
vector
<
mindspore
::
AnfNodePtr
>>::
iterator
*
layer_iter
,
std
::
vector
<
nlohmann
::
json
>
*
input_desc_list
,
size_t
*
index
);
static
std
::
vector
<
size_t
>
GetDescOutputIndex
(
const
std
::
vector
<
int
>
&
output_used_nums
);
static
bool
GenFusionComputeOutputJson
(
const
mindspore
::
CNodePtr
&
cnode
,
std
::
vector
<
nlohmann
::
json
>
*
output_desc_list
);
static
void
GenDescJson
(
const
std
::
shared_ptr
<
mindspore
::
AnfNode
>
&
anf_node
,
size_t
node_out_idx
,
size_t
desc_output_idx
,
nlohmann
::
json
*
output_desc
);
static
void
GenReusedOutputDesc
(
const
std
::
shared_ptr
<
mindspore
::
AnfNode
>
&
anf_node
,
size_t
index
,
size_t
output_index
,
nlohmann
::
json
*
output_desc
);
static
size_t
GetIOSizeImpl
(
const
nlohmann
::
json
&
desc
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录