Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
MegEngine 天元
MegEngine
提交
d04b4bc0
MegEngine
项目概览
MegEngine 天元
/
MegEngine
1 年多 前同步成功
通知
404
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看板
提交
d04b4bc0
编写于
1月 21, 2021
作者:
M
Megvii Engine Team
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix(interp): thread safety for drop and swapout
GitOrigin-RevId: 7684f160bf1ca239c92c977c7238cac2b51ab4a2
上级
3eb529d6
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
10 addition
and
4 deletion
+10
-4
imperative/src/impl/interpreter_impl.cpp
imperative/src/impl/interpreter_impl.cpp
+8
-4
imperative/src/impl/interpreter_impl.h
imperative/src/impl/interpreter_impl.h
+2
-0
未找到文件。
imperative/src/impl/interpreter_impl.cpp
浏览文件 @
d04b4bc0
...
...
@@ -233,18 +233,17 @@ HostTensorND ChannelImpl::get_value(Handle handle) {
mgb_assert
(
!
m_waitee
);
// donnot use info->value_fetched, it's unsafe
mgb_assert
(
!
info
->
invalid
,
"Invalid tensor, unable to get_value!"
);
std
::
unique_lock
<
decltype
(
m_mutex
)
>
lock
(
m_mutex
);
TensorPtr
tensor_ptr
=
info
->
ptr
;
auto
value_fetched
=
[
&
]()
{
return
tensor_ptr
&&
tensor_ptr
->
value_fetched
();
};
if
(
!
value_fetched
())
{
std
::
unique_lock
<
decltype
(
m_mutex
)
>
lock
(
m_mutex
);
m_waitee
=
info
;
regenerate
(
info
);
m_buffer
.
enqueue
(
GetValue
{
info
});
m_cv
.
wait
(
lock
,
[
&
]()
{
check_worker_exc_unsafe
();
// get tensor ptr in lock to ensure safety
tensor_ptr
=
info
->
ptr
;
return
value_fetched
();
});
...
...
@@ -359,6 +358,11 @@ void ChannelImpl::produce_tensor(TensorInfo* dest, TensorPtr ptr) {
}
}
void
ChannelImpl
::
release_tensor
(
TensorInfo
*
dest
)
{
MGB_LOCK_GUARD
(
m_mutex
);
dest
->
ptr
.
reset
();
}
void
ChannelImpl
::
regenerate
(
TensorInfo
*
dest
)
{
if
(
dest
->
evict_type
==
DROP
)
{
recompute
(
dest
->
producer
);
...
...
@@ -481,9 +485,9 @@ void ChannelImpl::process_one_task(Command& cmd) {
produce_tensor
(
cmd
.
dest
,
Tensor
::
make
(
cmd
.
dest
->
h_value
));
}
else
if
constexpr
(
std
::
is_same_v
<
T
,
SwapOut
>
)
{
cmd
.
dest
->
h_value
=
cmd
.
dest
->
ptr
->
get_value
();
cmd
.
dest
->
ptr
.
reset
(
);
release_tensor
(
cmd
.
dest
);
}
else
if
constexpr
(
std
::
is_same_v
<
T
,
Drop
>
)
{
cmd
.
dest
->
ptr
.
reset
(
);
release_tensor
(
cmd
.
dest
);
}
else
if
constexpr
(
std
::
is_same_v
<
T
,
Move
>
)
{
produce_tensor
(
cmd
.
dest
,
cmd
.
src
->
ptr
);
free
(
cmd
.
src
);
...
...
imperative/src/impl/interpreter_impl.h
浏览文件 @
d04b4bc0
...
...
@@ -249,6 +249,8 @@ private:
void
produce_tensor
(
TensorInfo
*
dest
,
TensorPtr
ptr
);
void
release_tensor
(
TensorInfo
*
dest
);
void
regenerate
(
TensorInfo
*
dest
);
void
recompute
(
TensorInfo
::
ComputePath
*
path
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录