Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Crayon鑫
Paddle
提交
43c05e43
P
Paddle
项目概览
Crayon鑫
/
Paddle
与 Fork 源项目一致
Fork自
PaddlePaddle / Paddle
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
Paddle
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
43c05e43
编写于
10月 17, 2017
作者:
Y
Yang Yang(Tony)
提交者:
GitHub
10月 17, 2017
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #4855 from tonyyang-svail/executor_refine
Simplify executor
上级
8938a9b0
cf743ab0
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
9 addition
and
96 deletion
+9
-96
paddle/framework/executor.cc
paddle/framework/executor.cc
+9
-85
paddle/framework/executor.h
paddle/framework/executor.h
+0
-11
未找到文件。
paddle/framework/executor.cc
浏览文件 @
43c05e43
...
...
@@ -64,99 +64,23 @@ void Executor::Run(const ProgramDesc& pdesc, Scope* scope, int block_id) {
auto
&
block
=
pdesc
.
blocks
(
block_id
);
auto
&
device
=
device_contexts_
[
0
];
// Instantiate all the vars in the global scope
for
(
auto
&
var
:
block
.
vars
())
{
scope
->
Var
(
var
.
name
());
}
Scope
&
local_scope
=
scope
->
NewScope
();
std
::
vector
<
bool
>
should_run
=
Prune
(
pdesc
,
block_id
);
PADDLE_ENFORCE_EQ
(
should_run
.
size
(),
static_cast
<
size_t
>
(
block
.
ops_size
()));
for
(
size_t
i
=
0
;
i
<
should_run
.
size
();
++
i
)
{
if
(
should_run
[
i
])
{
for
(
auto
&
var
:
block
.
ops
(
i
).
outputs
())
{
for
(
auto
&
argu
:
var
.
arguments
())
{
if
(
local_scope
.
FindVar
(
argu
)
==
nullptr
)
{
local_scope
.
Var
(
argu
);
}
}
}
auto
op
=
paddle
::
framework
::
OpRegistry
::
CreateOp
(
block
.
ops
(
i
));
op
->
Run
(
local_scope
,
*
device
);
for
(
auto
&
var
:
block
.
vars
())
{
if
(
var
.
persistable
())
{
scope
->
Var
(
var
.
name
());
}
else
{
local_scope
.
Var
(
var
.
name
());
}
}
// TODO(tonyyang-svail):
// - Destroy local_scope
}
std
::
vector
<
bool
>
Prune
(
const
ProgramDesc
&
pdesc
,
int
block_id
)
{
// TODO(tonyyang-svail):
// - will change to use multiple blocks for RNN op and Cond Op
auto
&
block
=
pdesc
.
blocks
(
block_id
);
auto
&
ops
=
block
.
ops
();
bool
expect_feed
=
true
;
for
(
auto
&
op_desc
:
ops
)
{
PADDLE_ENFORCE
(
op_desc
.
type
()
!=
kFeedOpType
||
expect_feed
,
"All FeedOps are at the beginning of the ProgramDesc"
);
expect_feed
=
(
op_desc
.
type
()
==
kFeedOpType
);
}
bool
expect_fetch
=
true
;
for
(
auto
op_iter
=
ops
.
rbegin
();
op_iter
!=
ops
.
rend
();
++
op_iter
)
{
auto
&
op_desc
=
*
op_iter
;
PADDLE_ENFORCE
(
op_desc
.
type
()
!=
kFetchOpType
||
expect_fetch
,
"All FetchOps must at the end of the ProgramDesc"
);
expect_fetch
=
(
op_desc
.
type
()
==
kFetchOpType
);
}
std
::
set
<
std
::
string
>
dependent_vars
;
std
::
vector
<
bool
>
should_run
;
for
(
auto
op_iter
=
ops
.
rbegin
();
op_iter
!=
ops
.
rend
();
++
op_iter
)
{
auto
&
op_desc
=
*
op_iter
;
bool
found_dependent_vars
=
false
;
for
(
auto
&
var
:
op_desc
.
outputs
())
{
for
(
auto
&
argu
:
var
.
arguments
())
{
if
(
dependent_vars
.
count
(
argu
)
!=
0
)
{
found_dependent_vars
=
true
;
}
}
}
if
(
op_desc
.
type
()
==
kFetchOpType
||
found_dependent_vars
)
{
// erase its output to the dependency graph
for
(
auto
&
var
:
op_desc
.
outputs
())
{
for
(
auto
&
argu
:
var
.
arguments
())
{
dependent_vars
.
erase
(
argu
);
}
}
// insert its input to the dependency graph
for
(
auto
&
var
:
op_desc
.
inputs
())
{
for
(
auto
&
argu
:
var
.
arguments
())
{
dependent_vars
.
insert
(
argu
);
}
}
should_run
.
push_back
(
true
);
}
else
{
should_run
.
push_back
(
false
);
}
for
(
auto
&
op_desc
:
block
.
ops
())
{
auto
op
=
paddle
::
framework
::
OpRegistry
::
CreateOp
(
op_desc
);
op
->
Run
(
local_scope
,
*
device
);
}
// TODO(tonyyang-svail):
// - check this after integration of Init
// PADDLE_ENFORCE(dependent_vars.empty());
// since we are traversing the ProgramDesc in reverse order
// we reverse the should_run vector
std
::
reverse
(
should_run
.
begin
(),
should_run
.
end
());
return
should_run
;
// - Destroy local_scope
}
}
// namespace framework
...
...
paddle/framework/executor.h
浏览文件 @
43c05e43
...
...
@@ -40,16 +40,5 @@ class Executor {
std
::
vector
<
platform
::
DeviceContext
*>
device_contexts_
;
};
/* @Brief
* Pruning the graph
*
* @param
* ProgramDesc
*
* @return
* vector<bool> Same size as ops. Indicates whether an op should be run.
*/
std
::
vector
<
bool
>
Prune
(
const
ProgramDesc
&
pdesc
,
int
block_id
);
}
// namespace framework
}
// namespace paddle
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录