Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
机器未来
Paddle
提交
3f3f5a28
P
Paddle
项目概览
机器未来
/
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看板
未验证
提交
3f3f5a28
编写于
4月 12, 2022
作者:
C
crystal
提交者:
GitHub
4月 12, 2022
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[Cherry-Pick]Fix group_norm vectorized address misalignment (#41585)
[cherry-pick] #41531 and #41570
上级
727dcbd9
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
4 addition
and
29 deletion
+4
-29
paddle/fluid/operators/group_norm_op.cu
paddle/fluid/operators/group_norm_op.cu
+4
-29
未找到文件。
paddle/fluid/operators/group_norm_op.cu
浏览文件 @
3f3f5a28
...
...
@@ -419,23 +419,6 @@ __global__ void GroupNormBackward(const T* x, const T* d_y, const T* scale,
}
}
template
<
typename
T
,
typename
AccT
,
int
VecSize
>
__global__
void
VectorizedGetDsDbCUDAKernel
(
int
imsize
,
const
T
*
x
,
const
T
*
dy
,
T
*
ds
,
T
*
db
)
{
int
i
=
blockIdx
.
x
;
AccT
ds_sum
=
static_cast
<
AccT
>
(
0
);
AccT
db_sum
=
static_cast
<
AccT
>
(
0
);
x
+=
i
*
imsize
;
const
int
input_offset
=
((
uint64_t
)
x
)
%
ALIGN_BYTES
/
sizeof
(
T
);
phi
::
Array
<
const
T
*
,
2
>
ins
;
ins
[
0
]
=
x
;
ins
[
1
]
=
dy
;
ThreadReduce
<
T
,
AccT
,
VecSize
,
2
>
(
ins
,
imsize
,
input_offset
,
&
db_sum
,
&
ds_sum
);
ReduceMeanAndVar
<
AccT
>
(
db
,
ds
,
db_sum
,
ds_sum
,
1
);
}
template
<
typename
T
>
__global__
void
ScalarGetDsDbCUDAKernel
(
int
imsize
,
const
T
*
x
,
const
T
*
dy
,
T
*
ds
,
T
*
db
)
{
...
...
@@ -622,25 +605,17 @@ class GroupNormGradKernel<platform::CUDADeviceContext, T>
int
flags
=
(
scale_data
!=
nullptr
)
*
kHasScale
+
(
bias_data
!=
nullptr
)
*
kHasBias
;
if
(
data_layout
==
DataLayout
::
kNCHW
)
{
using
AccT
=
typename
details
::
MPTypeTrait
<
T
>::
Type
;
constexpr
int
vec_size
=
sizeof
(
float4
)
/
sizeof
(
T
);
const
int
max_num_threads
=
1024
;
int
max_block_size
=
std
::
min
(
imsize
/
vec_size
,
max_num_threads
);
int
max_block_size
=
std
::
min
(
imsize
,
max_num_threads
);
int
block_size_nchw
=
1
;
while
(
block_size_nchw
<
max_block_size
)
{
block_size_nchw
*=
2
;
}
block_size_nchw
=
std
::
max
(
block_size_nchw
,
kps
::
details
::
kWarpSize
);
dim3
blocks
(
block_size_nchw
);
if
(
imsize
<
vec_size
*
block_size_nchw
)
{
ScalarGetDsDbCUDAKernel
<
T
><<<
x_dims
[
0
]
*
C
,
blocks
,
0
,
dev_ctx
.
stream
()
>>>
(
imsize
,
x_data
,
dy_data
,
ds_data
,
db_data
);
}
else
{
VectorizedGetDsDbCUDAKernel
<
T
,
AccT
,
vec_size
><<<
x_dims
[
0
]
*
C
,
blocks
,
0
,
dev_ctx
.
stream
()
>>>
(
imsize
,
x_data
,
dy_data
,
ds_data
,
db_data
);
}
ScalarGetDsDbCUDAKernel
<
T
><<<
x_dims
[
0
]
*
C
,
blocks
,
0
,
dev_ctx
.
stream
()
>>>
(
imsize
,
x_data
,
dy_data
,
ds_data
,
db_data
);
if
(
d_scale
||
d_bias
)
{
const
int
block
=
256
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录