Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
MegEngine 天元
MegEngine
提交
2272abe1
MegEngine
项目概览
MegEngine 天元
/
MegEngine
接近 2 年 前同步成功
通知
414
Star
4708
Fork
583
代码
文件
提交
分支
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看板
提交
2272abe1
编写于
8月 11, 2020
作者:
M
Megvii Engine Team
提交者:
Xinran Xu
8月 25, 2020
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix(mgb/fallback): disable nchw44 in conv1x1 and im2col in x86
GitOrigin-RevId: 603d2eb94aa76ba9dc509545a97a28aa200f61de
上级
230ab45a
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
103 addition
and
91 deletion
+103
-91
dnn/src/common/conv_bias.cpp
dnn/src/common/conv_bias.cpp
+0
-85
dnn/src/common/conv_bias.h
dnn/src/common/conv_bias.h
+0
-6
dnn/src/fallback/conv_bias/conv1x1/algos.cpp
dnn/src/fallback/conv_bias/conv1x1/algos.cpp
+12
-0
dnn/src/naive/conv_bias/opr_impl.cpp
dnn/src/naive/conv_bias/opr_impl.cpp
+86
-0
dnn/src/naive/conv_bias/opr_impl.h
dnn/src/naive/conv_bias/opr_impl.h
+5
-0
未找到文件。
dnn/src/common/conv_bias.cpp
浏览文件 @
2272abe1
...
...
@@ -444,91 +444,6 @@ void handle_bias_and_nonlinear(Handle* handle, param::ConvBias args,
}
}
//! Only used for naive implementation. DO NOT use the following function in
//! other backends.
void
handle_z_inp_and_activation_naive
(
param
::
ConvBias
::
NonlineMode
nonline_mode
,
const
TensorND
&
conv_bias_tensor
,
const
TensorND
&
z_tensor
,
const
TensorND
&
dst_tensor
,
dt_byte
*
workspace_ptr
)
{
auto
res
=
dst_tensor
,
z_float
=
z_tensor
;
//!create naive inplace handle
auto
handle
=
inplace_cpu_handle
(
2
);
if
(
z_tensor
.
layout
.
ndim
>
0
&&
z_tensor
.
layout
.
dtype
.
category
()
!=
DTypeCategory
::
FLOAT
)
{
dt_byte
*
res_float_workspace_ptr
=
nullptr
,
*
z_float_workspace_ptr
=
nullptr
;
megdnn_assert
(
z_tensor
.
layout
.
eq_shape
(
dst_tensor
.
layout
));
res_float_workspace_ptr
=
workspace_ptr
;
z_float_workspace_ptr
=
res_float_workspace_ptr
+
TensorLayout
{
z_tensor
.
layout
,
dtype
::
Float32
()}
.
span
()
.
dist_byte
();
res
=
TensorND
{
res_float_workspace_ptr
,
TensorLayout
{
dst_tensor
.
layout
,
dtype
::
Float32
()}};
z_float
=
TensorND
{
z_float_workspace_ptr
,
TensorLayout
{
z_tensor
.
layout
,
dtype
::
Float32
()}};
}
// ====================sfb + z_tensor=====================
if
(
z_tensor
.
layout
.
ndim
>
0
)
{
if
(
z_tensor
.
layout
.
dtype
.
category
()
!=
DTypeCategory
::
FLOAT
)
{
auto
&&
type_cvt
=
handle
->
create_operator
<
TypeCvt
>
();
type_cvt
->
exec
(
conv_bias_tensor
,
res
);
type_cvt
->
exec
(
z_tensor
,
z_float
);
}
auto
add_opr
=
handle
->
create_operator
<
ElemwiseForward
>
();
add_opr
->
param
().
mode
=
Elemwise
::
Param
::
Mode
::
ADD
;
add_opr
->
exec
({
res
,
z_float
},
res
);
}
else
{
res
=
conv_bias_tensor
;
}
using
NonlineMode
=
param
::
ConvBias
::
NonlineMode
;
switch
(
nonline_mode
)
{
#define cb(_mode) \
case NonlineMode::_mode: { \
if (res.layout.dtype.category() != DTypeCategory::QUANTIZED) { \
auto nonlinear = handle->create_operator<ElemwiseForward>(); \
nonlinear->param().mode = Elemwise::Param::Mode::_mode; \
if (res.layout.dtype == dst_tensor.layout.dtype) { \
nonlinear->exec({res}, dst_tensor); \
} else { \
nonlinear->exec({res}, res); \
handle->create_operator<TypeCvt>()->exec(res, dst_tensor); \
} \
} else { \
auto nonlinear = handle->create_operator<ElemwiseMultiType>(); \
nonlinear->param().mode = \
ElemwiseMultiType::Param::Mode::Q##_mode; \
nonlinear->exec({res}, dst_tensor); \
} \
break; \
}
cb
(
RELU
);
cb
(
H_SWISH
);
#undef cb
case
NonlineMode
::
SIGMOID
:
{
megdnn_assert
(
res
.
layout
.
dtype
.
category
()
!=
DTypeCategory
::
QUANTIZED
);
auto
nonlinear
=
handle
->
create_operator
<
ElemwiseForward
>
();
nonlinear
->
param
().
mode
=
Elemwise
::
Param
::
Mode
::
SIGMOID
;
nonlinear
->
exec
({
res
},
res
);
if
(
res
.
raw_ptr
!=
dst_tensor
.
raw_ptr
)
{
handle
->
create_operator
<
TypeCvt
>
()
->
exec
(
res
,
dst_tensor
);
}
break
;
}
case
NonlineMode
::
IDENTITY
:
{
if
(
res
.
raw_ptr
!=
dst_tensor
.
raw_ptr
)
{
handle
->
create_operator
<
TypeCvt
>
()
->
exec
(
res
,
dst_tensor
);
}
break
;
}
default:
megdnn_assert
(
false
);
}
}
}
// namespace megdnn
// vim: syntax=cpp.doxygen
dnn/src/common/conv_bias.h
浏览文件 @
2272abe1
...
...
@@ -21,12 +21,6 @@ void handle_bias_and_nonlinear(Handle* handle, param::ConvBias args,
const
TensorND
*
conv_dst_tensor
,
const
TensorND
*
dst_tensor
,
const
TensorND
*
bias_tensor
);
void
handle_z_inp_and_activation_naive
(
param
::
ConvBias
::
NonlineMode
nonline_mode
,
const
TensorND
&
conv_bias_tensor
,
const
TensorND
&
z_tensor
,
const
TensorND
&
dst_tensor
,
dt_byte
*
workspace_ptr
);
}
// namespace megdnn
// vim: syntax=cpp.doxygen
dnn/src/fallback/conv_bias/conv1x1/algos.cpp
浏览文件 @
2272abe1
...
...
@@ -204,6 +204,18 @@ ConvBiasImpl::AlgoConv1x1::dispatch_preprocess_kerns(
bool
ConvBiasImpl
::
AlgoConv1x1
::
usable
(
const
NCBKernSizeParam
&
param
,
AlgoSelectionStrategy
)
const
{
MIDOUT_BEGIN
(
megdnn_fallback_conv1x1
,
0
,
2
)
{
//! x86 only support nchw
#if MEGDNN_X86
if
(
param
.
filter_meta
.
format
!=
param
::
ConvBias
::
Format
::
NCHW
)
{
return
false
;
}
#else
if
(
param
.
filter_meta
.
format
!=
param
::
ConvBias
::
Format
::
NCHW
&&
param
.
filter_meta
.
format
!=
param
::
ConvBias
::
Format
::
NCHW44
&&
param
.
filter_meta
.
format
!=
param
::
ConvBias
::
Format
::
NCHW44_DOT
)
{
return
false
;
}
#endif
size_t
FH
=
param
.
filter_meta
.
spatial
[
0
],
FW
=
param
.
filter_meta
.
spatial
[
1
];
size_t
PH
=
param
.
filter_meta
.
padding
[
0
],
...
...
dnn/src/naive/conv_bias/opr_impl.cpp
浏览文件 @
2272abe1
...
...
@@ -17,6 +17,7 @@
#include "src/naive/handle.h"
#include "src/naive/lowbit_utils.h"
#include "src/common/conv_bias.h"
#include "src/common/opr_delegate.h"
#include "midout.h"
MIDOUT_DECL
(
megdnn_naive_conv_bias_fwd
)
...
...
@@ -24,6 +25,91 @@ MIDOUT_DECL(megdnn_naive_conv_bias_fwd)
namespace
megdnn
{
namespace
naive
{
//! Only used for naive implementation. DO NOT use the following function in
//! other backends.
void
handle_z_inp_and_activation_naive
(
param
::
ConvBias
::
NonlineMode
nonline_mode
,
const
TensorND
&
conv_bias_tensor
,
const
TensorND
&
z_tensor
,
const
TensorND
&
dst_tensor
,
dt_byte
*
workspace_ptr
)
{
auto
res
=
dst_tensor
,
z_float
=
z_tensor
;
//!create naive inplace handle
auto
handle
=
inplace_cpu_handle
(
2
);
if
(
z_tensor
.
layout
.
ndim
>
0
&&
z_tensor
.
layout
.
dtype
.
category
()
!=
DTypeCategory
::
FLOAT
)
{
dt_byte
*
res_float_workspace_ptr
=
nullptr
,
*
z_float_workspace_ptr
=
nullptr
;
megdnn_assert
(
z_tensor
.
layout
.
eq_shape
(
dst_tensor
.
layout
));
res_float_workspace_ptr
=
workspace_ptr
;
z_float_workspace_ptr
=
res_float_workspace_ptr
+
TensorLayout
{
z_tensor
.
layout
,
dtype
::
Float32
()}
.
span
()
.
dist_byte
();
res
=
TensorND
{
res_float_workspace_ptr
,
TensorLayout
{
dst_tensor
.
layout
,
dtype
::
Float32
()}};
z_float
=
TensorND
{
z_float_workspace_ptr
,
TensorLayout
{
z_tensor
.
layout
,
dtype
::
Float32
()}};
}
// ====================sfb + z_tensor=====================
if
(
z_tensor
.
layout
.
ndim
>
0
)
{
if
(
z_tensor
.
layout
.
dtype
.
category
()
!=
DTypeCategory
::
FLOAT
)
{
auto
&&
type_cvt
=
handle
->
create_operator
<
TypeCvt
>
();
type_cvt
->
exec
(
conv_bias_tensor
,
res
);
type_cvt
->
exec
(
z_tensor
,
z_float
);
}
auto
add_opr
=
handle
->
create_operator
<
ElemwiseForward
>
();
add_opr
->
param
().
mode
=
Elemwise
::
Param
::
Mode
::
ADD
;
add_opr
->
exec
({
res
,
z_float
},
res
);
}
else
{
res
=
conv_bias_tensor
;
}
using
NonlineMode
=
param
::
ConvBias
::
NonlineMode
;
switch
(
nonline_mode
)
{
#define cb(_mode) \
case NonlineMode::_mode: { \
if (res.layout.dtype.category() != DTypeCategory::QUANTIZED) { \
auto nonlinear = handle->create_operator<ElemwiseForward>(); \
nonlinear->param().mode = Elemwise::Param::Mode::_mode; \
if (res.layout.dtype == dst_tensor.layout.dtype) { \
nonlinear->exec({res}, dst_tensor); \
} else { \
nonlinear->exec({res}, res); \
handle->create_operator<TypeCvt>()->exec(res, dst_tensor); \
} \
} else { \
auto nonlinear = handle->create_operator<ElemwiseMultiType>(); \
nonlinear->param().mode = \
ElemwiseMultiType::Param::Mode::Q##_mode; \
nonlinear->exec({res}, dst_tensor); \
} \
break; \
}
cb
(
RELU
);
cb
(
H_SWISH
);
#undef cb
case
NonlineMode
::
SIGMOID
:
{
megdnn_assert
(
res
.
layout
.
dtype
.
category
()
!=
DTypeCategory
::
QUANTIZED
);
auto
nonlinear
=
handle
->
create_operator
<
ElemwiseForward
>
();
nonlinear
->
param
().
mode
=
Elemwise
::
Param
::
Mode
::
SIGMOID
;
nonlinear
->
exec
({
res
},
res
);
if
(
res
.
raw_ptr
!=
dst_tensor
.
raw_ptr
)
{
handle
->
create_operator
<
TypeCvt
>
()
->
exec
(
res
,
dst_tensor
);
}
break
;
}
case
NonlineMode
::
IDENTITY
:
{
if
(
res
.
raw_ptr
!=
dst_tensor
.
raw_ptr
)
{
handle
->
create_operator
<
TypeCvt
>
()
->
exec
(
res
,
dst_tensor
);
}
break
;
}
default:
megdnn_assert
(
false
);
}
}
namespace
convolution
{
template
<
>
...
...
dnn/src/naive/conv_bias/opr_impl.h
浏览文件 @
2272abe1
...
...
@@ -66,6 +66,11 @@ public:
const
char
*
get_algorithm_set_name
()
const
override
;
};
void
handle_z_inp_and_activation_naive
(
param
::
ConvBias
::
NonlineMode
nonline_mode
,
const
TensorND
&
conv_bias_tensor
,
const
TensorND
&
z_tensor
,
const
TensorND
&
dst_tensor
,
dt_byte
*
workspace_ptr
);
}
// namespace naive
}
// namespace megdnn
// vim: syntax=cpp.doxygen
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录