Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
BaiXuePrincess
Paddle
提交
1c6dcfd9
P
Paddle
项目概览
BaiXuePrincess
/
Paddle
与 Fork 源项目一致
Fork自
PaddlePaddle / Paddle
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
Paddle
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
1c6dcfd9
编写于
3月 27, 2022
作者:
S
Sylwester Fraczek
提交者:
GitHub
3月 27, 2022
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix reshape+transpose+matmul (#40948)
上级
6a94adbe
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
43 addition
and
2 deletion
+43
-2
paddle/fluid/operators/mkldnn/matmul_mkldnn_op.cc
paddle/fluid/operators/mkldnn/matmul_mkldnn_op.cc
+43
-2
未找到文件。
paddle/fluid/operators/mkldnn/matmul_mkldnn_op.cc
浏览文件 @
1c6dcfd9
...
...
@@ -235,6 +235,47 @@ class MatMulMKLDNNHandler
out_strides
;
};
phi
::
DDim
GetDimForInput
(
const
ExecutionContext
&
ctx
,
std
::
string
input_name
)
{
auto
shape
=
ctx
.
Attr
<
std
::
vector
<
int
>>
(
"fused_reshape_"
+
input_name
);
auto
axis
=
ctx
.
Attr
<
std
::
vector
<
int
>>
(
"fused_transpose_"
+
input_name
);
auto
input_dims
=
ctx
.
Input
<
Tensor
>
(
input_name
)
->
dims
();
if
(
!
shape
.
empty
()
&&
!
axis
.
empty
())
{
auto
it_zero
=
std
::
find
(
shape
.
begin
(),
shape
.
end
(),
0
);
if
(
it_zero
!=
shape
.
end
())
{
for
(
uint64_t
i
=
0
;
i
<
shape
.
size
();
i
++
)
{
if
(
shape
[
i
]
==
0
)
{
PADDLE_ENFORCE_LT
(
i
,
input_dims
.
size
(),
paddle
::
platform
::
errors
::
InvalidArgument
(
"The index of 0 in fused_reshape_%s "
,
"should be less than output dim size, "
,
"but the index is %d and output dim size is %d"
,
input_name
,
i
,
input_dims
.
size
()));
shape
[
i
]
=
input_dims
.
at
(
i
);
}
}
}
// if "-1" is present then one of reshape dims must be infered
auto
it_negative
=
std
::
find
(
shape
.
begin
(),
shape
.
end
(),
-
1
);
if
(
it_negative
!=
shape
.
end
())
{
int64_t
dim_product
=
1
;
for
(
int
i
=
0
;
i
<
input_dims
.
size
();
i
++
)
{
dim_product
*=
input_dims
.
at
(
i
);
}
int64_t
shape_product
=
std
::
accumulate
(
shape
.
begin
(),
shape
.
end
(),
-
1
,
std
::
multiplies
<
int
>
());
int
index
=
std
::
distance
(
shape
.
begin
(),
it_negative
);
shape
[
index
]
=
dim_product
/
shape_product
;
}
return
input_dims
.
reshape
(
shape
).
transpose
(
axis
);
}
return
input_dims
;
}
std
::
pair
<
phi
::
funcs
::
MatDescriptor
,
memory
::
dims
>
GetInputDimsAndStrides
(
const
ExecutionContext
&
ctx
,
std
::
string
input_name
)
{
auto
shape
=
ctx
.
Attr
<
std
::
vector
<
int
>>
(
"fused_reshape_"
+
input_name
);
...
...
@@ -342,8 +383,8 @@ class MatMulMKLDNNHandler
batch_size_
=
1
;
if
(
out_bs
>
1
&&
(
IsOutputFused
(
ctx
)
||
IsInputFused
(
ctx
)))
{
auto
&
x_dims
=
ctx
.
Input
<
Tensor
>
(
"X"
)
->
dims
(
);
auto
&
y_dims
=
ctx
.
Input
<
Tensor
>
(
"Y"
)
->
dims
(
);
auto
x_dims
=
GetDimForInput
(
ctx
,
"X"
);
auto
y_dims
=
GetDimForInput
(
ctx
,
"Y"
);
batch_size_
=
x_bs
>
y_bs
?
x_dims
[
0
]
:
y_dims
[
0
];
x_bs
/=
batch_size_
;
y_bs
/=
batch_size_
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录