Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
MegEngine 天元
MegEngine
提交
27205461
MegEngine
项目概览
MegEngine 天元
/
MegEngine
大约 1 年 前同步成功
通知
399
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看板
提交
27205461
编写于
8月 15, 2020
作者:
M
Megvii Engine Team
提交者:
Xinran Xu
8月 25, 2020
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feat(mgb/opr-mm): add register info cache for multi-machine oprs
GitOrigin-RevId: d5ae3c5a7c6d8d1939cd4cf92c25045a5e7159e0
上级
a7ff580e
变更
4
显示空白变更内容
内联
并排
Showing
4 changed file
with
70 addition
and
10 deletion
+70
-10
src/opr-mm/impl/collective_comm.cpp
src/opr-mm/impl/collective_comm.cpp
+13
-3
src/opr-mm/impl/group_manager.cpp
src/opr-mm/impl/group_manager.cpp
+16
-0
src/opr-mm/impl/io_remote.cpp
src/opr-mm/impl/io_remote.cpp
+25
-7
src/opr-mm/include/megbrain/opr/group_manager.h
src/opr-mm/include/megbrain/opr/group_manager.h
+16
-0
未找到文件。
src/opr-mm/impl/collective_comm.cpp
浏览文件 @
27205461
...
...
@@ -687,11 +687,21 @@ SymbolVarArray CollectiveComm::make(
void
CollectiveComm
::
opr_register
()
{
if
(
m_init
)
return
;
auto
&&
comp_node
=
output
(
0
)
->
comp_node
();
bool
use_cache
=
output
(
0
)
->
owner_graph
()
->
options
().
imperative_proxy_graph
;
struct
GroupManager
::
RegisterInfo
reg_info
;
auto
reg_info
=
m_group_client
->
opr_register
(
if
(
use_cache
and
RegInfoCache
::
has_info
(
m_key
))
{
reg_info
=
RegInfoCache
::
get_info
(
m_key
);
}
else
{
reg_info
=
m_group_client
->
opr_register
(
m_key
,
m_nr_devices
,
m_is_root
,
m_rank
,
comp_node
.
get_uid
());
if
(
use_cache
)
{
RegInfoCache
::
set_info
(
m_key
,
reg_info
);
}
}
m_rank
=
reg_info
.
rank
;
m_root
=
reg_info
.
root_rank
;
...
...
src/opr-mm/impl/group_manager.cpp
浏览文件 @
27205461
...
...
@@ -205,4 +205,20 @@ uint32_t GroupManager::group_barrier(uint32_t size, uint32_t rank) {
return
m_barrier_size
;
}
void
RegInfoCache
::
set_info
(
const
std
::
string
&
key
,
const
GroupManager
::
RegisterInfo
&
info
)
{
std
::
unique_lock
<
std
::
mutex
>
lock
(
RegInfoCache
::
mtx
);
RegInfoCache
::
key2info
[
key
]
=
info
;
}
bool
RegInfoCache
::
has_info
(
const
std
::
string
&
key
)
{
std
::
unique_lock
<
std
::
mutex
>
lock
(
RegInfoCache
::
mtx
);
return
RegInfoCache
::
key2info
.
find
(
key
)
!=
RegInfoCache
::
key2info
.
end
();
}
GroupManager
::
RegisterInfo
RegInfoCache
::
get_info
(
const
std
::
string
&
key
)
{
std
::
unique_lock
<
std
::
mutex
>
lock
(
RegInfoCache
::
mtx
);
return
RegInfoCache
::
key2info
[
key
];
}
// vim: syntax=cpp.doxygen foldmethod=marker foldmarker=f{{{,f}}}
src/opr-mm/impl/io_remote.cpp
浏览文件 @
27205461
...
...
@@ -53,10 +53,19 @@ SymbolVar RemoteSend::make(const std::string& key, SymbolVar var,
void
RemoteSend
::
scn_do_execute
()
{
if
(
!
m_init
)
{
auto
&&
comp_node
=
output
(
0
)
->
comp_node
();
bool
use_cache
=
output
(
0
)
->
owner_graph
()
->
options
().
imperative_proxy_graph
;
struct
GroupManager
::
RegisterInfo
reg_info
;
if
(
use_cache
and
RegInfoCache
::
has_info
(
m_key
))
{
reg_info
=
RegInfoCache
::
get_info
(
m_key
);
}
else
{
// rank 0 for RemoteSend
auto
reg_info
=
m_group_client
->
opr_register
(
m_key
,
2
,
0
,
false
,
reg_info
=
m_group_client
->
opr_register
(
m_key
,
2
,
0
,
false
,
comp_node
.
get_uid
());
if
(
use_cache
)
{
RegInfoCache
::
set_info
(
m_key
,
reg_info
);
}
}
m_megray_comm
=
MegRayCommBuilder
::
get_megray_comm
(
reg_info
.
hash
,
m_key
,
2
,
0
,
MegRay
::
MEGRAY_NCCL
,
m_group_client
);
...
...
@@ -153,11 +162,20 @@ SymbolVar RemoteRecv::make(const std::string& key, cg::ComputingGraph& graph,
void
RemoteRecv
::
scn_do_execute
()
{
if
(
!
m_init
)
{
auto
&&
comp_node
=
output
(
0
)
->
comp_node
();
bool
use_cache
=
output
(
0
)
->
owner_graph
()
->
options
().
imperative_proxy_graph
;
struct
GroupManager
::
RegisterInfo
reg_info
;
if
(
use_cache
and
RegInfoCache
::
has_info
(
m_key
))
{
reg_info
=
RegInfoCache
::
get_info
(
m_key
);
}
else
{
// rank 1 for RemoteRecv
auto
reg_info
=
m_group_client
->
opr_register
(
reg_info
=
m_group_client
->
opr_register
(
m_key
,
2
,
false
,
1
,
comp_node
.
get_uid
());
if
(
use_cache
)
{
RegInfoCache
::
set_info
(
m_key
,
reg_info
);
}
}
m_megray_comm
=
MegRayCommBuilder
::
get_megray_comm
(
reg_info
.
hash
,
m_key
,
2
,
1
,
MegRay
::
MEGRAY_NCCL
,
m_group_client
);
...
...
src/opr-mm/include/megbrain/opr/group_manager.h
浏览文件 @
27205461
...
...
@@ -145,6 +145,22 @@ class GroupClient {
virtual
uint32_t
group_barrier
(
uint32_t
size
,
uint32_t
rank
)
=
0
;
};
/*!
* Cache RegisterInfo returned from GroupManager. This feature is only enabled
* in imperative runtime mode, so that multi-machine operators do not have to
* call opr_register repeatedly in each iter
*/
namespace
RegInfoCache
{
static
std
::
mutex
mtx
;
static
std
::
unordered_map
<
std
::
string
,
GroupManager
::
RegisterInfo
>
key2info
;
void
set_info
(
const
std
::
string
&
key
,
const
GroupManager
::
RegisterInfo
&
info
);
bool
has_info
(
const
std
::
string
&
key
);
GroupManager
::
RegisterInfo
get_info
(
const
std
::
string
&
key
);
}
// namespace RegInfoCache
}
// namespace opr
}
// namespace mgb
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录