Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
Paddle
提交
36739748
P
Paddle
项目概览
PaddlePaddle
/
Paddle
1 年多 前同步成功
通知
2312
Star
20933
Fork
5424
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1423
列表
看板
标记
里程碑
合并请求
543
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
Paddle
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1,423
Issue
1,423
列表
看板
标记
里程碑
合并请求
543
合并请求
543
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
36739748
编写于
9月 07, 2022
作者:
Z
zhangkaihuo
提交者:
GitHub
9月 07, 2022
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[Sparse]Rename sparse kernel (#45730)
上级
c084a7b1
变更
16
隐藏空白更改
内联
并排
Showing
16 changed file
with
271 addition
and
310 deletion
+271
-310
paddle/phi/api/lib/sparse_api_custom_impl.cc
paddle/phi/api/lib/sparse_api_custom_impl.cc
+6
-6
paddle/phi/api/yaml/sparse_api.yaml
paddle/phi/api/yaml/sparse_api.yaml
+23
-27
paddle/phi/api/yaml/sparse_bw_api.yaml
paddle/phi/api/yaml/sparse_bw_api.yaml
+23
-22
paddle/phi/kernels/sparse/cpu/elementwise_kernel.cc
paddle/phi/kernels/sparse/cpu/elementwise_kernel.cc
+3
-3
paddle/phi/kernels/sparse/cpu/sparse_utils_kernel.cc
paddle/phi/kernels/sparse/cpu/sparse_utils_kernel.cc
+46
-48
paddle/phi/kernels/sparse/gpu/matmul_grad_kernel.cu
paddle/phi/kernels/sparse/gpu/matmul_grad_kernel.cu
+2
-2
paddle/phi/kernels/sparse/gpu/sparse_utils_kernel.cu
paddle/phi/kernels/sparse/gpu/sparse_utils_kernel.cu
+54
-56
paddle/phi/kernels/sparse/sparse_utils_grad_kernel.cc
paddle/phi/kernels/sparse/sparse_utils_grad_kernel.cc
+13
-13
paddle/phi/kernels/sparse/sparse_utils_grad_kernel.h
paddle/phi/kernels/sparse/sparse_utils_grad_kernel.h
+5
-5
paddle/phi/kernels/sparse/sparse_utils_kernel.h
paddle/phi/kernels/sparse/sparse_utils_kernel.h
+39
-41
paddle/phi/tests/api/test_sparse_utils_api.cc
paddle/phi/tests/api/test_sparse_utils_api.cc
+1
-1
paddle/phi/tests/kernels/test_sparse_activation_dev_api.cc
paddle/phi/tests/kernels/test_sparse_activation_dev_api.cc
+1
-1
paddle/phi/tests/kernels/test_sparse_elementwise_dev_api.cc
paddle/phi/tests/kernels/test_sparse_elementwise_dev_api.cc
+39
-48
paddle/phi/tests/kernels/test_sparse_utils_dev_api.cc
paddle/phi/tests/kernels/test_sparse_utils_dev_api.cc
+12
-14
python/paddle/fluid/dygraph/varbase_patch_methods.py
python/paddle/fluid/dygraph/varbase_patch_methods.py
+3
-22
python/paddle/incubate/sparse/creation.py
python/paddle/incubate/sparse/creation.py
+1
-1
未找到文件。
paddle/phi/api/lib/sparse_api_custom_impl.cc
浏览文件 @
36739748
...
@@ -30,9 +30,9 @@ Tensor to_sparse_coo_impl(const Tensor& x, const int64_t sparse_dim) {
...
@@ -30,9 +30,9 @@ Tensor to_sparse_coo_impl(const Tensor& x, const int64_t sparse_dim) {
}
}
// 1. Get kernel signature and kernel
// 1. Get kernel signature and kernel
std
::
string
kernel_name
=
"dense_to_
sparse_
coo"
;
std
::
string
kernel_name
=
"dense_to_coo"
;
if
(
x
.
layout
()
==
phi
::
DataLayout
::
SPARSE_CSR
)
{
if
(
x
.
layout
()
==
phi
::
DataLayout
::
SPARSE_CSR
)
{
kernel_name
=
"
sparse_
csr_to_coo"
;
kernel_name
=
"csr_to_coo"
;
}
}
auto
kernel_key_set
=
ParseKernelKeyByInputArgs
(
x
);
auto
kernel_key_set
=
ParseKernelKeyByInputArgs
(
x
);
...
@@ -88,9 +88,9 @@ Tensor to_sparse_csr_impl(const Tensor& x) {
...
@@ -88,9 +88,9 @@ Tensor to_sparse_csr_impl(const Tensor& x) {
return
x
;
return
x
;
}
}
// 1. Get kernel signature and kernel
// 1. Get kernel signature and kernel
std
::
string
kernel_name
=
"dense_to_
sparse_
csr"
;
std
::
string
kernel_name
=
"dense_to_csr"
;
if
(
x
.
layout
()
==
phi
::
DataLayout
::
SPARSE_COO
)
{
if
(
x
.
layout
()
==
phi
::
DataLayout
::
SPARSE_COO
)
{
kernel_name
=
"
sparse_
coo_to_csr"
;
kernel_name
=
"coo_to_csr"
;
}
}
auto
kernel_key_set
=
ParseKernelKeyByInputArgs
(
x
);
auto
kernel_key_set
=
ParseKernelKeyByInputArgs
(
x
);
...
@@ -151,9 +151,9 @@ Tensor to_dense_impl(const Tensor& x) {
...
@@ -151,9 +151,9 @@ Tensor to_dense_impl(const Tensor& x) {
}
}
// 1. Get kernel signature and kernel
// 1. Get kernel signature and kernel
std
::
string
kernel_name
=
"
sparse_
coo_to_dense"
;
std
::
string
kernel_name
=
"coo_to_dense"
;
if
(
x
.
layout
()
==
phi
::
DataLayout
::
SPARSE_CSR
)
{
if
(
x
.
layout
()
==
phi
::
DataLayout
::
SPARSE_CSR
)
{
kernel_name
=
"
sparse_
csr_to_dense"
;
kernel_name
=
"csr_to_dense"
;
}
}
auto
kernel_key_set
=
ParseKernelKeyByInputArgs
(
x
);
auto
kernel_key_set
=
ParseKernelKeyByInputArgs
(
x
);
...
...
paddle/phi/api/yaml/sparse_api.yaml
浏览文件 @
36739748
...
@@ -82,34 +82,13 @@
...
@@ -82,34 +82,13 @@
-
api
:
conv3d
-
api
:
conv3d
args
:
(Tensor x, Tensor kernel, int[] paddings, int[] dilations, int[] strides, int groups, bool subm, str key)
args
:
(Tensor x, Tensor kernel, int[] paddings, int[] dilations, int[] strides, int groups, bool subm, str key)
output
:
Tensor(out), Tensor(rulebook), Tensor(counter)
output
:
Tensor(out), Tensor(rulebook), Tensor(counter)
kernel
:
kernel
:
func
:
conv3d_coo{sparse_coo, dense -> sparse_coo, dense, dense}
func
:
conv3d_coo{sparse_coo, dense -> sparse_coo, dense, dense}
layout
:
x
layout
:
x
intermediate
:
rulebook, counter
intermediate
:
rulebook, counter
backward
:
conv3d_coo_grad
backward
:
conv3d_coo_grad
-
api
:
coo_to_dense
args
:
(Tensor x)
output
:
Tensor(out)
invoke
:
to_dense_impl(x)
backward
:
coo_to_dense_grad
-
api
:
create_sparse_coo_tensor
args
:
(Tensor values, Tensor indices, IntArray dense_shape)
output
:
Tensor(out)
kernel
:
func
:
sparse_coo_tensor{dense, dense -> sparse_coo}
layout
:
values
data_type
:
values
backward
:
create_sparse_coo_tensor_grad
-
api
:
dense_to_coo
args
:
(Tensor x, int64_t sparse_dim)
output
:
Tensor(out)
invoke
:
to_sparse_coo_impl(x, sparse_dim)
backward
:
dense_to_coo_grad
-
api
:
divide
-
api
:
divide
args
:
(Tensor x, Tensor y)
args
:
(Tensor x, Tensor y)
output
:
Tensor(out)
output
:
Tensor(out)
...
@@ -224,6 +203,15 @@
...
@@ -224,6 +203,15 @@
layout
:
x
layout
:
x
backward
:
softmax_grad
backward
:
softmax_grad
-
api
:
sparse_coo_tensor
args
:
(Tensor values, Tensor indices, IntArray dense_shape)
output
:
Tensor(out)
kernel
:
func
:
sparse_coo_tensor{dense, dense -> sparse_coo}
layout
:
values
data_type
:
values
backward
:
sparse_coo_tensor_grad
-
api
:
sqrt
-
api
:
sqrt
args
:
(Tensor x)
args
:
(Tensor x)
output
:
Tensor(out)
output
:
Tensor(out)
...
@@ -272,24 +260,32 @@
...
@@ -272,24 +260,32 @@
-
api
:
to_dense
-
api
:
to_dense
args
:
(Tensor x)
args
:
(Tensor x)
output
:
Tensor(out)
output
:
Tensor(out)
invoke
:
to_dense_impl(x)
kernel
:
func
:
coo_to_dense {sparse_coo -> dense},
csr_to_dense {sparse_csr -> dense}
backward
:
to_dense_grad
-
api
:
to_sparse_coo
-
api
:
to_sparse_coo
args
:
(Tensor x, int64_t sparse_dim)
args
:
(Tensor x, int64_t sparse_dim)
output
:
Tensor(out)
output
:
Tensor(out)
invoke
:
to_sparse_coo_impl(x, sparse_dim)
kernel
:
func
:
dense_to_coo { dense -> sparse_coo },
csr_to_coo { sparse_csr -> sparse_coo}
backward
:
to_sparse_coo_grad
-
api
:
to_sparse_csr
-
api
:
to_sparse_csr
args
:
(Tensor x)
args
:
(Tensor x)
output
:
Tensor(out)
output
:
Tensor(out)
invoke
:
to_sparse_csr_impl(x)
kernel
:
func
:
dense_to_csr {dense -> sparse_csr},
coo_to_csr {sparse_coo -> sparse_csr}
-
api
:
values
-
api
:
values
args
:
(Tensor x)
args
:
(Tensor x)
output
:
Tensor(out)
output
:
Tensor(out)
kernel
:
kernel
:
func
:
coo_values
{sparse_coo -> dense},
func
:
values_coo
{sparse_coo -> dense},
csr_values
{sparse_csr -> dense}
values_csr
{sparse_csr -> dense}
layout
:
x
layout
:
x
backward
:
values_grad
backward
:
values_grad
...
...
paddle/phi/api/yaml/sparse_bw_api.yaml
浏览文件 @
36739748
...
@@ -88,26 +88,6 @@
...
@@ -88,26 +88,6 @@
kernel
:
kernel
:
func
:
conv3d_coo_grad{sparse_coo, dense, sparse_coo, dense, dense, sparse_coo -> sparse_coo, dense}
func
:
conv3d_coo_grad{sparse_coo, dense, sparse_coo, dense, dense, sparse_coo -> sparse_coo, dense}
-
backward_api
:
coo_to_dense_grad
forward
:
coo_to_dense(Tensor x) -> Tensor(out)
args
:
(Tensor x, Tensor out_grad)
output
:
Tensor(x_grad)
kernel
:
func
:
sparse_coo_to_dense_grad{sparse_coo, dense-> sparse_coo}
-
backward_api
:
create_sparse_coo_tensor_grad
forward
:
create_sparse_coo_tensor(Tensor values, Tensor indices, IntArray dense_shape) -> Tensor(out)
args
:
(Tensor indices, Tensor out_grad)
output
:
Tensor(values_grad)
kernel
:
func
:
sparse_coo_tensor_grad{dense, sparse_coo -> dense}
-
backward_api
:
dense_to_coo_grad
forward
:
dense_to_coo(Tensor x, int64_t sparse_dim) -> Tensor(out)
args
:
(Tensor out_grad)
output
:
Tensor(x_grad)
invoke
:
coo_to_dense(out_grad)
-
backward_api
:
divide_grad
-
backward_api
:
divide_grad
forward
:
divide(Tensor x, Tensor y) -> Tensor(out)
forward
:
divide(Tensor x, Tensor y) -> Tensor(out)
args
:
(Tensor x, Tensor y, Tensor out, Tensor out_grad)
args
:
(Tensor x, Tensor y, Tensor out, Tensor out_grad)
...
@@ -239,6 +219,13 @@
...
@@ -239,6 +219,13 @@
kernel
:
kernel
:
func
:
softmax_csr_grad{sparse_csr, sparse_csr -> sparse_csr}
func
:
softmax_csr_grad{sparse_csr, sparse_csr -> sparse_csr}
-
backward_api
:
sparse_coo_tensor_grad
forward
:
sparse_coo_tensor(Tensor values, Tensor indices, IntArray dense_shape) -> Tensor(out)
args
:
(Tensor indices, Tensor out_grad)
output
:
Tensor(values_grad)
kernel
:
func
:
sparse_coo_tensor_grad{dense, sparse_coo -> dense}
-
backward_api
:
sqrt_grad
-
backward_api
:
sqrt_grad
forward
:
sqrt(Tensor x) -> Tensor(out)
forward
:
sqrt(Tensor x) -> Tensor(out)
args
:
(Tensor out, Tensor out_grad)
args
:
(Tensor out, Tensor out_grad)
...
@@ -279,12 +266,26 @@
...
@@ -279,12 +266,26 @@
func
:
tanh_coo_grad {sparse_coo, sparse_coo -> sparse_coo},
func
:
tanh_coo_grad {sparse_coo, sparse_coo -> sparse_coo},
tanh_csr_grad {sparse_csr, sparse_csr -> sparse_csr}
tanh_csr_grad {sparse_csr, sparse_csr -> sparse_csr}
-
backward_api
:
to_dense_grad
forward
:
to_dense(Tensor x) -> Tensor(out)
args
:
(Tensor x, Tensor out_grad)
output
:
Tensor(x_grad)
kernel
:
func
:
coo_to_dense_grad{sparse_coo, dense -> sparse_coo}
-
backward_api
:
to_sparse_coo_grad
forward
:
to_sparse_coo(Tensor x, int64_t sparse_dim) -> Tensor(out)
args
:
(Tensor out_grad)
output
:
Tensor(x_grad)
kernel
:
func
:
coo_to_dense { sparse_coo -> dense }
-
backward_api
:
values_grad
-
backward_api
:
values_grad
forward
:
coo_values
(Tensor x) -> Tensor(out)
forward
:
values_coo
(Tensor x) -> Tensor(out)
args
:
(Tensor x, Tensor out_grad)
args
:
(Tensor x, Tensor out_grad)
output
:
Tensor(x_grad)
output
:
Tensor(x_grad)
kernel
:
kernel
:
func
:
coo_values
_grad{sparse_coo, dense-> sparse_coo}
func
:
values_coo
_grad{sparse_coo, dense-> sparse_coo}
-
backward_api
:
fused_attention_grad
-
backward_api
:
fused_attention_grad
forward
:
fused_attention_csr(Tensor query, Tensor key, Tensor value, Tensor sparse_mask, Tensor key_padding_mask, Tensor attn_mask) -> Tensor(out), Tensor(softmax)
forward
:
fused_attention_csr(Tensor query, Tensor key, Tensor value, Tensor sparse_mask, Tensor key_padding_mask, Tensor attn_mask) -> Tensor(out), Tensor(softmax)
...
...
paddle/phi/kernels/sparse/cpu/elementwise_kernel.cc
浏览文件 @
36739748
...
@@ -270,15 +270,15 @@ void ElementWiseCooKernelImpl(const Context& dev_ctx,
...
@@ -270,15 +270,15 @@ void ElementWiseCooKernelImpl(const Context& dev_ctx,
const SparseCsrTensor& y, \
const SparseCsrTensor& y, \
SparseCsrTensor* out) { \
SparseCsrTensor* out) { \
funcs::name##Functor<T> functor; \
funcs::name##Functor<T> functor; \
auto coo_x =
SparseCsrToCoo<T>(dev_ctx, x);
\
auto coo_x =
CsrToCoo<T>(dev_ctx, x);
\
auto coo_y =
SparseCsrToCoo<T>(dev_ctx, y);
\
auto coo_y =
CsrToCoo<T>(dev_ctx, y);
\
DenseTensor indeces; \
DenseTensor indeces; \
DenseTensor values; \
DenseTensor values; \
SparseCooTensor coo_out; \
SparseCooTensor coo_out; \
coo_out.SetMember(indeces, values, x.dims()); \
coo_out.SetMember(indeces, values, x.dims()); \
ElementWiseCooKernelImpl<T, IntT, Context, funcs::name##Functor<T>>( \
ElementWiseCooKernelImpl<T, IntT, Context, funcs::name##Functor<T>>( \
dev_ctx, coo_x, coo_y, &coo_out, functor); \
dev_ctx, coo_x, coo_y, &coo_out, functor); \
*out =
SparseCooToCsr<T>(dev_ctx, coo_out);
\
*out =
CooToCsr<T>(dev_ctx, coo_out);
\
}
}
#define DEFINE_CSR_ELEMENTWISE_KERNEL(name) \
#define DEFINE_CSR_ELEMENTWISE_KERNEL(name) \
...
...
paddle/phi/kernels/sparse/cpu/sparse_utils_kernel.cc
浏览文件 @
36739748
...
@@ -63,10 +63,10 @@ inline int64_t GetNonZeroNum(const DenseTensor& dense,
...
@@ -63,10 +63,10 @@ inline int64_t GetNonZeroNum(const DenseTensor& dense,
}
}
template
<
typename
T
,
typename
Context
>
template
<
typename
T
,
typename
Context
>
void
DenseTo
Sparse
CooKernel
(
const
Context
&
dev_ctx
,
void
DenseToCooKernel
(
const
Context
&
dev_ctx
,
const
DenseTensor
&
x
,
const
DenseTensor
&
x
,
const
int64_t
sparse_dim
,
const
int64_t
sparse_dim
,
SparseCooTensor
*
out
)
{
SparseCooTensor
*
out
)
{
const
T
*
x_data
=
x
.
data
<
T
>
();
const
T
*
x_data
=
x
.
data
<
T
>
();
const
auto
&
x_dims
=
x
.
dims
();
const
auto
&
x_dims
=
x
.
dims
();
PADDLE_ENFORCE_LE
(
sparse_dim
,
PADDLE_ENFORCE_LE
(
sparse_dim
,
...
@@ -107,9 +107,9 @@ void DenseToSparseCooKernel(const Context& dev_ctx,
...
@@ -107,9 +107,9 @@ void DenseToSparseCooKernel(const Context& dev_ctx,
}
}
template
<
typename
T
,
typename
IntT
>
template
<
typename
T
,
typename
IntT
>
void
Sparse
CsrToCooCPUKernel
(
const
CPUContext
&
dev_ctx
,
void
CsrToCooCPUKernel
(
const
CPUContext
&
dev_ctx
,
const
SparseCsrTensor
&
x
,
const
SparseCsrTensor
&
x
,
SparseCooTensor
*
out
)
{
SparseCooTensor
*
out
)
{
const
DDim
&
x_dims
=
x
.
dims
();
const
DDim
&
x_dims
=
x
.
dims
();
const
int64_t
non_zero_num
=
x
.
cols
().
numel
();
const
int64_t
non_zero_num
=
x
.
cols
().
numel
();
const
auto
&
csr_crows
=
x
.
crows
();
const
auto
&
csr_crows
=
x
.
crows
();
...
@@ -157,19 +157,18 @@ void SparseCsrToCooCPUKernel(const CPUContext& dev_ctx,
...
@@ -157,19 +157,18 @@ void SparseCsrToCooCPUKernel(const CPUContext& dev_ctx,
}
}
template
<
typename
T
,
typename
Context
>
template
<
typename
T
,
typename
Context
>
void
SparseCsrToCooKernel
(
const
Context
&
dev_ctx
,
void
CsrToCooKernel
(
const
Context
&
dev_ctx
,
const
SparseCsrTensor
&
x
,
const
SparseCsrTensor
&
x
,
SparseCooTensor
*
out
)
{
SparseCooTensor
*
out
)
{
PD_VISIT_BASE_INTEGRAL_TYPES
(
PD_VISIT_BASE_INTEGRAL_TYPES
(
x
.
crows
().
dtype
(),
"CsrToCooCPUKernel"
,
([
&
]
{
x
.
crows
().
dtype
(),
"SparseCsrToCooCPUKernel"
,
([
&
]
{
CsrToCooCPUKernel
<
T
,
data_t
>
(
dev_ctx
,
x
,
out
);
SparseCsrToCooCPUKernel
<
T
,
data_t
>
(
dev_ctx
,
x
,
out
);
}));
}));
}
}
template
<
typename
T
,
typename
IntT
>
template
<
typename
T
,
typename
IntT
>
void
Sparse
CooToCsrCPUKernel
(
const
CPUContext
&
dev_ctx
,
void
CooToCsrCPUKernel
(
const
CPUContext
&
dev_ctx
,
const
SparseCooTensor
&
x
,
const
SparseCooTensor
&
x
,
SparseCsrTensor
*
out
)
{
SparseCsrTensor
*
out
)
{
const
auto
&
x_dims
=
x
.
dims
();
const
auto
&
x_dims
=
x
.
dims
();
bool
valid
=
x_dims
.
size
()
==
2
||
x_dims
.
size
()
==
3
;
bool
valid
=
x_dims
.
size
()
==
2
||
x_dims
.
size
()
==
3
;
PADDLE_ENFORCE_EQ
(
valid
,
PADDLE_ENFORCE_EQ
(
valid
,
...
@@ -247,19 +246,18 @@ void SparseCooToCsrCPUKernel(const CPUContext& dev_ctx,
...
@@ -247,19 +246,18 @@ void SparseCooToCsrCPUKernel(const CPUContext& dev_ctx,
}
}
template
<
typename
T
,
typename
Context
>
template
<
typename
T
,
typename
Context
>
void
SparseCooToCsrKernel
(
const
Context
&
dev_ctx
,
void
CooToCsrKernel
(
const
Context
&
dev_ctx
,
const
SparseCooTensor
&
x
,
const
SparseCooTensor
&
x
,
SparseCsrTensor
*
out
)
{
SparseCsrTensor
*
out
)
{
PD_VISIT_BASE_INTEGRAL_TYPES
(
PD_VISIT_BASE_INTEGRAL_TYPES
(
x
.
indices
().
dtype
(),
"CooToCsrCPUKernel"
,
([
&
]
{
x
.
indices
().
dtype
(),
"SparseCooToCsrCPUKernel"
,
([
&
]
{
CooToCsrCPUKernel
<
T
,
data_t
>
(
dev_ctx
,
x
,
out
);
SparseCooToCsrCPUKernel
<
T
,
data_t
>
(
dev_ctx
,
x
,
out
);
}));
}));
}
}
template
<
typename
T
,
typename
IntT
>
template
<
typename
T
,
typename
IntT
>
void
Sparse
CooToDenseCPUKernel
(
const
CPUContext
&
dev_ctx
,
void
CooToDenseCPUKernel
(
const
CPUContext
&
dev_ctx
,
const
SparseCooTensor
&
x
,
const
SparseCooTensor
&
x
,
DenseTensor
*
out
)
{
DenseTensor
*
out
)
{
const
auto
non_zero_num
=
x
.
nnz
();
const
auto
non_zero_num
=
x
.
nnz
();
const
auto
dense_dims
=
x
.
dims
();
const
auto
dense_dims
=
x
.
dims
();
const
auto
indices
=
x
.
indices
();
const
auto
indices
=
x
.
indices
();
...
@@ -300,22 +298,22 @@ void SparseCooToDenseCPUKernel(const CPUContext& dev_ctx,
...
@@ -300,22 +298,22 @@ void SparseCooToDenseCPUKernel(const CPUContext& dev_ctx,
}
}
template
<
typename
T
,
typename
Context
>
template
<
typename
T
,
typename
Context
>
void
Sparse
CooToDenseKernel
(
const
Context
&
dev_ctx
,
void
CooToDenseKernel
(
const
Context
&
dev_ctx
,
const
SparseCooTensor
&
x
,
const
SparseCooTensor
&
x
,
DenseTensor
*
out
)
{
DenseTensor
*
out
)
{
PD_VISIT_BASE_INTEGRAL_TYPES
(
PD_VISIT_BASE_INTEGRAL_TYPES
(
x
.
indices
().
dtype
(),
"
Sparse
CooToDenseCPUKernel"
,
([
&
]
{
x
.
indices
().
dtype
(),
"CooToDenseCPUKernel"
,
([
&
]
{
Sparse
CooToDenseCPUKernel
<
T
,
data_t
>
(
dev_ctx
,
x
,
out
);
CooToDenseCPUKernel
<
T
,
data_t
>
(
dev_ctx
,
x
,
out
);
}));
}));
}
}
}
// namespace sparse
}
// namespace sparse
}
// namespace phi
}
// namespace phi
PD_REGISTER_KERNEL
(
dense_to_
sparse_
coo
,
PD_REGISTER_KERNEL
(
dense_to_coo
,
CPU
,
CPU
,
ALL_LAYOUT
,
ALL_LAYOUT
,
phi
::
sparse
::
DenseTo
Sparse
CooKernel
,
phi
::
sparse
::
DenseToCooKernel
,
float
,
float
,
double
,
double
,
paddle
::
float16
,
paddle
::
float16
,
...
@@ -325,10 +323,10 @@ PD_REGISTER_KERNEL(dense_to_sparse_coo,
...
@@ -325,10 +323,10 @@ PD_REGISTER_KERNEL(dense_to_sparse_coo,
int
,
int
,
int64_t
)
{}
int64_t
)
{}
PD_REGISTER_KERNEL
(
sparse_
csr_to_coo
,
PD_REGISTER_KERNEL
(
csr_to_coo
,
CPU
,
CPU
,
ALL_LAYOUT
,
ALL_LAYOUT
,
phi
::
sparse
::
Sparse
CsrToCooKernel
,
phi
::
sparse
::
CsrToCooKernel
,
float
,
float
,
double
,
double
,
paddle
::
float16
,
paddle
::
float16
,
...
@@ -338,10 +336,10 @@ PD_REGISTER_KERNEL(sparse_csr_to_coo,
...
@@ -338,10 +336,10 @@ PD_REGISTER_KERNEL(sparse_csr_to_coo,
int
,
int
,
int64_t
)
{}
int64_t
)
{}
PD_REGISTER_KERNEL
(
sparse_
coo_to_csr
,
PD_REGISTER_KERNEL
(
coo_to_csr
,
CPU
,
CPU
,
ALL_LAYOUT
,
ALL_LAYOUT
,
phi
::
sparse
::
Sparse
CooToCsrKernel
,
phi
::
sparse
::
CooToCsrKernel
,
float
,
float
,
double
,
double
,
phi
::
dtype
::
float16
,
phi
::
dtype
::
float16
,
...
@@ -351,10 +349,10 @@ PD_REGISTER_KERNEL(sparse_coo_to_csr,
...
@@ -351,10 +349,10 @@ PD_REGISTER_KERNEL(sparse_coo_to_csr,
int
,
int
,
int64_t
)
{}
int64_t
)
{}
PD_REGISTER_KERNEL
(
dense_to_
sparse_
csr
,
PD_REGISTER_KERNEL
(
dense_to_csr
,
CPU
,
CPU
,
ALL_LAYOUT
,
ALL_LAYOUT
,
phi
::
sparse
::
DenseTo
Sparse
CsrKernel
,
phi
::
sparse
::
DenseToCsrKernel
,
float
,
float
,
double
,
double
,
phi
::
dtype
::
float16
,
phi
::
dtype
::
float16
,
...
@@ -364,10 +362,10 @@ PD_REGISTER_KERNEL(dense_to_sparse_csr,
...
@@ -364,10 +362,10 @@ PD_REGISTER_KERNEL(dense_to_sparse_csr,
int
,
int
,
int64_t
)
{}
int64_t
)
{}
PD_REGISTER_KERNEL
(
sparse_
coo_to_dense
,
PD_REGISTER_KERNEL
(
coo_to_dense
,
CPU
,
CPU
,
ALL_LAYOUT
,
ALL_LAYOUT
,
phi
::
sparse
::
Sparse
CooToDenseKernel
,
phi
::
sparse
::
CooToDenseKernel
,
float
,
float
,
double
,
double
,
phi
::
dtype
::
float16
,
phi
::
dtype
::
float16
,
...
@@ -377,10 +375,10 @@ PD_REGISTER_KERNEL(sparse_coo_to_dense,
...
@@ -377,10 +375,10 @@ PD_REGISTER_KERNEL(sparse_coo_to_dense,
int
,
int
,
int64_t
)
{}
int64_t
)
{}
PD_REGISTER_KERNEL
(
sparse_
csr_to_dense
,
PD_REGISTER_KERNEL
(
csr_to_dense
,
CPU
,
CPU
,
ALL_LAYOUT
,
ALL_LAYOUT
,
phi
::
sparse
::
Sparse
CsrToDenseKernel
,
phi
::
sparse
::
CsrToDenseKernel
,
float
,
float
,
double
,
double
,
phi
::
dtype
::
float16
,
phi
::
dtype
::
float16
,
...
@@ -390,10 +388,10 @@ PD_REGISTER_KERNEL(sparse_csr_to_dense,
...
@@ -390,10 +388,10 @@ PD_REGISTER_KERNEL(sparse_csr_to_dense,
int
,
int
,
int64_t
)
{}
int64_t
)
{}
PD_REGISTER_KERNEL
(
coo_values
,
PD_REGISTER_KERNEL
(
values_coo
,
CPU
,
CPU
,
ALL_LAYOUT
,
ALL_LAYOUT
,
phi
::
sparse
::
CooValues
Kernel
,
phi
::
sparse
::
ValuesCoo
Kernel
,
float
,
float
,
double
,
double
,
phi
::
dtype
::
float16
,
phi
::
dtype
::
float16
,
...
@@ -405,10 +403,10 @@ PD_REGISTER_KERNEL(coo_values,
...
@@ -405,10 +403,10 @@ PD_REGISTER_KERNEL(coo_values,
kernel
->
InputAt
(
0
).
SetDataLayout
(
phi
::
DataLayout
::
SPARSE_COO
);
kernel
->
InputAt
(
0
).
SetDataLayout
(
phi
::
DataLayout
::
SPARSE_COO
);
}
}
PD_REGISTER_KERNEL
(
csr_values
,
PD_REGISTER_KERNEL
(
values_csr
,
CPU
,
CPU
,
ALL_LAYOUT
,
ALL_LAYOUT
,
phi
::
sparse
::
CsrValues
Kernel
,
phi
::
sparse
::
ValuesCsr
Kernel
,
float
,
float
,
double
,
double
,
phi
::
dtype
::
float16
,
phi
::
dtype
::
float16
,
...
...
paddle/phi/kernels/sparse/gpu/matmul_grad_kernel.cu
浏览文件 @
36739748
...
@@ -43,10 +43,10 @@ void MatmulCooDenseGradKernel(const Context& dev_ctx,
...
@@ -43,10 +43,10 @@ void MatmulCooDenseGradKernel(const Context& dev_ctx,
// 'cusparseSDDMM' only support CSR now, so use COO->CSR->COO,
// 'cusparseSDDMM' only support CSR now, so use COO->CSR->COO,
// which will increase some expenses.
// which will increase some expenses.
EmptyLikeCooKernel
<
T
,
Context
>
(
dev_ctx
,
x
,
dx
);
EmptyLikeCooKernel
<
T
,
Context
>
(
dev_ctx
,
x
,
dx
);
SparseCsrTensor
dx_csr
=
Sparse
CooToCsr
<
T
,
Context
>
(
dev_ctx
,
*
dx
);
SparseCsrTensor
dx_csr
=
CooToCsr
<
T
,
Context
>
(
dev_ctx
,
*
dx
);
sparse_blas
.
SDDMM
(
sparse_blas
.
SDDMM
(
false
,
true
,
static_cast
<
T
>
(
1
),
dout
,
y
,
static_cast
<
T
>
(
0
),
&
dx_csr
);
false
,
true
,
static_cast
<
T
>
(
1
),
dout
,
y
,
static_cast
<
T
>
(
0
),
&
dx_csr
);
Sparse
CsrToCooKernel
<
T
,
Context
>
(
dev_ctx
,
dx_csr
,
dx
);
CsrToCooKernel
<
T
,
Context
>
(
dev_ctx
,
dx_csr
,
dx
);
}
}
// dy{Dense} = x'{SparseCoo} * dout{Dense}
// dy{Dense} = x'{SparseCoo} * dout{Dense}
...
...
paddle/phi/kernels/sparse/gpu/sparse_utils_kernel.cu
浏览文件 @
36739748
...
@@ -93,10 +93,10 @@ __global__ void GetNonZeroElementsAndIndices(const T* dense_data,
...
@@ -93,10 +93,10 @@ __global__ void GetNonZeroElementsAndIndices(const T* dense_data,
}
}
template
<
typename
T
,
typename
Context
>
template
<
typename
T
,
typename
Context
>
void
DenseTo
Sparse
CooKernel
(
const
Context
&
dev_ctx
,
void
DenseToCooKernel
(
const
Context
&
dev_ctx
,
const
DenseTensor
&
x
,
const
DenseTensor
&
x
,
const
int64_t
sparse_dim
,
const
int64_t
sparse_dim
,
SparseCooTensor
*
out
)
{
SparseCooTensor
*
out
)
{
const
T
*
x_data
=
x
.
data
<
T
>
();
const
T
*
x_data
=
x
.
data
<
T
>
();
const
auto
&
x_dims
=
x
.
dims
();
const
auto
&
x_dims
=
x
.
dims
();
PADDLE_ENFORCE_LE
(
sparse_dim
,
PADDLE_ENFORCE_LE
(
sparse_dim
,
...
@@ -208,9 +208,9 @@ __global__ void ConvertCsrCrowsToCooRows(const IntT* crows_ptr,
...
@@ -208,9 +208,9 @@ __global__ void ConvertCsrCrowsToCooRows(const IntT* crows_ptr,
}
}
template
<
typename
T
,
typename
IntT
>
template
<
typename
T
,
typename
IntT
>
void
Sparse
CsrToCooGPUKernel
(
const
GPUContext
&
dev_ctx
,
void
CsrToCooGPUKernel
(
const
GPUContext
&
dev_ctx
,
const
SparseCsrTensor
&
x
,
const
SparseCsrTensor
&
x
,
SparseCooTensor
*
out
)
{
SparseCooTensor
*
out
)
{
const
DDim
&
x_dims
=
x
.
dims
();
const
DDim
&
x_dims
=
x
.
dims
();
const
int64_t
non_zero_num
=
x
.
cols
().
numel
();
const
int64_t
non_zero_num
=
x
.
cols
().
numel
();
const
auto
&
csr_crows
=
x
.
crows
();
const
auto
&
csr_crows
=
x
.
crows
();
...
@@ -274,13 +274,12 @@ void SparseCsrToCooGPUKernel(const GPUContext& dev_ctx,
...
@@ -274,13 +274,12 @@ void SparseCsrToCooGPUKernel(const GPUContext& dev_ctx,
}
}
template
<
typename
T
,
typename
Context
>
template
<
typename
T
,
typename
Context
>
void
SparseCsrToCooKernel
(
const
Context
&
dev_ctx
,
void
CsrToCooKernel
(
const
Context
&
dev_ctx
,
const
SparseCsrTensor
&
x
,
const
SparseCsrTensor
&
x
,
SparseCooTensor
*
out
)
{
SparseCooTensor
*
out
)
{
PD_VISIT_BASE_INTEGRAL_TYPES
(
PD_VISIT_BASE_INTEGRAL_TYPES
(
x
.
crows
().
dtype
(),
"CsrToCooGPUKernel"
,
([
&
]
{
x
.
crows
().
dtype
(),
"SparseCsrToCooGPUKernel"
,
([
&
]
{
CsrToCooGPUKernel
<
T
,
data_t
>
(
dev_ctx
,
x
,
out
);
SparseCsrToCooGPUKernel
<
T
,
data_t
>
(
dev_ctx
,
x
,
out
);
}));
}));
}
}
template
<
typename
IntT
>
template
<
typename
IntT
>
...
@@ -343,9 +342,9 @@ __global__ void ConvertCooRowsToCsrCrows(
...
@@ -343,9 +342,9 @@ __global__ void ConvertCooRowsToCsrCrows(
}
}
template
<
typename
T
,
typename
IntT
>
template
<
typename
T
,
typename
IntT
>
void
Sparse
CooToCsrGPUKernel
(
const
GPUContext
&
dev_ctx
,
void
CooToCsrGPUKernel
(
const
GPUContext
&
dev_ctx
,
const
SparseCooTensor
&
x
,
const
SparseCooTensor
&
x
,
SparseCsrTensor
*
out
)
{
SparseCsrTensor
*
out
)
{
const
auto
&
x_dims
=
x
.
dims
();
const
auto
&
x_dims
=
x
.
dims
();
bool
valid
=
x_dims
.
size
()
==
2
||
x_dims
.
size
()
==
3
;
bool
valid
=
x_dims
.
size
()
==
2
||
x_dims
.
size
()
==
3
;
PADDLE_ENFORCE_EQ
(
valid
,
PADDLE_ENFORCE_EQ
(
valid
,
...
@@ -416,23 +415,22 @@ void SparseCooToCsrGPUKernel(const GPUContext& dev_ctx,
...
@@ -416,23 +415,22 @@ void SparseCooToCsrGPUKernel(const GPUContext& dev_ctx,
}
}
template
<
typename
T
,
typename
Context
>
template
<
typename
T
,
typename
Context
>
void
SparseCooToCsrKernel
(
const
Context
&
dev_ctx
,
void
CooToCsrKernel
(
const
Context
&
dev_ctx
,
const
SparseCooTensor
&
x
,
const
SparseCooTensor
&
x
,
SparseCsrTensor
*
out
)
{
SparseCsrTensor
*
out
)
{
PD_VISIT_BASE_INTEGRAL_TYPES
(
PD_VISIT_BASE_INTEGRAL_TYPES
(
x
.
indices
().
dtype
(),
"CooToCsrGPUKernel"
,
([
&
]
{
x
.
indices
().
dtype
(),
"SparseCooToCsrGPUKernel"
,
([
&
]
{
CooToCsrGPUKernel
<
T
,
data_t
>
(
dev_ctx
,
x
,
out
);
SparseCooToCsrGPUKernel
<
T
,
data_t
>
(
dev_ctx
,
x
,
out
);
}));
}));
}
}
template
<
typename
ValueT
,
typename
IndicesT
>
template
<
typename
ValueT
,
typename
IndicesT
>
__global__
void
Kernel
Sparse
CooToDense
(
const
IndicesT
*
indices
,
__global__
void
KernelCooToDense
(
const
IndicesT
*
indices
,
const
int64_t
*
sparse_offsets
,
const
int64_t
*
sparse_offsets
,
const
ValueT
*
data
,
const
ValueT
*
data
,
ValueT
*
dense_data
,
ValueT
*
dense_data
,
const
IndicesT
non_zero_num
,
const
IndicesT
non_zero_num
,
const
int64_t
base_offset
,
const
int64_t
base_offset
,
const
int64_t
sparse_dim
)
{
const
int64_t
sparse_dim
)
{
int
tid
=
threadIdx
.
x
+
blockIdx
.
x
*
blockDim
.
x
;
int
tid
=
threadIdx
.
x
+
blockIdx
.
x
*
blockDim
.
x
;
for
(
int
i
=
tid
;
i
<
non_zero_num
;
i
+=
gridDim
.
x
*
blockDim
.
x
)
{
for
(
int
i
=
tid
;
i
<
non_zero_num
;
i
+=
gridDim
.
x
*
blockDim
.
x
)
{
int64_t
index
=
0
;
int64_t
index
=
0
;
...
@@ -447,9 +445,9 @@ __global__ void KernelSparseCooToDense(const IndicesT* indices,
...
@@ -447,9 +445,9 @@ __global__ void KernelSparseCooToDense(const IndicesT* indices,
}
}
template
<
typename
T
,
typename
IntT
>
template
<
typename
T
,
typename
IntT
>
void
Sparse
CooToDenseGPUKernel
(
const
GPUContext
&
dev_ctx
,
void
CooToDenseGPUKernel
(
const
GPUContext
&
dev_ctx
,
const
SparseCooTensor
&
x
,
const
SparseCooTensor
&
x
,
DenseTensor
*
out
)
{
DenseTensor
*
out
)
{
const
auto
non_zero_num
=
x
.
nnz
();
const
auto
non_zero_num
=
x
.
nnz
();
const
auto
dense_dims
=
x
.
dims
();
const
auto
dense_dims
=
x
.
dims
();
const
auto
indices
=
x
.
indices
();
const
auto
indices
=
x
.
indices
();
...
@@ -490,7 +488,7 @@ void SparseCooToDenseGPUKernel(const GPUContext& dev_ctx,
...
@@ -490,7 +488,7 @@ void SparseCooToDenseGPUKernel(const GPUContext& dev_ctx,
auto
config
=
auto
config
=
phi
::
backends
::
gpu
::
GetGpuLaunchConfig1D
(
dev_ctx
,
non_zero_num
,
1
);
phi
::
backends
::
gpu
::
GetGpuLaunchConfig1D
(
dev_ctx
,
non_zero_num
,
1
);
Kernel
Sparse
CooToDense
<
T
,
IntT
>
KernelCooToDense
<
T
,
IntT
>
<<<
config
.
block_per_grid
.
x
,
<<<
config
.
block_per_grid
.
x
,
config
.
thread_per_block
.
x
,
config
.
thread_per_block
.
x
,
0
,
0
,
...
@@ -504,22 +502,22 @@ void SparseCooToDenseGPUKernel(const GPUContext& dev_ctx,
...
@@ -504,22 +502,22 @@ void SparseCooToDenseGPUKernel(const GPUContext& dev_ctx,
}
}
template
<
typename
T
,
typename
Context
>
template
<
typename
T
,
typename
Context
>
void
Sparse
CooToDenseKernel
(
const
Context
&
dev_ctx
,
void
CooToDenseKernel
(
const
Context
&
dev_ctx
,
const
SparseCooTensor
&
x
,
const
SparseCooTensor
&
x
,
DenseTensor
*
out
)
{
DenseTensor
*
out
)
{
PD_VISIT_BASE_INTEGRAL_TYPES
(
PD_VISIT_BASE_INTEGRAL_TYPES
(
x
.
indices
().
dtype
(),
"
Sparse
CooToDenseGPUKernel"
,
([
&
]
{
x
.
indices
().
dtype
(),
"CooToDenseGPUKernel"
,
([
&
]
{
Sparse
CooToDenseGPUKernel
<
T
,
data_t
>
(
dev_ctx
,
x
,
out
);
CooToDenseGPUKernel
<
T
,
data_t
>
(
dev_ctx
,
x
,
out
);
}));
}));
}
}
}
// namespace sparse
}
// namespace sparse
}
// namespace phi
}
// namespace phi
PD_REGISTER_KERNEL
(
dense_to_
sparse_
coo
,
PD_REGISTER_KERNEL
(
dense_to_coo
,
GPU
,
GPU
,
ALL_LAYOUT
,
ALL_LAYOUT
,
phi
::
sparse
::
DenseTo
Sparse
CooKernel
,
phi
::
sparse
::
DenseToCooKernel
,
float
,
float
,
double
,
double
,
phi
::
dtype
::
float16
,
phi
::
dtype
::
float16
,
...
@@ -529,10 +527,10 @@ PD_REGISTER_KERNEL(dense_to_sparse_coo,
...
@@ -529,10 +527,10 @@ PD_REGISTER_KERNEL(dense_to_sparse_coo,
int
,
int
,
int64_t
)
{}
int64_t
)
{}
PD_REGISTER_KERNEL
(
sparse_
csr_to_coo
,
PD_REGISTER_KERNEL
(
csr_to_coo
,
GPU
,
GPU
,
ALL_LAYOUT
,
ALL_LAYOUT
,
phi
::
sparse
::
Sparse
CsrToCooKernel
,
phi
::
sparse
::
CsrToCooKernel
,
float
,
float
,
double
,
double
,
phi
::
dtype
::
float16
,
phi
::
dtype
::
float16
,
...
@@ -542,10 +540,10 @@ PD_REGISTER_KERNEL(sparse_csr_to_coo,
...
@@ -542,10 +540,10 @@ PD_REGISTER_KERNEL(sparse_csr_to_coo,
int
,
int
,
int64_t
)
{}
int64_t
)
{}
PD_REGISTER_KERNEL
(
sparse_
coo_to_csr
,
PD_REGISTER_KERNEL
(
coo_to_csr
,
GPU
,
GPU
,
ALL_LAYOUT
,
ALL_LAYOUT
,
phi
::
sparse
::
Sparse
CooToCsrKernel
,
phi
::
sparse
::
CooToCsrKernel
,
float
,
float
,
double
,
double
,
phi
::
dtype
::
float16
,
phi
::
dtype
::
float16
,
...
@@ -555,10 +553,10 @@ PD_REGISTER_KERNEL(sparse_coo_to_csr,
...
@@ -555,10 +553,10 @@ PD_REGISTER_KERNEL(sparse_coo_to_csr,
int
,
int
,
int64_t
)
{}
int64_t
)
{}
PD_REGISTER_KERNEL
(
dense_to_
sparse_
csr
,
PD_REGISTER_KERNEL
(
dense_to_csr
,
GPU
,
GPU
,
ALL_LAYOUT
,
ALL_LAYOUT
,
phi
::
sparse
::
DenseTo
Sparse
CsrKernel
,
phi
::
sparse
::
DenseToCsrKernel
,
float
,
float
,
double
,
double
,
phi
::
dtype
::
float16
,
phi
::
dtype
::
float16
,
...
@@ -568,10 +566,10 @@ PD_REGISTER_KERNEL(dense_to_sparse_csr,
...
@@ -568,10 +566,10 @@ PD_REGISTER_KERNEL(dense_to_sparse_csr,
int
,
int
,
int64_t
)
{}
int64_t
)
{}
PD_REGISTER_KERNEL
(
sparse_
coo_to_dense
,
PD_REGISTER_KERNEL
(
coo_to_dense
,
GPU
,
GPU
,
ALL_LAYOUT
,
ALL_LAYOUT
,
phi
::
sparse
::
Sparse
CooToDenseKernel
,
phi
::
sparse
::
CooToDenseKernel
,
float
,
float
,
double
,
double
,
phi
::
dtype
::
float16
,
phi
::
dtype
::
float16
,
...
@@ -581,10 +579,10 @@ PD_REGISTER_KERNEL(sparse_coo_to_dense,
...
@@ -581,10 +579,10 @@ PD_REGISTER_KERNEL(sparse_coo_to_dense,
int
,
int
,
int64_t
)
{}
int64_t
)
{}
PD_REGISTER_KERNEL
(
sparse_
csr_to_dense
,
PD_REGISTER_KERNEL
(
csr_to_dense
,
GPU
,
GPU
,
ALL_LAYOUT
,
ALL_LAYOUT
,
phi
::
sparse
::
Sparse
CsrToDenseKernel
,
phi
::
sparse
::
CsrToDenseKernel
,
float
,
float
,
double
,
double
,
phi
::
dtype
::
float16
,
phi
::
dtype
::
float16
,
...
@@ -594,10 +592,10 @@ PD_REGISTER_KERNEL(sparse_csr_to_dense,
...
@@ -594,10 +592,10 @@ PD_REGISTER_KERNEL(sparse_csr_to_dense,
int
,
int
,
int64_t
)
{}
int64_t
)
{}
PD_REGISTER_KERNEL
(
coo_values
,
PD_REGISTER_KERNEL
(
values_coo
,
GPU
,
GPU
,
ALL_LAYOUT
,
ALL_LAYOUT
,
phi
::
sparse
::
CooValues
Kernel
,
phi
::
sparse
::
ValuesCoo
Kernel
,
float
,
float
,
double
,
double
,
phi
::
dtype
::
float16
,
phi
::
dtype
::
float16
,
...
@@ -609,10 +607,10 @@ PD_REGISTER_KERNEL(coo_values,
...
@@ -609,10 +607,10 @@ PD_REGISTER_KERNEL(coo_values,
kernel
->
InputAt
(
0
).
SetDataLayout
(
phi
::
DataLayout
::
SPARSE_COO
);
kernel
->
InputAt
(
0
).
SetDataLayout
(
phi
::
DataLayout
::
SPARSE_COO
);
}
}
PD_REGISTER_KERNEL
(
csr_values
,
PD_REGISTER_KERNEL
(
values_csr
,
GPU
,
GPU
,
ALL_LAYOUT
,
ALL_LAYOUT
,
phi
::
sparse
::
CsrValues
Kernel
,
phi
::
sparse
::
ValuesCsr
Kernel
,
float
,
float
,
double
,
double
,
phi
::
dtype
::
float16
,
phi
::
dtype
::
float16
,
...
...
paddle/phi/kernels/sparse/sparse_utils_grad_kernel.cc
浏览文件 @
36739748
...
@@ -20,7 +20,7 @@ namespace phi {
...
@@ -20,7 +20,7 @@ namespace phi {
namespace
sparse
{
namespace
sparse
{
template
<
typename
T
,
typename
Context
>
template
<
typename
T
,
typename
Context
>
void
CooValues
GradKernel
(
const
Context
&
dev_ctx
,
void
ValuesCoo
GradKernel
(
const
Context
&
dev_ctx
,
const
SparseCooTensor
&
x
,
const
SparseCooTensor
&
x
,
const
DenseTensor
&
out_grad
,
const
DenseTensor
&
out_grad
,
SparseCooTensor
*
x_grad
)
{
SparseCooTensor
*
x_grad
)
{
...
@@ -28,20 +28,20 @@ void CooValuesGradKernel(const Context& dev_ctx,
...
@@ -28,20 +28,20 @@ void CooValuesGradKernel(const Context& dev_ctx,
}
}
template
<
typename
T
,
typename
Context
>
template
<
typename
T
,
typename
Context
>
void
Sparse
CooToDenseGradKernel
(
const
Context
&
dev_ctx
,
void
CooToDenseGradKernel
(
const
Context
&
dev_ctx
,
const
SparseCooTensor
&
x
,
const
SparseCooTensor
&
x
,
const
DenseTensor
&
out_grad
,
const
DenseTensor
&
out_grad
,
SparseCooTensor
*
x_grad
)
{
SparseCooTensor
*
x_grad
)
{
SparseMaskKernel
<
T
,
Context
>
(
dev_ctx
,
out_grad
,
x
,
x_grad
);
SparseMaskKernel
<
T
,
Context
>
(
dev_ctx
,
out_grad
,
x
,
x_grad
);
}
}
}
// namespace sparse
}
// namespace sparse
}
// namespace phi
}
// namespace phi
PD_REGISTER_KERNEL
(
coo_values
_grad
,
PD_REGISTER_KERNEL
(
values_coo
_grad
,
CPU
,
CPU
,
ALL_LAYOUT
,
ALL_LAYOUT
,
phi
::
sparse
::
CooValues
GradKernel
,
phi
::
sparse
::
ValuesCoo
GradKernel
,
float
,
float
,
double
,
double
,
uint8_t
,
uint8_t
,
...
@@ -52,10 +52,10 @@ PD_REGISTER_KERNEL(coo_values_grad,
...
@@ -52,10 +52,10 @@ PD_REGISTER_KERNEL(coo_values_grad,
kernel
->
InputAt
(
0
).
SetDataLayout
(
phi
::
DataLayout
::
SPARSE_COO
);
kernel
->
InputAt
(
0
).
SetDataLayout
(
phi
::
DataLayout
::
SPARSE_COO
);
}
}
PD_REGISTER_KERNEL
(
sparse_
coo_to_dense_grad
,
PD_REGISTER_KERNEL
(
coo_to_dense_grad
,
CPU
,
CPU
,
ALL_LAYOUT
,
ALL_LAYOUT
,
phi
::
sparse
::
Sparse
CooToDenseGradKernel
,
phi
::
sparse
::
CooToDenseGradKernel
,
float
,
float
,
double
,
double
,
uint8_t
,
uint8_t
,
...
@@ -80,10 +80,10 @@ PD_REGISTER_KERNEL(sparse_coo_tensor_grad,
...
@@ -80,10 +80,10 @@ PD_REGISTER_KERNEL(sparse_coo_tensor_grad,
}
}
#if defined(PADDLE_WITH_CUDA) || defined(PADDLE_WITH_HIP)
#if defined(PADDLE_WITH_CUDA) || defined(PADDLE_WITH_HIP)
PD_REGISTER_KERNEL
(
coo_values
_grad
,
PD_REGISTER_KERNEL
(
values_coo
_grad
,
GPU
,
GPU
,
ALL_LAYOUT
,
ALL_LAYOUT
,
phi
::
sparse
::
CooValues
GradKernel
,
phi
::
sparse
::
ValuesCoo
GradKernel
,
float
,
float
,
double
,
double
,
phi
::
dtype
::
float16
,
phi
::
dtype
::
float16
,
...
@@ -94,10 +94,10 @@ PD_REGISTER_KERNEL(coo_values_grad,
...
@@ -94,10 +94,10 @@ PD_REGISTER_KERNEL(coo_values_grad,
int64_t
)
{
int64_t
)
{
kernel
->
InputAt
(
0
).
SetDataLayout
(
phi
::
DataLayout
::
SPARSE_COO
);
kernel
->
InputAt
(
0
).
SetDataLayout
(
phi
::
DataLayout
::
SPARSE_COO
);
}
}
PD_REGISTER_KERNEL
(
sparse_
coo_to_dense_grad
,
PD_REGISTER_KERNEL
(
coo_to_dense_grad
,
GPU
,
GPU
,
ALL_LAYOUT
,
ALL_LAYOUT
,
phi
::
sparse
::
Sparse
CooToDenseGradKernel
,
phi
::
sparse
::
CooToDenseGradKernel
,
float
,
float
,
double
,
double
,
phi
::
dtype
::
float16
,
phi
::
dtype
::
float16
,
...
...
paddle/phi/kernels/sparse/sparse_utils_grad_kernel.h
浏览文件 @
36739748
...
@@ -22,16 +22,16 @@ namespace phi {
...
@@ -22,16 +22,16 @@ namespace phi {
namespace
sparse
{
namespace
sparse
{
template
<
typename
T
,
typename
Context
>
template
<
typename
T
,
typename
Context
>
void
CooValues
GradKernel
(
const
Context
&
dev_ctx
,
void
ValuesCoo
GradKernel
(
const
Context
&
dev_ctx
,
const
SparseCooTensor
&
x
,
const
SparseCooTensor
&
x
,
const
DenseTensor
&
out_grad
,
const
DenseTensor
&
out_grad
,
SparseCooTensor
*
x_grad
);
SparseCooTensor
*
x_grad
);
template
<
typename
T
,
typename
Context
>
template
<
typename
T
,
typename
Context
>
void
Sparse
CooToDenseGradKernel
(
const
Context
&
dev_ctx
,
void
CooToDenseGradKernel
(
const
Context
&
dev_ctx
,
const
SparseCooTensor
&
x
,
const
SparseCooTensor
&
x
,
const
DenseTensor
&
out_grad
,
const
DenseTensor
&
out_grad
,
SparseCooTensor
*
x_grad
);
SparseCooTensor
*
x_grad
);
template
<
typename
T
,
typename
Context
>
template
<
typename
T
,
typename
Context
>
void
SparseCooTensorGradKernel
(
const
Context
&
dev_ctx
,
void
SparseCooTensorGradKernel
(
const
Context
&
dev_ctx
,
...
...
paddle/phi/kernels/sparse/sparse_utils_kernel.h
浏览文件 @
36739748
...
@@ -24,57 +24,55 @@ namespace phi {
...
@@ -24,57 +24,55 @@ namespace phi {
namespace
sparse
{
namespace
sparse
{
template
<
typename
T
,
typename
Context
>
template
<
typename
T
,
typename
Context
>
void
DenseTo
Sparse
CooKernel
(
const
Context
&
dev_ctx
,
void
DenseToCooKernel
(
const
Context
&
dev_ctx
,
const
DenseTensor
&
x
,
const
DenseTensor
&
x
,
const
int64_t
sparse_dim
,
const
int64_t
sparse_dim
,
SparseCooTensor
*
out
);
SparseCooTensor
*
out
);
template
<
typename
T
,
typename
Context
>
template
<
typename
T
,
typename
Context
>
SparseCooTensor
DenseTo
Sparse
Coo
(
const
Context
&
dev_ctx
,
SparseCooTensor
DenseToCoo
(
const
Context
&
dev_ctx
,
const
DenseTensor
&
x
,
const
DenseTensor
&
x
,
const
int64_t
sparse_dim
)
{
const
int64_t
sparse_dim
)
{
DenseTensor
indices
;
DenseTensor
indices
;
DenseTensor
values
;
DenseTensor
values
;
SparseCooTensor
coo
(
indices
,
values
,
x
.
dims
());
SparseCooTensor
coo
(
indices
,
values
,
x
.
dims
());
DenseTo
Sparse
CooKernel
<
T
,
Context
>
(
dev_ctx
,
x
,
sparse_dim
,
&
coo
);
DenseToCooKernel
<
T
,
Context
>
(
dev_ctx
,
x
,
sparse_dim
,
&
coo
);
return
coo
;
return
coo
;
}
}
template
<
typename
T
,
typename
Context
>
template
<
typename
T
,
typename
Context
>
void
Sparse
CsrToCooKernel
(
const
Context
&
dev_ctx
,
void
CsrToCooKernel
(
const
Context
&
dev_ctx
,
const
SparseCsrTensor
&
x
,
const
SparseCsrTensor
&
x
,
SparseCooTensor
*
out
);
SparseCooTensor
*
out
);
template
<
typename
T
,
typename
Context
>
template
<
typename
T
,
typename
Context
>
SparseCooTensor
SparseCsrToCoo
(
const
Context
&
dev_ctx
,
SparseCooTensor
CsrToCoo
(
const
Context
&
dev_ctx
,
const
SparseCsrTensor
&
x
)
{
const
SparseCsrTensor
&
x
)
{
DenseTensor
indices
;
DenseTensor
indices
;
DenseTensor
values
;
DenseTensor
values
;
SparseCooTensor
coo
(
indices
,
values
,
x
.
dims
());
SparseCooTensor
coo
(
indices
,
values
,
x
.
dims
());
Sparse
CsrToCooKernel
<
T
,
Context
>
(
dev_ctx
,
x
,
&
coo
);
CsrToCooKernel
<
T
,
Context
>
(
dev_ctx
,
x
,
&
coo
);
return
coo
;
return
coo
;
}
}
template
<
typename
T
,
typename
Context
>
template
<
typename
T
,
typename
Context
>
void
Sparse
CooToCsrKernel
(
const
Context
&
dev_ctx
,
void
CooToCsrKernel
(
const
Context
&
dev_ctx
,
const
SparseCooTensor
&
x
,
const
SparseCooTensor
&
x
,
SparseCsrTensor
*
out
);
SparseCsrTensor
*
out
);
template
<
typename
T
,
typename
Context
>
template
<
typename
T
,
typename
Context
>
SparseCsrTensor
SparseCooToCsr
(
const
Context
&
dev_ctx
,
SparseCsrTensor
CooToCsr
(
const
Context
&
dev_ctx
,
const
SparseCooTensor
&
x
)
{
const
SparseCooTensor
&
x
)
{
DenseTensor
crows
;
DenseTensor
crows
;
DenseTensor
cols
;
DenseTensor
cols
;
DenseTensor
non_zero_elements
;
DenseTensor
non_zero_elements
;
SparseCsrTensor
csr
(
crows
,
cols
,
non_zero_elements
,
x
.
dims
());
SparseCsrTensor
csr
(
crows
,
cols
,
non_zero_elements
,
x
.
dims
());
Sparse
CooToCsrKernel
<
T
,
Context
>
(
dev_ctx
,
x
,
&
csr
);
CooToCsrKernel
<
T
,
Context
>
(
dev_ctx
,
x
,
&
csr
);
return
csr
;
return
csr
;
}
}
template
<
typename
T
,
typename
Context
>
template
<
typename
T
,
typename
Context
>
void
DenseTo
Sparse
CsrKernel
(
const
Context
&
dev_ctx
,
void
DenseToCsrKernel
(
const
Context
&
dev_ctx
,
const
DenseTensor
&
x
,
const
DenseTensor
&
x
,
SparseCsrTensor
*
out
)
{
SparseCsrTensor
*
out
)
{
const
auto
&
x_dims
=
x
.
dims
();
const
auto
&
x_dims
=
x
.
dims
();
bool
valid
=
x_dims
.
size
()
==
2
||
x_dims
.
size
()
==
3
;
bool
valid
=
x_dims
.
size
()
==
2
||
x_dims
.
size
()
==
3
;
PADDLE_ENFORCE_EQ
(
valid
,
PADDLE_ENFORCE_EQ
(
valid
,
...
@@ -85,61 +83,61 @@ void DenseToSparseCsrKernel(const Context& dev_ctx,
...
@@ -85,61 +83,61 @@ void DenseToSparseCsrKernel(const Context& dev_ctx,
DenseTensor
indices
;
DenseTensor
indices
;
DenseTensor
values
;
DenseTensor
values
;
SparseCooTensor
coo
(
indices
,
values
,
x
.
dims
());
SparseCooTensor
coo
(
indices
,
values
,
x
.
dims
());
DenseTo
Sparse
CooKernel
<
T
,
Context
>
(
dev_ctx
,
x
,
sparse_dim
,
&
coo
);
DenseToCooKernel
<
T
,
Context
>
(
dev_ctx
,
x
,
sparse_dim
,
&
coo
);
Sparse
CooToCsrKernel
<
T
,
Context
>
(
dev_ctx
,
coo
,
out
);
CooToCsrKernel
<
T
,
Context
>
(
dev_ctx
,
coo
,
out
);
}
}
template
<
typename
T
,
typename
Context
>
template
<
typename
T
,
typename
Context
>
SparseCsrTensor
DenseTo
Sparse
Csr
(
const
Context
&
dev_ctx
,
const
DenseTensor
&
x
)
{
SparseCsrTensor
DenseToCsr
(
const
Context
&
dev_ctx
,
const
DenseTensor
&
x
)
{
DenseTensor
crows
;
DenseTensor
crows
;
DenseTensor
cols
;
DenseTensor
cols
;
DenseTensor
non_zero_elements
;
DenseTensor
non_zero_elements
;
SparseCsrTensor
csr
(
crows
,
cols
,
non_zero_elements
,
x
.
dims
());
SparseCsrTensor
csr
(
crows
,
cols
,
non_zero_elements
,
x
.
dims
());
DenseTo
Sparse
CsrKernel
<
T
,
Context
>
(
dev_ctx
,
x
,
&
csr
);
DenseToCsrKernel
<
T
,
Context
>
(
dev_ctx
,
x
,
&
csr
);
return
csr
;
return
csr
;
}
}
template
<
typename
T
,
typename
Context
>
template
<
typename
T
,
typename
Context
>
void
Sparse
CooToDenseKernel
(
const
Context
&
dev_ctx
,
void
CooToDenseKernel
(
const
Context
&
dev_ctx
,
const
SparseCooTensor
&
x
,
const
SparseCooTensor
&
x
,
DenseTensor
*
out
);
DenseTensor
*
out
);
template
<
typename
T
,
typename
Context
>
template
<
typename
T
,
typename
Context
>
DenseTensor
Sparse
CooToDense
(
const
Context
&
dev_ctx
,
const
SparseCooTensor
&
x
)
{
DenseTensor
CooToDense
(
const
Context
&
dev_ctx
,
const
SparseCooTensor
&
x
)
{
DenseTensorMeta
meta
(
x
.
dtype
(),
x
.
dims
(),
x
.
non_zero_elements
().
layout
());
DenseTensorMeta
meta
(
x
.
dtype
(),
x
.
dims
(),
x
.
non_zero_elements
().
layout
());
DenseTensor
dense
=
phi
::
Empty
(
dev_ctx
,
std
::
move
(
meta
));
DenseTensor
dense
=
phi
::
Empty
(
dev_ctx
,
std
::
move
(
meta
));
Sparse
CooToDenseKernel
<
T
,
Context
>
(
dev_ctx
,
x
,
&
dense
);
CooToDenseKernel
<
T
,
Context
>
(
dev_ctx
,
x
,
&
dense
);
return
dense
;
return
dense
;
}
}
template
<
typename
T
,
typename
Context
>
template
<
typename
T
,
typename
Context
>
void
Sparse
CsrToDenseKernel
(
const
Context
&
dev_ctx
,
void
CsrToDenseKernel
(
const
Context
&
dev_ctx
,
const
SparseCsrTensor
&
x
,
const
SparseCsrTensor
&
x
,
DenseTensor
*
out
)
{
DenseTensor
*
out
)
{
DenseTensor
indices
;
DenseTensor
indices
;
DenseTensor
values
;
DenseTensor
values
;
SparseCooTensor
coo
(
indices
,
values
,
x
.
dims
());
SparseCooTensor
coo
(
indices
,
values
,
x
.
dims
());
Sparse
CsrToCooKernel
<
T
,
Context
>
(
dev_ctx
,
x
,
&
coo
);
CsrToCooKernel
<
T
,
Context
>
(
dev_ctx
,
x
,
&
coo
);
Sparse
CooToDenseKernel
<
T
,
Context
>
(
dev_ctx
,
coo
,
out
);
CooToDenseKernel
<
T
,
Context
>
(
dev_ctx
,
coo
,
out
);
}
}
template
<
typename
T
,
typename
Context
>
template
<
typename
T
,
typename
Context
>
DenseTensor
Sparse
CsrToDense
(
const
Context
&
dev_ctx
,
const
SparseCsrTensor
&
x
)
{
DenseTensor
CsrToDense
(
const
Context
&
dev_ctx
,
const
SparseCsrTensor
&
x
)
{
DenseTensorMeta
meta
(
x
.
dtype
(),
x
.
dims
(),
x
.
non_zero_elements
().
layout
());
DenseTensorMeta
meta
(
x
.
dtype
(),
x
.
dims
(),
x
.
non_zero_elements
().
layout
());
DenseTensor
dense
=
phi
::
Empty
(
dev_ctx
,
std
::
move
(
meta
));
DenseTensor
dense
=
phi
::
Empty
(
dev_ctx
,
std
::
move
(
meta
));
Sparse
CsrToDenseKernel
<
T
,
Context
>
(
dev_ctx
,
x
,
&
dense
);
CsrToDenseKernel
<
T
,
Context
>
(
dev_ctx
,
x
,
&
dense
);
return
dense
;
return
dense
;
}
}
template
<
typename
T
,
typename
Context
>
template
<
typename
T
,
typename
Context
>
void
CooValues
Kernel
(
const
Context
&
dev_ctx
,
void
ValuesCoo
Kernel
(
const
Context
&
dev_ctx
,
const
SparseCooTensor
&
x
,
const
SparseCooTensor
&
x
,
DenseTensor
*
out
)
{
DenseTensor
*
out
)
{
*
out
=
x
.
non_zero_elements
();
*
out
=
x
.
non_zero_elements
();
}
}
template
<
typename
T
,
typename
Context
>
template
<
typename
T
,
typename
Context
>
void
CsrValues
Kernel
(
const
Context
&
dev_ctx
,
void
ValuesCsr
Kernel
(
const
Context
&
dev_ctx
,
const
SparseCsrTensor
&
x
,
const
SparseCsrTensor
&
x
,
DenseTensor
*
out
)
{
DenseTensor
*
out
)
{
*
out
=
x
.
non_zero_elements
();
*
out
=
x
.
non_zero_elements
();
...
...
paddle/phi/tests/api/test_sparse_utils_api.cc
浏览文件 @
36739748
...
@@ -23,7 +23,7 @@ limitations under the License. */
...
@@ -23,7 +23,7 @@ limitations under the License. */
#include "paddle/phi/core/kernel_registry.h"
#include "paddle/phi/core/kernel_registry.h"
#include "paddle/phi/core/sparse_coo_tensor.h"
#include "paddle/phi/core/sparse_coo_tensor.h"
PD_DECLARE_KERNEL
(
dense_to_
sparse_
coo
,
CPU
,
ALL_LAYOUT
);
PD_DECLARE_KERNEL
(
dense_to_coo
,
CPU
,
ALL_LAYOUT
);
TEST
(
API
,
to_sparse_coo
)
{
TEST
(
API
,
to_sparse_coo
)
{
const
auto
alloc
=
std
::
make_shared
<
paddle
::
experimental
::
DefaultAllocator
>
(
const
auto
alloc
=
std
::
make_shared
<
paddle
::
experimental
::
DefaultAllocator
>
(
...
...
paddle/phi/tests/kernels/test_sparse_activation_dev_api.cc
浏览文件 @
36739748
...
@@ -47,7 +47,7 @@ TEST(DEV_API, sparse_relu) {
...
@@ -47,7 +47,7 @@ TEST(DEV_API, sparse_relu) {
phi
::
Empty
(
dev_ctx_cpu
,
phi
::
Empty
(
dev_ctx_cpu
,
DenseTensorMeta
(
DataType
::
FLOAT32
,
{
3
,
4
},
DataLayout
::
NCHW
));
DenseTensorMeta
(
DataType
::
FLOAT32
,
{
3
,
4
},
DataLayout
::
NCHW
));
memcpy
(
dense_x
.
data
<
float
>
(),
data
.
data
(),
data
.
size
()
*
sizeof
(
float
));
memcpy
(
dense_x
.
data
<
float
>
(),
data
.
data
(),
data
.
size
()
*
sizeof
(
float
));
auto
sparse_coo
=
sparse
::
DenseTo
Sparse
Coo
<
float
>
(
dev_ctx_cpu
,
dense_x
,
2
);
auto
sparse_coo
=
sparse
::
DenseToCoo
<
float
>
(
dev_ctx_cpu
,
dense_x
,
2
);
auto
sparse_out
=
sparse
::
ReluCoo
<
float
>
(
dev_ctx_cpu
,
sparse_coo
);
auto
sparse_out
=
sparse
::
ReluCoo
<
float
>
(
dev_ctx_cpu
,
sparse_coo
);
DenseTensor
dense_out
=
DenseTensor
dense_out
=
...
...
paddle/phi/tests/kernels/test_sparse_elementwise_dev_api.cc
浏览文件 @
36739748
...
@@ -49,12 +49,9 @@ namespace tests {
...
@@ -49,12 +49,9 @@ namespace tests {
const Sparse##type##Tensor& y, \
const Sparse##type##Tensor& y, \
const DDim& dense_dims) { \
const DDim& dense_dims) { \
auto out = sparse::ElementWise##name##type<T>(dev_ctx_cpu, x, y); \
auto out = sparse::ElementWise##name##type<T>(dev_ctx_cpu, x, y); \
const DenseTensor denseX = \
const DenseTensor denseX = sparse::type##ToDense<T>(dev_ctx_cpu, x); \
sparse::Sparse##type##ToDense<T>(dev_ctx_cpu, x); \
const DenseTensor denseY = sparse::type##ToDense<T>(dev_ctx_cpu, y); \
const DenseTensor denseY = \
const DenseTensor denseOut = sparse::type##ToDense<T>(dev_ctx_cpu, out); \
sparse::Sparse##type##ToDense<T>(dev_ctx_cpu, y); \
const DenseTensor denseOut = \
sparse::Sparse##type##ToDense<T>(dev_ctx_cpu, out); \
auto expectResult = name<T>(dev_ctx_cpu, denseX, denseY); \
auto expectResult = name<T>(dev_ctx_cpu, denseX, denseY); \
for (int j = 0; j < denseOut.numel(); ++j) { \
for (int j = 0; j < denseOut.numel(); ++j) { \
auto actualResultRow = denseOut.template data<T>()[j]; \
auto actualResultRow = denseOut.template data<T>()[j]; \
...
@@ -114,8 +111,8 @@ TEST(DEV_API, sparse_elementwise_coo_kernel_double) {
...
@@ -114,8 +111,8 @@ TEST(DEV_API, sparse_elementwise_coo_kernel_double) {
.
GetAllocator
(
paddle
::
platform
::
CPUPlace
())
.
GetAllocator
(
paddle
::
platform
::
CPUPlace
())
.
get
());
.
get
());
auto
coo_x
=
sparse
::
DenseTo
Sparse
Coo
<
T
>
(
dev_ctx_cpu
,
dense_x
,
sparse_dim
);
auto
coo_x
=
sparse
::
DenseToCoo
<
T
>
(
dev_ctx_cpu
,
dense_x
,
sparse_dim
);
auto
coo_y
=
sparse
::
DenseTo
Sparse
Coo
<
T
>
(
dev_ctx_cpu
,
dense_y
,
sparse_dim
);
auto
coo_y
=
sparse
::
DenseToCoo
<
T
>
(
dev_ctx_cpu
,
dense_y
,
sparse_dim
);
TestElementWiseAddCoo
<
T
>
(
dev_ctx_cpu
,
coo_x
,
coo_y
,
dense_dims
);
TestElementWiseAddCoo
<
T
>
(
dev_ctx_cpu
,
coo_x
,
coo_y
,
dense_dims
);
TestElementWiseSubtractCoo
<
T
>
(
dev_ctx_cpu
,
coo_x
,
coo_y
,
dense_dims
);
TestElementWiseSubtractCoo
<
T
>
(
dev_ctx_cpu
,
coo_x
,
coo_y
,
dense_dims
);
...
@@ -159,8 +156,8 @@ TEST(DEV_API, sparse_elementwise_csr_kernel_float) {
...
@@ -159,8 +156,8 @@ TEST(DEV_API, sparse_elementwise_csr_kernel_float) {
.
GetAllocator
(
paddle
::
platform
::
CPUPlace
())
.
GetAllocator
(
paddle
::
platform
::
CPUPlace
())
.
get
());
.
get
());
auto
csr_x
=
sparse
::
DenseTo
Sparse
Csr
<
T
>
(
dev_ctx_cpu
,
dense_x
);
auto
csr_x
=
sparse
::
DenseToCsr
<
T
>
(
dev_ctx_cpu
,
dense_x
);
auto
csr_y
=
sparse
::
DenseTo
Sparse
Csr
<
T
>
(
dev_ctx_cpu
,
dense_y
);
auto
csr_y
=
sparse
::
DenseToCsr
<
T
>
(
dev_ctx_cpu
,
dense_y
);
TestElementWiseAddCsr
<
T
>
(
dev_ctx_cpu
,
csr_x
,
csr_y
,
dense_dims
);
TestElementWiseAddCsr
<
T
>
(
dev_ctx_cpu
,
csr_x
,
csr_y
,
dense_dims
);
TestElementWiseSubtractCsr
<
T
>
(
dev_ctx_cpu
,
csr_x
,
csr_y
,
dense_dims
);
TestElementWiseSubtractCsr
<
T
>
(
dev_ctx_cpu
,
csr_x
,
csr_y
,
dense_dims
);
...
@@ -190,20 +187,18 @@ TEST(DEV_API, sparse_elementwise_csr_kernel_float) {
...
@@ -190,20 +187,18 @@ TEST(DEV_API, sparse_elementwise_csr_kernel_float) {
dev_ctx_cpu, \
dev_ctx_cpu, \
DenseTensorMeta(DataType::FLOAT32, dense_dims, DataLayout::NCHW)); \
DenseTensorMeta(DataType::FLOAT32, dense_dims, DataLayout::NCHW)); \
\
\
phi::name##GradKernel<T>( \
phi::name##GradKernel<T>(dev_ctx_cpu, \
dev_ctx_cpu, \
sparse::type##ToDense<T>(dev_ctx_cpu, x), \
sparse::Sparse##type##ToDense<T>(dev_ctx_cpu, x), \
sparse::type##ToDense<T>(dev_ctx_cpu, y), \
sparse::Sparse##type##ToDense<T>(dev_ctx_cpu, y), \
sparse::type##ToDense<T>(dev_ctx_cpu, out), \
sparse::Sparse##type##ToDense<T>(dev_ctx_cpu, out), \
-1, \
-1, \
&expectdx, \
&expectdx, \
&expectdy); \
&expectdy); \
const DenseTensor densedX = \
const DenseTensor densedX = \
sparse::
Sparse##type##ToDense<T>(dev_ctx_cpu, dresult[0]);
\
sparse::
type##ToDense<T>(dev_ctx_cpu, dresult[0]);
\
const DenseTensor densedY = \
const DenseTensor densedY = \
sparse::Sparse##type##ToDense<T>(dev_ctx_cpu, dresult[1]); \
sparse::type##ToDense<T>(dev_ctx_cpu, dresult[1]); \
const DenseTensor denseOut = \
const DenseTensor denseOut = sparse::type##ToDense<T>(dev_ctx_cpu, out); \
sparse::Sparse##type##ToDense<T>(dev_ctx_cpu, out); \
\
\
for (int j = 0; j < densedX.numel(); ++j) { \
for (int j = 0; j < densedX.numel(); ++j) { \
auto actualResultRow = densedX.template data<T>()[j]; \
auto actualResultRow = densedX.template data<T>()[j]; \
...
@@ -248,18 +243,16 @@ void TestElementWiseDivideCsrGrad(const Context& dev_ctx_cpu,
...
@@ -248,18 +243,16 @@ void TestElementWiseDivideCsrGrad(const Context& dev_ctx_cpu,
dev_ctx_cpu
,
dev_ctx_cpu
,
DenseTensorMeta
(
DataType
::
FLOAT32
,
dense_dims
,
DataLayout
::
NCHW
));
DenseTensorMeta
(
DataType
::
FLOAT32
,
dense_dims
,
DataLayout
::
NCHW
));
phi
::
DivideGradKernel
<
T
>
(
dev_ctx_cpu
,
phi
::
DivideGradKernel
<
T
>
(
dev_ctx_cpu
,
sparse
::
Sparse
CsrToDense
<
T
>
(
dev_ctx_cpu
,
x
),
sparse
::
CsrToDense
<
T
>
(
dev_ctx_cpu
,
x
),
sparse
::
Sparse
CsrToDense
<
T
>
(
dev_ctx_cpu
,
y
),
sparse
::
CsrToDense
<
T
>
(
dev_ctx_cpu
,
y
),
sparse
::
Sparse
CsrToDense
<
T
>
(
dev_ctx_cpu
,
out
),
sparse
::
CsrToDense
<
T
>
(
dev_ctx_cpu
,
out
),
sparse
::
Sparse
CsrToDense
<
T
>
(
dev_ctx_cpu
,
out
),
sparse
::
CsrToDense
<
T
>
(
dev_ctx_cpu
,
out
),
-
1
,
-
1
,
&
expectdx
,
&
expectdx
,
&
expectdy
);
&
expectdy
);
const
DenseTensor
densedX
=
const
DenseTensor
densedX
=
sparse
::
CsrToDense
<
T
>
(
dev_ctx_cpu
,
dresult
[
0
]);
sparse
::
SparseCsrToDense
<
T
>
(
dev_ctx_cpu
,
dresult
[
0
]);
const
DenseTensor
densedY
=
sparse
::
CsrToDense
<
T
>
(
dev_ctx_cpu
,
dresult
[
1
]);
const
DenseTensor
densedY
=
const
DenseTensor
denseOut
=
sparse
::
CsrToDense
<
T
>
(
dev_ctx_cpu
,
out
);
sparse
::
SparseCsrToDense
<
T
>
(
dev_ctx_cpu
,
dresult
[
1
]);
const
DenseTensor
denseOut
=
sparse
::
SparseCsrToDense
<
T
>
(
dev_ctx_cpu
,
out
);
for
(
int
j
=
0
;
j
<
densedX
.
numel
();
++
j
)
{
for
(
int
j
=
0
;
j
<
densedX
.
numel
();
++
j
)
{
auto
actualResultRow
=
densedX
.
template
data
<
T
>()[
j
];
auto
actualResultRow
=
densedX
.
template
data
<
T
>()[
j
];
auto
expectResultRow
=
expectdx
.
template
data
<
T
>()[
j
];
auto
expectResultRow
=
expectdx
.
template
data
<
T
>()[
j
];
...
@@ -291,18 +284,16 @@ void TestElementWiseDivideCooGrad(const Context& dev_ctx_cpu,
...
@@ -291,18 +284,16 @@ void TestElementWiseDivideCooGrad(const Context& dev_ctx_cpu,
dev_ctx_cpu
,
dev_ctx_cpu
,
DenseTensorMeta
(
DataType
::
FLOAT32
,
dense_dims
,
DataLayout
::
NCHW
));
DenseTensorMeta
(
DataType
::
FLOAT32
,
dense_dims
,
DataLayout
::
NCHW
));
phi
::
DivideGradKernel
<
T
>
(
dev_ctx_cpu
,
phi
::
DivideGradKernel
<
T
>
(
dev_ctx_cpu
,
sparse
::
Sparse
CooToDense
<
T
>
(
dev_ctx_cpu
,
x
),
sparse
::
CooToDense
<
T
>
(
dev_ctx_cpu
,
x
),
sparse
::
Sparse
CooToDense
<
T
>
(
dev_ctx_cpu
,
y
),
sparse
::
CooToDense
<
T
>
(
dev_ctx_cpu
,
y
),
sparse
::
Sparse
CooToDense
<
T
>
(
dev_ctx_cpu
,
out
),
sparse
::
CooToDense
<
T
>
(
dev_ctx_cpu
,
out
),
sparse
::
Sparse
CooToDense
<
T
>
(
dev_ctx_cpu
,
out
),
sparse
::
CooToDense
<
T
>
(
dev_ctx_cpu
,
out
),
-
1
,
-
1
,
&
expectdx
,
&
expectdx
,
&
expectdy
);
&
expectdy
);
const
DenseTensor
densedX
=
const
DenseTensor
densedX
=
sparse
::
CooToDense
<
T
>
(
dev_ctx_cpu
,
dresult
[
0
]);
sparse
::
SparseCooToDense
<
T
>
(
dev_ctx_cpu
,
dresult
[
0
]);
const
DenseTensor
densedY
=
sparse
::
CooToDense
<
T
>
(
dev_ctx_cpu
,
dresult
[
1
]);
const
DenseTensor
densedY
=
const
DenseTensor
denseOut
=
sparse
::
CooToDense
<
T
>
(
dev_ctx_cpu
,
out
);
sparse
::
SparseCooToDense
<
T
>
(
dev_ctx_cpu
,
dresult
[
1
]);
const
DenseTensor
denseOut
=
sparse
::
SparseCooToDense
<
T
>
(
dev_ctx_cpu
,
out
);
for
(
int
j
=
0
;
j
<
densedX
.
numel
();
++
j
)
{
for
(
int
j
=
0
;
j
<
densedX
.
numel
();
++
j
)
{
auto
actualResultRow
=
densedX
.
template
data
<
T
>()[
j
];
auto
actualResultRow
=
densedX
.
template
data
<
T
>()[
j
];
auto
expectResultRow
=
expectdx
.
template
data
<
T
>()[
j
];
auto
expectResultRow
=
expectdx
.
template
data
<
T
>()[
j
];
...
@@ -356,11 +347,11 @@ TEST(DEV_API, sparse_elementwise_csr_grad_kernel_float) {
...
@@ -356,11 +347,11 @@ TEST(DEV_API, sparse_elementwise_csr_grad_kernel_float) {
.
GetAllocator
(
paddle
::
platform
::
CPUPlace
())
.
GetAllocator
(
paddle
::
platform
::
CPUPlace
())
.
get
());
.
get
());
auto
csr_x
=
sparse
::
DenseTo
Sparse
Csr
<
T
>
(
dev_ctx_cpu
,
dense_x
);
auto
csr_x
=
sparse
::
DenseToCsr
<
T
>
(
dev_ctx_cpu
,
dense_x
);
auto
csr_y
=
sparse
::
DenseTo
Sparse
Csr
<
T
>
(
dev_ctx_cpu
,
dense_y
);
auto
csr_y
=
sparse
::
DenseToCsr
<
T
>
(
dev_ctx_cpu
,
dense_y
);
auto
dx
=
sparse
::
DenseTo
Sparse
Csr
<
T
>
(
dev_ctx_cpu
,
dense_y
);
auto
dx
=
sparse
::
DenseToCsr
<
T
>
(
dev_ctx_cpu
,
dense_y
);
auto
dy
=
sparse
::
DenseTo
Sparse
Csr
<
T
>
(
dev_ctx_cpu
,
dense_x
);
auto
dy
=
sparse
::
DenseToCsr
<
T
>
(
dev_ctx_cpu
,
dense_x
);
TestElementWiseAddCsrGrad
<
T
>
(
dev_ctx_cpu
,
csr_x
,
csr_y
,
dense_dims
);
TestElementWiseAddCsrGrad
<
T
>
(
dev_ctx_cpu
,
csr_x
,
csr_y
,
dense_dims
);
TestElementWiseSubtractCsrGrad
<
T
>
(
dev_ctx_cpu
,
csr_x
,
csr_y
,
dense_dims
);
TestElementWiseSubtractCsrGrad
<
T
>
(
dev_ctx_cpu
,
csr_x
,
csr_y
,
dense_dims
);
...
@@ -402,11 +393,11 @@ TEST(DEV_API, sparse_elementwise_coo_grad_kernel_double) {
...
@@ -402,11 +393,11 @@ TEST(DEV_API, sparse_elementwise_coo_grad_kernel_double) {
.
GetAllocator
(
paddle
::
platform
::
CPUPlace
())
.
GetAllocator
(
paddle
::
platform
::
CPUPlace
())
.
get
());
.
get
());
auto
csr_x
=
sparse
::
DenseTo
Sparse
Coo
<
T
>
(
dev_ctx_cpu
,
dense_x
,
sparse_dim
);
auto
csr_x
=
sparse
::
DenseToCoo
<
T
>
(
dev_ctx_cpu
,
dense_x
,
sparse_dim
);
auto
csr_y
=
sparse
::
DenseTo
Sparse
Coo
<
T
>
(
dev_ctx_cpu
,
dense_y
,
sparse_dim
);
auto
csr_y
=
sparse
::
DenseToCoo
<
T
>
(
dev_ctx_cpu
,
dense_y
,
sparse_dim
);
auto
dx
=
sparse
::
DenseTo
Sparse
Coo
<
T
>
(
dev_ctx_cpu
,
dense_y
,
sparse_dim
);
auto
dx
=
sparse
::
DenseToCoo
<
T
>
(
dev_ctx_cpu
,
dense_y
,
sparse_dim
);
auto
dy
=
sparse
::
DenseTo
Sparse
Coo
<
T
>
(
dev_ctx_cpu
,
dense_x
,
sparse_dim
);
auto
dy
=
sparse
::
DenseToCoo
<
T
>
(
dev_ctx_cpu
,
dense_x
,
sparse_dim
);
TestElementWiseAddCooGrad
<
T
>
(
dev_ctx_cpu
,
csr_x
,
csr_y
,
dense_dims
);
TestElementWiseAddCooGrad
<
T
>
(
dev_ctx_cpu
,
csr_x
,
csr_y
,
dense_dims
);
TestElementWiseSubtractCooGrad
<
T
>
(
dev_ctx_cpu
,
csr_x
,
csr_y
,
dense_dims
);
TestElementWiseSubtractCooGrad
<
T
>
(
dev_ctx_cpu
,
csr_x
,
csr_y
,
dense_dims
);
...
...
paddle/phi/tests/kernels/test_sparse_utils_dev_api.cc
浏览文件 @
36739748
...
@@ -94,8 +94,7 @@ void TestDenseToSparseCoo(const DenseTensor& dense_x,
...
@@ -94,8 +94,7 @@ void TestDenseToSparseCoo(const DenseTensor& dense_x,
.
get
());
.
get
());
// 1. test cpu
// 1. test cpu
auto
cpu_sparse_out
=
auto
cpu_sparse_out
=
sparse
::
DenseToCoo
<
T
>
(
dev_ctx_cpu
,
dense_x
,
sparse_dim
);
sparse
::
DenseToSparseCoo
<
T
>
(
dev_ctx_cpu
,
dense_x
,
sparse_dim
);
CheckResult
<
T
,
int64_t
>
(
&
dev_ctx_cpu
,
CheckResult
<
T
,
int64_t
>
(
&
dev_ctx_cpu
,
cpu_sparse_out
,
cpu_sparse_out
,
non_zero_data
,
non_zero_data
,
...
@@ -129,8 +128,7 @@ void TestDenseToSparseCoo(const DenseTensor& dense_x,
...
@@ -129,8 +128,7 @@ void TestDenseToSparseCoo(const DenseTensor& dense_x,
DenseTensorMeta
(
dense_x
.
dtype
(),
dense_x
.
dims
(),
dense_x
.
layout
()));
DenseTensorMeta
(
dense_x
.
dtype
(),
dense_x
.
dims
(),
dense_x
.
layout
()));
phi
::
Copy
(
dev_ctx_gpu
,
dense_x
,
phi
::
GPUPlace
(),
true
,
&
d_dense_x
);
phi
::
Copy
(
dev_ctx_gpu
,
dense_x
,
phi
::
GPUPlace
(),
true
,
&
d_dense_x
);
auto
sparse_out
=
auto
sparse_out
=
sparse
::
DenseToCoo
<
T
>
(
dev_ctx_gpu
,
d_dense_x
,
sparse_dim
);
sparse
::
DenseToSparseCoo
<
T
>
(
dev_ctx_gpu
,
d_dense_x
,
sparse_dim
);
CheckResult
<
T
,
int64_t
>
(
&
dev_ctx_gpu
,
CheckResult
<
T
,
int64_t
>
(
&
dev_ctx_gpu
,
sparse_out
,
sparse_out
,
non_zero_data
,
non_zero_data
,
...
@@ -310,7 +308,7 @@ void TestSparseCsrToCoo(const DDim& dense_dims,
...
@@ -310,7 +308,7 @@ void TestSparseCsrToCoo(const DDim& dense_dims,
paddle
::
memory
::
allocation
::
AllocatorFacade
::
Instance
()
paddle
::
memory
::
allocation
::
AllocatorFacade
::
Instance
()
.
GetAllocator
(
phi
::
CPUPlace
())
.
GetAllocator
(
phi
::
CPUPlace
())
.
get
());
.
get
());
auto
cpu_sparse_out
=
sparse
::
Sparse
CsrToCoo
<
T
>
(
dev_ctx_cpu
,
csr
);
auto
cpu_sparse_out
=
sparse
::
CsrToCoo
<
T
>
(
dev_ctx_cpu
,
csr
);
CheckResult
<
T
,
int64_t
>
(
&
dev_ctx_cpu
,
CheckResult
<
T
,
int64_t
>
(
&
dev_ctx_cpu
,
cpu_sparse_out
,
cpu_sparse_out
,
non_zero_data
,
non_zero_data
,
...
@@ -345,7 +343,7 @@ void TestSparseCsrToCoo(const DDim& dense_dims,
...
@@ -345,7 +343,7 @@ void TestSparseCsrToCoo(const DDim& dense_dims,
phi
::
Copy
(
dev_ctx_gpu
,
cols
,
d_cols
.
place
(),
true
,
&
d_cols
);
phi
::
Copy
(
dev_ctx_gpu
,
cols
,
d_cols
.
place
(),
true
,
&
d_cols
);
phi
::
Copy
(
dev_ctx_gpu
,
values
,
d_values
.
place
(),
true
,
&
d_values
);
phi
::
Copy
(
dev_ctx_gpu
,
values
,
d_values
.
place
(),
true
,
&
d_values
);
phi
::
SparseCsrTensor
d_csr
(
d_crows
,
d_cols
,
d_values
,
dense_dims
);
phi
::
SparseCsrTensor
d_csr
(
d_crows
,
d_cols
,
d_values
,
dense_dims
);
auto
cuda_sparse_out
=
sparse
::
Sparse
CsrToCoo
<
T
>
(
dev_ctx_gpu
,
d_csr
);
auto
cuda_sparse_out
=
sparse
::
CsrToCoo
<
T
>
(
dev_ctx_gpu
,
d_csr
);
CheckResult
<
T
,
int64_t
>
(
&
dev_ctx_gpu
,
CheckResult
<
T
,
int64_t
>
(
&
dev_ctx_gpu
,
cuda_sparse_out
,
cuda_sparse_out
,
non_zero_data
,
non_zero_data
,
...
@@ -491,7 +489,7 @@ void TestCooToCsr(const DDim& dense_dims,
...
@@ -491,7 +489,7 @@ void TestCooToCsr(const DDim& dense_dims,
paddle
::
memory
::
allocation
::
AllocatorFacade
::
Instance
()
paddle
::
memory
::
allocation
::
AllocatorFacade
::
Instance
()
.
GetAllocator
(
phi
::
CPUPlace
())
.
GetAllocator
(
phi
::
CPUPlace
())
.
get
());
.
get
());
auto
cpu_sparse_out
=
sparse
::
Sparse
CooToCsr
<
T
>
(
dev_ctx_cpu
,
coo
);
auto
cpu_sparse_out
=
sparse
::
CooToCsr
<
T
>
(
dev_ctx_cpu
,
coo
);
CheckCsrResult
<
T
,
int64_t
>
(
&
dev_ctx_cpu
,
CheckCsrResult
<
T
,
int64_t
>
(
&
dev_ctx_cpu
,
cpu_sparse_out
,
cpu_sparse_out
,
non_zero_data
,
non_zero_data
,
...
@@ -525,7 +523,7 @@ void TestCooToCsr(const DDim& dense_dims,
...
@@ -525,7 +523,7 @@ void TestCooToCsr(const DDim& dense_dims,
phi
::
Copy
(
dev_ctx_gpu
,
indices
,
phi
::
GPUPlace
(),
true
,
&
d_indices
);
phi
::
Copy
(
dev_ctx_gpu
,
indices
,
phi
::
GPUPlace
(),
true
,
&
d_indices
);
phi
::
Copy
(
dev_ctx_gpu
,
values
,
phi
::
GPUPlace
(),
true
,
&
d_values
);
phi
::
Copy
(
dev_ctx_gpu
,
values
,
phi
::
GPUPlace
(),
true
,
&
d_values
);
phi
::
SparseCooTensor
d_coo
(
d_indices
,
d_values
,
dense_dims
);
phi
::
SparseCooTensor
d_coo
(
d_indices
,
d_values
,
dense_dims
);
auto
cuda_sparse_out
=
sparse
::
Sparse
CooToCsr
<
T
>
(
dev_ctx_gpu
,
d_coo
);
auto
cuda_sparse_out
=
sparse
::
CooToCsr
<
T
>
(
dev_ctx_gpu
,
d_coo
);
CheckCsrResult
<
T
,
int64_t
>
(
&
dev_ctx_gpu
,
CheckCsrResult
<
T
,
int64_t
>
(
&
dev_ctx_gpu
,
cuda_sparse_out
,
cuda_sparse_out
,
non_zero_data
,
non_zero_data
,
...
@@ -591,7 +589,7 @@ void TestDenseToSparseCsr(const DenseTensor& dense_x,
...
@@ -591,7 +589,7 @@ void TestDenseToSparseCsr(const DenseTensor& dense_x,
.
get
());
.
get
());
// 1. test cpu
// 1. test cpu
auto
cpu_sparse_out
=
sparse
::
DenseTo
Sparse
Csr
<
T
>
(
dev_ctx_cpu
,
dense_x
);
auto
cpu_sparse_out
=
sparse
::
DenseToCsr
<
T
>
(
dev_ctx_cpu
,
dense_x
);
CheckCsrResult
<
T
,
int64_t
>
(
&
dev_ctx_cpu
,
CheckCsrResult
<
T
,
int64_t
>
(
&
dev_ctx_cpu
,
cpu_sparse_out
,
cpu_sparse_out
,
non_zero_data
,
non_zero_data
,
...
@@ -624,7 +622,7 @@ void TestDenseToSparseCsr(const DenseTensor& dense_x,
...
@@ -624,7 +622,7 @@ void TestDenseToSparseCsr(const DenseTensor& dense_x,
.
get
());
.
get
());
dev_ctx_gpu
.
PartialInitWithAllocator
();
dev_ctx_gpu
.
PartialInitWithAllocator
();
phi
::
Copy
(
dev_ctx_gpu
,
dense_x
,
phi
::
GPUPlace
(),
true
,
&
d_dense_x
);
phi
::
Copy
(
dev_ctx_gpu
,
dense_x
,
phi
::
GPUPlace
(),
true
,
&
d_dense_x
);
auto
sparse_out
=
sparse
::
DenseTo
Sparse
Csr
<
T
>
(
dev_ctx_gpu
,
d_dense_x
);
auto
sparse_out
=
sparse
::
DenseToCsr
<
T
>
(
dev_ctx_gpu
,
d_dense_x
);
CheckCsrResult
<
T
,
int64_t
>
(
&
dev_ctx_gpu
,
CheckCsrResult
<
T
,
int64_t
>
(
&
dev_ctx_gpu
,
sparse_out
,
sparse_out
,
...
@@ -731,7 +729,7 @@ void TestSparseCooToDense(const DDim& dense_dims,
...
@@ -731,7 +729,7 @@ void TestSparseCooToDense(const DDim& dense_dims,
SparseCooTensor
coo
(
dense_indices
,
dense_elements
,
dense_dims
);
SparseCooTensor
coo
(
dense_indices
,
dense_elements
,
dense_dims
);
DenseTensor
dense_out
=
sparse
::
Sparse
CooToDense
<
T
>
(
dev_ctx_cpu
,
coo
);
DenseTensor
dense_out
=
sparse
::
CooToDense
<
T
>
(
dev_ctx_cpu
,
coo
);
int
cmp
=
memcmp
(
int
cmp
=
memcmp
(
&
dense_data
[
0
],
dense_out
.
data
<
T
>
(),
sizeof
(
T
)
*
dense_data
.
size
());
&
dense_data
[
0
],
dense_out
.
data
<
T
>
(),
sizeof
(
T
)
*
dense_data
.
size
());
...
@@ -763,7 +761,7 @@ void TestSparseCooToDense(const DDim& dense_dims,
...
@@ -763,7 +761,7 @@ void TestSparseCooToDense(const DDim& dense_dims,
phi
::
Copy
(
phi
::
Copy
(
dev_ctx_gpu
,
dense_elements
,
phi
::
GPUPlace
(),
true
,
&
d_dense_elements
);
dev_ctx_gpu
,
dense_elements
,
phi
::
GPUPlace
(),
true
,
&
d_dense_elements
);
SparseCooTensor
coo_cuda
(
d_dense_indices
,
d_dense_elements
,
dense_dims
);
SparseCooTensor
coo_cuda
(
d_dense_indices
,
d_dense_elements
,
dense_dims
);
auto
dense_out_cuda
=
sparse
::
Sparse
CooToDense
<
T
>
(
dev_ctx_gpu
,
coo_cuda
);
auto
dense_out_cuda
=
sparse
::
CooToDense
<
T
>
(
dev_ctx_gpu
,
coo_cuda
);
DenseTensor
h_dense_out
(
alloc
.
get
(),
DenseTensor
h_dense_out
(
alloc
.
get
(),
DenseTensorMeta
(
dense_out_cuda
.
dtype
(),
DenseTensorMeta
(
dense_out_cuda
.
dtype
(),
...
@@ -878,7 +876,7 @@ void TestSparseCsrToDense(const DDim& dense_dims,
...
@@ -878,7 +876,7 @@ void TestSparseCsrToDense(const DDim& dense_dims,
paddle
::
memory
::
allocation
::
AllocatorFacade
::
Instance
()
paddle
::
memory
::
allocation
::
AllocatorFacade
::
Instance
()
.
GetAllocator
(
phi
::
CPUPlace
())
.
GetAllocator
(
phi
::
CPUPlace
())
.
get
());
.
get
());
DenseTensor
cpu_sparse_out
=
sparse
::
Sparse
CsrToDense
<
T
>
(
dev_ctx_cpu
,
csr
);
DenseTensor
cpu_sparse_out
=
sparse
::
CsrToDense
<
T
>
(
dev_ctx_cpu
,
csr
);
int
cmp_cpu
=
memcmp
(
cpu_sparse_out
.
data
<
T
>
(),
int
cmp_cpu
=
memcmp
(
cpu_sparse_out
.
data
<
T
>
(),
dense_data
.
data
(),
dense_data
.
data
(),
sizeof
(
T
)
*
dense_data
.
size
());
sizeof
(
T
)
*
dense_data
.
size
());
...
@@ -911,7 +909,7 @@ void TestSparseCsrToDense(const DDim& dense_dims,
...
@@ -911,7 +909,7 @@ void TestSparseCsrToDense(const DDim& dense_dims,
phi
::
Copy
(
dev_ctx_gpu
,
cols
,
phi
::
GPUPlace
(),
true
,
&
d_cols
);
phi
::
Copy
(
dev_ctx_gpu
,
cols
,
phi
::
GPUPlace
(),
true
,
&
d_cols
);
phi
::
Copy
(
dev_ctx_gpu
,
values
,
phi
::
GPUPlace
(),
true
,
&
d_values
);
phi
::
Copy
(
dev_ctx_gpu
,
values
,
phi
::
GPUPlace
(),
true
,
&
d_values
);
phi
::
SparseCsrTensor
d_csr
(
d_crows
,
d_cols
,
d_values
,
dense_dims
);
phi
::
SparseCsrTensor
d_csr
(
d_crows
,
d_cols
,
d_values
,
dense_dims
);
auto
cuda_sparse_out
=
sparse
::
Sparse
CsrToDense
<
T
>
(
dev_ctx_gpu
,
d_csr
);
auto
cuda_sparse_out
=
sparse
::
CsrToDense
<
T
>
(
dev_ctx_gpu
,
d_csr
);
phi
::
DenseTensor
h_out
(
alloc
.
get
(),
cpu_sparse_out
.
meta
());
phi
::
DenseTensor
h_out
(
alloc
.
get
(),
cpu_sparse_out
.
meta
());
phi
::
Copy
(
dev_ctx_gpu
,
cuda_sparse_out
,
phi
::
CPUPlace
(),
true
,
&
h_out
);
phi
::
Copy
(
dev_ctx_gpu
,
cuda_sparse_out
,
phi
::
CPUPlace
(),
true
,
&
h_out
);
int
cmp_cuda
=
int
cmp_cuda
=
...
...
python/paddle/fluid/dygraph/varbase_patch_methods.py
浏览文件 @
36739748
...
@@ -923,12 +923,7 @@ def monkey_patch_varbase():
...
@@ -923,12 +923,7 @@ def monkey_patch_varbase():
print(sparse_x.values())
print(sparse_x.values())
#[1, 2, 3, 4, 5]
#[1, 2, 3, 4, 5]
"""
"""
return
_C_ops
.
sparse_values
(
self
)
if
self
.
is_sparse_coo
()
or
self
.
is_sparse_csr
():
return
_C_ops
.
sparse_values
(
self
)
else
:
raise
ValueError
(
"only SparseCooTensor and SparseCsrTensor have method values"
)
@
framework
.
dygraph_only
@
framework
.
dygraph_only
def
to_dense
(
self
):
def
to_dense
(
self
):
...
@@ -956,12 +951,7 @@ def monkey_patch_varbase():
...
@@ -956,12 +951,7 @@ def monkey_patch_varbase():
# [4., 5., 0., 0.]]
# [4., 5., 0., 0.]]
"""
"""
if
self
.
is_sparse_coo
():
return
_C_ops
.
sparse_to_dense
(
self
)
return
_C_ops
.
sparse_coo_to_dense
(
self
)
elif
self
.
is_sparse_csr
():
return
_C_ops
.
sparse_to_dense
(
self
)
else
:
return
self
@
framework
.
dygraph_only
@
framework
.
dygraph_only
def
to_sparse_coo
(
self
,
sparse_dim
):
def
to_sparse_coo
(
self
,
sparse_dim
):
...
@@ -987,16 +977,7 @@ def monkey_patch_varbase():
...
@@ -987,16 +977,7 @@ def monkey_patch_varbase():
#values=[1., 2., 3., 4.]
#values=[1., 2., 3., 4.]
"""
"""
if
self
.
is_sparse_csr
():
return
_C_ops
.
sparse_to_sparse_coo
(
self
,
sparse_dim
)
return
_C_ops
.
sparse_to_sparse_coo
(
self
,
sparse_dim
)
elif
self
.
is_sparse_coo
():
return
self
elif
self
.
is_selected_rows
():
raise
ValueError
(
"SelectedRows does not support to_sparse_coo method"
)
else
:
#is dense tensor
return
_C_ops
.
sparse_dense_to_coo
(
self
,
sparse_dim
)
if
framework
.
_in_eager_mode_
and
not
hasattr
(
core
,
"eager"
):
if
framework
.
_in_eager_mode_
and
not
hasattr
(
core
,
"eager"
):
return
return
...
...
python/paddle/incubate/sparse/creation.py
浏览文件 @
36739748
...
@@ -166,7 +166,7 @@ def sparse_coo_tensor(indices,
...
@@ -166,7 +166,7 @@ def sparse_coo_tensor(indices,
"the number of dimensions(len(shape) must be sparse_dim({}) + dense_dim({}), but get {}"
"the number of dimensions(len(shape) must be sparse_dim({}) + dense_dim({}), but get {}"
.
format
(
sparse_dim
,
dense_dim
,
len
(
shape
)))
.
format
(
sparse_dim
,
dense_dim
,
len
(
shape
)))
return
_C_ops
.
sparse_
create_
sparse_coo_tensor
(
values
,
indices
,
shape
)
return
_C_ops
.
sparse_sparse_coo_tensor
(
values
,
indices
,
shape
)
#TODO: need to support shape is None
#TODO: need to support shape is None
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录