Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Crayon鑫
Paddle
提交
ac0e3828
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看板
提交
ac0e3828
编写于
10月 06, 2017
作者:
Y
Yang Yang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
test text
上级
20725f2d
变更
2
显示空白变更内容
内联
并排
Showing
2 changed file
with
103 addition
and
15 deletion
+103
-15
paddle/framework/executor.cc
paddle/framework/executor.cc
+87
-15
paddle/framework/executor.h
paddle/framework/executor.h
+16
-0
未找到文件。
paddle/framework/executor.cc
浏览文件 @
ac0e3828
...
...
@@ -13,13 +13,17 @@ See the License for the specific language governing permissions and
limitations under the License. */
#include "paddle/framework/executor.h"
#include <algorithm>
#include <iostream>
#include <memory>
#include <set>
#include <vector>
#include "paddle/framework/lod_tensor.h"
#include "paddle/framework/op_registry.h"
#include "paddle/framework/scope.h"
#include <boost/range/adaptor/reversed.hpp>
namespace
paddle
{
namespace
framework
{
...
...
@@ -64,26 +68,94 @@ void Executor::Run(const ProgramDesc& pdesc, Scope* scope) {
scope
->
NewVar
(
var
.
name
());
}
for
(
auto
&
op_desc
:
block
.
ops
())
{
auto
op
=
paddle
::
framework
::
OpRegistry
::
CreateOp
(
op_desc
);
std
::
vector
<
bool
>
should_run
=
Preprocess
(
pdesc
);
PADDLE_ENFORCE
(
should_run
.
size
()
==
block
.
ops_size
(),
"should_run.size() != block.ops_size()"
);
for
(
int
i
=
0
;
i
<
should_run
.
size
();
++
i
)
{
if
(
should_run
[
i
])
{
auto
op
=
paddle
::
framework
::
OpRegistry
::
CreateOp
(
block
.
ops
(
i
));
std
::
cout
<<
op
->
DebugString
()
<<
std
::
endl
;
op
->
Run
(
*
scope
,
*
device
);
}
// TODO(tonyyang-svail): need to test gpu device
for
(
auto
&
device_context
:
device_contexts_
)
{
device_context
->
Wait
();
}
// // print tensor value
for
(
auto
&
var
:
block
.
vars
())
{
std
::
cout
<<
var
.
name
()
<<
std
::
endl
;
auto
v
=
scope
->
FindVar
(
var
.
name
());
const
LoDTensor
&
t
=
v
->
Get
<
LoDTensor
>
();
for
(
int
i
=
0
;
i
<
t
.
numel
();
++
i
)
{
std
::
cout
<<
t
.
data
<
float
>
()[
i
]
<<
" "
;
// for (auto& var : block.vars()) {
// std::cout << var.name() << std::endl;
// auto v = scope->FindVar(var.name());
// const LoDTensor& t = v->Get<LoDTensor>();
// for (int i = 0; i < t.numel(); ++i) {
// std::cout << t.data<float>()[i] << " ";
// }
// std::cout << std::endl;
// }
}
std
::
vector
<
bool
>
Executor
::
Preprocess
(
const
ProgramDesc
&
pdesc
)
{
// TODO(tonyyang-svail):
// - only runs the first block
auto
&
block
=
pdesc
.
blocks
(
0
);
auto
&
ops
=
block
.
ops
();
bool
expect_feed
=
true
;
for
(
auto
&
op_desc
:
ops
)
{
PADDLE_ENFORCE
(
op_desc
.
type
()
!=
"feed"
||
expect_feed
,
"All FeedOps are at the beginning of the ProgramDesc"
);
expect_feed
=
(
op_desc
.
type
()
==
"feed"
);
}
std
::
cout
<<
std
::
endl
;
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
()
!=
"fetch"
||
expect_fetch
,
"All FetchOps must at the end of the ProgramDesc"
);
expect_fetch
=
(
op_desc
.
type
()
==
"fetch"
);
}
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
;
}
}
}
// TODO(tonyyang-svail): add VLOG here for debugging
if
(
op_desc
.
type
()
==
"fetch"
||
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
);
}
}
// this op should be executed
should_run
.
push_back
(
true
);
}
else
{
// this op should NOT be executed
should_run
.
push_back
(
false
);
}
}
// 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
;
}
}
// namespace framework
...
...
paddle/framework/executor.h
浏览文件 @
ac0e3828
...
...
@@ -26,8 +26,24 @@ class Executor {
public:
explicit
Executor
(
const
std
::
vector
<
platform
::
Place
>&
places
);
~
Executor
();
/* @Brief
* Runtime evaluation of the given ProgramDesc under certain Scope
*
* @param
* ProgramDesc
* Scope
*/
void
Run
(
const
ProgramDesc
&
,
Scope
*
);
protected:
/* @Brief
*
* @param
* ProgramDesc
*/
std
::
vector
<
bool
>
Preprocess
(
const
ProgramDesc
&
pdesc
);
private:
std
::
vector
<
platform
::
DeviceContext
*>
device_contexts_
;
};
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录