Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
OpenDAS
torch-sparse
Commits
947e0369
Commit
947e0369
authored
Jan 11, 2021
by
rusty1s
Browse files
torch.half support for spmm (CPU)
parent
6e23f7fb
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
93 additions
and
72 deletions
+93
-72
csrc/cpu/reducer.h
csrc/cpu/reducer.h
+1
-1
csrc/cpu/spmm_cpu.cpp
csrc/cpu/spmm_cpu.cpp
+78
-71
test/test_matmul.py
test/test_matmul.py
+14
-0
No files found.
csrc/cpu/reducer.h
View file @
947e0369
...
@@ -72,7 +72,7 @@ template <typename scalar_t, ReductionType REDUCE> struct Reducer {
...
@@ -72,7 +72,7 @@ template <typename scalar_t, ReductionType REDUCE> struct Reducer {
if
(
REDUCE
==
SUM
||
REDUCE
==
MUL
||
REDUCE
==
DIV
)
if
(
REDUCE
==
SUM
||
REDUCE
==
MUL
||
REDUCE
==
DIV
)
*
address
=
val
;
*
address
=
val
;
else
if
(
REDUCE
==
MEAN
)
else
if
(
REDUCE
==
MEAN
)
*
address
=
val
/
(
count
>
0
?
count
:
(
scalar_t
)
1
);
*
address
=
val
/
(
scalar_t
)
(
count
>
0
?
count
:
1
);
else
if
(
REDUCE
==
MIN
||
REDUCE
==
MAX
)
{
else
if
(
REDUCE
==
MIN
||
REDUCE
==
MAX
)
{
if
(
count
>
0
)
{
if
(
count
>
0
)
{
*
address
=
val
;
*
address
=
val
;
...
...
csrc/cpu/spmm_cpu.cpp
View file @
947e0369
...
@@ -44,7 +44,8 @@ spmm_cpu(torch::Tensor rowptr, torch::Tensor col,
...
@@ -44,7 +44,8 @@ spmm_cpu(torch::Tensor rowptr, torch::Tensor col,
auto
K
=
mat
.
size
(
-
1
);
auto
K
=
mat
.
size
(
-
1
);
auto
B
=
mat
.
numel
()
/
(
N
*
K
);
auto
B
=
mat
.
numel
()
/
(
N
*
K
);
AT_DISPATCH_ALL_TYPES
(
mat
.
scalar_type
(),
"spmm"
,
[
&
]
{
AT_DISPATCH_ALL_TYPES_AND
(
at
::
ScalarType
::
Half
,
mat
.
scalar_type
(),
"spmm"
,
[
&
]
{
scalar_t
*
value_data
=
nullptr
;
scalar_t
*
value_data
=
nullptr
;
auto
mat_data
=
mat
.
data_ptr
<
scalar_t
>
();
auto
mat_data
=
mat
.
data_ptr
<
scalar_t
>
();
auto
out_data
=
out
.
data_ptr
<
scalar_t
>
();
auto
out_data
=
out
.
data_ptr
<
scalar_t
>
();
...
@@ -55,8 +56,10 @@ spmm_cpu(torch::Tensor rowptr, torch::Tensor col,
...
@@ -55,8 +56,10 @@ spmm_cpu(torch::Tensor rowptr, torch::Tensor col,
value_data
=
optional_value
.
value
().
data_ptr
<
scalar_t
>
();
value_data
=
optional_value
.
value
().
data_ptr
<
scalar_t
>
();
}
}
int64_t
grain_size
=
at
::
internal
::
GRAIN_SIZE
/
(
K
*
(
col
.
numel
()
/
M
));
int64_t
grain_size
=
at
::
parallel_for
(
0
,
B
*
M
,
grain_size
,
[
&
](
int64_t
begin
,
int64_t
end
)
{
at
::
internal
::
GRAIN_SIZE
/
(
K
*
(
col
.
numel
()
/
M
));
at
::
parallel_for
(
0
,
B
*
M
,
grain_size
,
[
&
](
int64_t
begin
,
int64_t
end
)
{
scalar_t
val
;
scalar_t
val
;
std
::
vector
<
scalar_t
>
vals
(
K
);
std
::
vector
<
scalar_t
>
vals
(
K
);
int64_t
row_start
,
row_end
,
b
,
m
,
c
;
int64_t
row_start
,
row_end
,
b
,
m
,
c
;
...
@@ -78,18 +81,20 @@ spmm_cpu(torch::Tensor rowptr, torch::Tensor col,
...
@@ -78,18 +81,20 @@ spmm_cpu(torch::Tensor rowptr, torch::Tensor col,
for
(
auto
k
=
0
;
k
<
K
;
k
++
)
{
for
(
auto
k
=
0
;
k
<
K
;
k
++
)
{
if
(
HAS_VALUE
)
if
(
HAS_VALUE
)
Reducer
<
scalar_t
,
REDUCE
>::
update
(
Reducer
<
scalar_t
,
REDUCE
>::
update
(
&
vals
[
k
],
val
*
mat_data
[
offset
+
c
*
K
+
k
],
&
args
[
k
],
&
vals
[
k
],
val
*
mat_data
[
offset
+
c
*
K
+
k
],
e
);
&
args
[
k
],
e
);
else
else
Reducer
<
scalar_t
,
REDUCE
>::
update
(
Reducer
<
scalar_t
,
REDUCE
>::
update
(
&
vals
[
k
],
mat_data
[
offset
+
c
*
K
+
k
],
&
args
[
k
],
e
);
&
vals
[
k
],
mat_data
[
offset
+
c
*
K
+
k
],
&
args
[
k
],
e
);
}
}
}
}
offset
=
b
*
M
*
K
+
m
*
K
;
offset
=
b
*
M
*
K
+
m
*
K
;
for
(
auto
k
=
0
;
k
<
K
;
k
++
)
for
(
auto
k
=
0
;
k
<
K
;
k
++
)
Reducer
<
scalar_t
,
REDUCE
>::
write
(
out_data
+
offset
+
k
,
vals
[
k
],
Reducer
<
scalar_t
,
REDUCE
>::
write
(
arg_out_data
+
offset
+
k
,
out_data
+
offset
+
k
,
vals
[
k
],
args
[
k
],
row_end
-
row_start
);
arg_out_data
+
offset
+
k
,
args
[
k
],
row_end
-
row_start
);
}
}
});
});
});
});
...
@@ -122,7 +127,8 @@ torch::Tensor spmm_value_bw_cpu(torch::Tensor row, torch::Tensor rowptr,
...
@@ -122,7 +127,8 @@ torch::Tensor spmm_value_bw_cpu(torch::Tensor row, torch::Tensor rowptr,
auto
row_data
=
row
.
data_ptr
<
int64_t
>
();
auto
row_data
=
row
.
data_ptr
<
int64_t
>
();
auto
rowptr_data
=
rowptr
.
data_ptr
<
int64_t
>
();
auto
rowptr_data
=
rowptr
.
data_ptr
<
int64_t
>
();
auto
col_data
=
col
.
data_ptr
<
int64_t
>
();
auto
col_data
=
col
.
data_ptr
<
int64_t
>
();
AT_DISPATCH_ALL_TYPES
(
mat
.
scalar_type
(),
"spmm_value_bw"
,
[
&
]
{
AT_DISPATCH_ALL_TYPES_AND
(
at
::
ScalarType
::
Half
,
mat
.
scalar_type
(),
"spmm_value_bw"
,
[
&
]
{
auto
mat_data
=
mat
.
data_ptr
<
scalar_t
>
();
auto
mat_data
=
mat
.
data_ptr
<
scalar_t
>
();
auto
grad_data
=
grad
.
data_ptr
<
scalar_t
>
();
auto
grad_data
=
grad
.
data_ptr
<
scalar_t
>
();
auto
out_data
=
out
.
data_ptr
<
scalar_t
>
();
auto
out_data
=
out
.
data_ptr
<
scalar_t
>
();
...
@@ -138,7 +144,8 @@ torch::Tensor spmm_value_bw_cpu(torch::Tensor row, torch::Tensor rowptr,
...
@@ -138,7 +144,8 @@ torch::Tensor spmm_value_bw_cpu(torch::Tensor row, torch::Tensor rowptr,
grad_data
[
b
*
M
*
K
+
row
*
K
+
k
];
grad_data
[
b
*
M
*
K
+
row
*
K
+
k
];
}
}
if
(
REDUCE
==
MEAN
)
{
if
(
REDUCE
==
MEAN
)
{
int
row_start
=
rowptr_data
[
row
],
row_end
=
rowptr_data
[
row
+
1
];
int
row_start
=
rowptr_data
[
row
],
row_end
=
rowptr_data
[
row
+
1
];
val
/=
(
scalar_t
)
std
::
max
(
row_end
-
row_start
,
1
);
val
/=
(
scalar_t
)
std
::
max
(
row_end
-
row_start
,
1
);
}
}
out_data
[
e
]
+=
val
;
out_data
[
e
]
+=
val
;
...
...
test/test_matmul.py
View file @
947e0369
...
@@ -45,6 +45,20 @@ def test_spmm(dtype, device, reduce):
...
@@ -45,6 +45,20 @@ def test_spmm(dtype, device, reduce):
assert
torch
.
allclose
(
expected_grad_other
,
other
.
grad
,
atol
=
1e-6
)
assert
torch
.
allclose
(
expected_grad_other
,
other
.
grad
,
atol
=
1e-6
)
def
test_spmm_half_precision
():
src_dense
=
torch
.
randn
((
10
,
8
),
dtype
=
torch
.
half
,
device
=
'cpu'
)
src_dense
[
2
:
4
,
:]
=
0
# Remove multiple rows.
src_dense
[:,
2
:
4
]
=
0
# Remove multiple columns.
src
=
SparseTensor
.
from_dense
(
src_dense
)
other
=
torch
.
randn
((
2
,
8
,
2
),
dtype
=
torch
.
half
,
device
=
'cpu'
)
expected
=
src_dense
@
other
out
=
src
@
other
assert
torch
.
allclose
(
expected
,
out
,
atol
=
1e-6
)
@
pytest
.
mark
.
parametrize
(
'dtype,device'
,
product
(
grad_dtypes
,
devices
))
@
pytest
.
mark
.
parametrize
(
'dtype,device'
,
product
(
grad_dtypes
,
devices
))
def
test_spspmm
(
dtype
,
device
):
def
test_spspmm
(
dtype
,
device
):
src
=
torch
.
tensor
([[
1
,
0
,
0
],
[
0
,
1
,
0
],
[
0
,
0
,
1
]],
dtype
=
dtype
,
src
=
torch
.
tensor
([[
1
,
0
,
0
],
[
0
,
1
,
0
],
[
0
,
0
,
1
]],
dtype
=
dtype
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment