Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
MegEngine 天元
MegEngine
提交
51fa530d
MegEngine
项目概览
MegEngine 天元
/
MegEngine
1 年多 前同步成功
通知
403
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看板
提交
51fa530d
编写于
11月 10, 2020
作者:
M
Megvii Engine Team
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix(mge/interpreter): add check for invalid tensor ptr
GitOrigin-RevId: e8edcd92a45150439d164d9ef7fbef44805d8d46
上级
634de590
变更
2
显示空白变更内容
内联
并排
Showing
2 changed file
with
15 addition
and
0 deletion
+15
-0
imperative/src/impl/interpreter_impl.cpp
imperative/src/impl/interpreter_impl.cpp
+14
-0
imperative/src/impl/interpreter_impl.h
imperative/src/impl/interpreter_impl.h
+1
-0
未找到文件。
imperative/src/impl/interpreter_impl.cpp
浏览文件 @
51fa530d
...
...
@@ -10,6 +10,7 @@
*/
#include "./interpreter_impl.h"
#include "megbrain/common.h"
using
namespace
mgb
;
...
...
@@ -58,11 +59,14 @@ SmallVector<void*> ChannelImpl::apply_op(
input_infos
.
reserve
(
inputs
.
size
());
SmallVector
<
LogicalTensorDesc
>
input_descs
;
input_descs
.
reserve
(
inputs
.
size
());
std
::
unique_lock
<
decltype
(
m_mutex
)
>
lock
(
m_mutex
);
for
(
auto
i
:
inputs
)
{
auto
info
=
reinterpret_cast
<
TensorInfo
*>
(
i
);
mgb_assert
(
!
info
->
invalid
,
"Invalid tensor, unable to apply_op!"
);
input_infos
.
push_back
(
info
);
input_descs
.
push_back
(
info
->
desc
);
}
lock
.
unlock
();
auto
[
output_descs
,
validated
]
=
OpDef
::
infer_output_attrs_fallible
(
*
op
,
input_descs
);
ApplyOp
cmd
{
std
::
move
(
op
)};
...
...
@@ -101,6 +105,7 @@ HostTensorND ChannelImpl::get_value(void* handle) {
std
::
unique_lock
<
decltype
(
m_mutex
)
>
lock
(
m_mutex
);
mgb_assert
(
!
m_waitee
);
if
(
!
info
->
value_fetched
)
{
mgb_assert
(
!
info
->
invalid
,
"Invalid tensor, unable to get_value!"
);
m_waitee
=
info
;
m_worker
.
add_task
(
GetValue
{
info
});
m_cv
.
wait
(
lock
,
[
&
]()
{
...
...
@@ -222,6 +227,7 @@ void ChannelImpl::process_one_task(Command& cmd) {
SmallVector
<
TensorPtr
>
tensor_inputs
;
tensor_inputs
.
reserve
(
cmd
.
inputs
.
size
());
for
(
auto
i
:
cmd
.
inputs
)
{
mgb_assert
(
i
->
ptr
,
"Invalid input tensor ptr!"
);
tensor_inputs
.
push_back
(
i
->
ptr
);
}
auto
tensor_outputs
=
OpDef
::
apply_on_physical_tensor
(
*
cmd
.
op
,
tensor_inputs
);
...
...
@@ -232,6 +238,7 @@ void ChannelImpl::process_one_task(Command& cmd) {
}
else
if
constexpr
(
std
::
is_same_v
<
T
,
Del
>
)
{
free
(
cmd
.
dest
);
}
else
if
constexpr
(
std
::
is_same_v
<
T
,
GetValue
>
)
{
mgb_assert
(
cmd
.
dest
->
ptr
,
"Invalid tensor ptr!"
);
cmd
.
dest
->
ptr
->
fetch_value
();
MGB_LOCK_GUARD
(
m_mutex
);
cmd
.
dest
->
value_fetched
=
true
;
...
...
@@ -243,6 +250,13 @@ void ChannelImpl::process_one_task(Command& cmd) {
}
}
catch
(...)
{
MGB_LOCK_GUARD
(
m_mutex
);
if
constexpr
(
std
::
is_same_v
<
T
,
ApplyOp
>
)
{
for
(
auto
oup
:
cmd
.
outputs
)
{
oup
->
invalid
=
true
;
}
}
else
if
constexpr
(
std
::
is_same_v
<
T
,
Put
>
)
{
cmd
.
dest
->
invalid
=
true
;
}
m_worker_exc
=
std
::
current_exception
();
m_cv
.
notify_all
();
}
...
...
imperative/src/impl/interpreter_impl.h
浏览文件 @
51fa530d
...
...
@@ -28,6 +28,7 @@ struct TensorInfo {
TensorPtr
ptr
;
LogicalTensorDesc
desc
;
bool
value_fetched
=
false
;
bool
invalid
=
false
;
};
struct
Put
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录