Skip to content

Commit 4c20442

Browse files
committed
Add more GPU tests
1 parent 62863b2 commit 4c20442

File tree

1 file changed

+87
-60
lines changed

1 file changed

+87
-60
lines changed

NDTensors/src/lib/BlockSparseArrays/test/test_basics.jl

Lines changed: 87 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ using NDTensors.BlockSparseArrays:
2525
block_reshape,
2626
block_stored_indices,
2727
view!
28+
using NDTensors.GPUArraysCoreExtensions: cpu
2829
using NDTensors.SparseArrayInterface: nstored
2930
using NDTensors.TensorAlgebra: contract
3031
using Test: @test, @test_broken, @test_throws, @testset
@@ -72,8 +73,10 @@ using .NDTensorsTestUtils: devices_list, is_supported_eltype
7273
@test_broken [ah[Block(Tuple(it))] for it in eachindex(block_stored_indices(ah))] isa Vector
7374
end
7475
@testset "Basics" begin
75-
a = BlockSparseArray{elt}([2, 3], [2, 3])
76-
@test a == BlockSparseArray{elt}(blockedrange([2, 3]), blockedrange([2, 3]))
76+
a = dev(BlockSparseArray{elt}([2, 3], [2, 3]))
77+
@allowscalar @test a == dev(
78+
BlockSparseArray{elt}(blockedrange([2, 3]), blockedrange([2, 3]))
79+
)
7780
@test eltype(a) === elt
7881
@test axes(a) == (1:5, 1:5)
7982
@test all(aᵢ -> aᵢ isa BlockedOneTo, axes(a))
@@ -82,7 +85,7 @@ using .NDTensorsTestUtils: devices_list, is_supported_eltype
8285
@test size(a) == (5, 5)
8386
@test block_nstored(a) == 0
8487
@test iszero(a)
85-
@test all(I -> iszero(a[I]), eachindex(a))
88+
@allowscalar @test all(I -> iszero(a[I]), eachindex(a))
8689
@test_throws DimensionMismatch a[Block(1, 1)] = randn(elt, 2, 3)
8790

8891
a = BlockSparseArray{elt}([2, 3], [2, 3])
@@ -108,14 +111,21 @@ using .NDTensorsTestUtils: devices_list, is_supported_eltype
108111
@test isnan(norm(a))
109112
end
110113
@testset "Tensor algebra" begin
111-
a = BlockSparseArray{elt}(undef, ([2, 3], [3, 4]))
114+
a = dev(BlockSparseArray{elt}(undef, ([2, 3], [3, 4])))
112115
@views for b in [Block(1, 2), Block(2, 1)]
113-
a[b] = randn(elt, size(a[b]))
116+
a[b] = dev(randn(elt, size(a[b])))
114117
end
115118
@test eltype(a) == elt
116119
@test block_nstored(a) == 2
117120
@test nstored(a) == 2 * 4 + 3 * 3
118121

122+
# TODO: Broken on GPU.
123+
if dev cpu
124+
a = dev(BlockSparseArray{elt}([2, 3], [3, 4]))
125+
@test_broken a[Block(1, 2)] .= 2
126+
end
127+
128+
# TODO: Broken on GPU.
119129
a = BlockSparseArray{elt}([2, 3], [3, 4])
120130
a[Block(1, 2)] .= 2
121131
@test eltype(a) == elt
@@ -126,6 +136,13 @@ using .NDTensorsTestUtils: devices_list, is_supported_eltype
126136
@test block_nstored(a) == 1
127137
@test nstored(a) == 2 * 4
128138

139+
# TODO: Broken on GPU.
140+
if dev cpu
141+
a = dev(BlockSparseArray{elt}([2, 3], [3, 4]))
142+
@test_broken a[Block(1, 2)] .= 0
143+
end
144+
145+
# TODO: Broken on GPU.
129146
a = BlockSparseArray{elt}([2, 3], [3, 4])
130147
a[Block(1, 2)] .= 0
131148
@test eltype(a) == elt
@@ -136,9 +153,9 @@ using .NDTensorsTestUtils: devices_list, is_supported_eltype
136153
@test block_nstored(a) == 1
137154
@test nstored(a) == 2 * 4
138155

139-
a = BlockSparseArray{elt}(undef, ([2, 3], [3, 4]))
156+
a = dev(BlockSparseArray{elt}(undef, ([2, 3], [3, 4])))
140157
@views for b in [Block(1, 2), Block(2, 1)]
141-
a[b] = randn(elt, size(a[b]))
158+
a[b] = dev(randn(elt, size(a[b])))
142159
end
143160
b = similar(a, complex(elt))
144161
@test eltype(b) == complex(eltype(a))
@@ -148,21 +165,23 @@ using .NDTensorsTestUtils: devices_list, is_supported_eltype
148165
@test size(b) == size(a)
149166
@test blocksize(b) == blocksize(a)
150167

151-
a = BlockSparseArray{elt}([2, 3], [3, 4])
168+
a = dev(BlockSparseArray{elt}([2, 3], [3, 4]))
152169
b = @view a[[Block(2), Block(1)], [Block(2), Block(1)]]
153170
c = @view b[Block(1, 1)]
154171
@test iszero(a)
155172
@test iszero(nstored(a))
156173
@test iszero(b)
157174
@test iszero(nstored(b))
158-
@test iszero(c)
175+
# TODO: Broken on GPU.
176+
@test iszero(c) broken = dev cpu
159177
@test iszero(nstored(c))
160-
a[5, 7] = 1
178+
@allowscalar a[5, 7] = 1
161179
@test !iszero(a)
162180
@test nstored(a) == 3 * 4
163181
@test !iszero(b)
164182
@test nstored(b) == 3 * 4
165-
@test !iszero(c)
183+
# TODO: Broken on GPU.
184+
@test !iszero(c) broken = dev cpu
166185
@test nstored(c) == 3 * 4
167186
d = @view a[1:4, 1:6]
168187
@test iszero(d)
@@ -193,12 +212,12 @@ using .NDTensorsTestUtils: devices_list, is_supported_eltype
193212
b ./= 2
194213
@test b a / 2
195214

196-
a = BlockSparseArray{elt}(undef, ([2, 3], [3, 4]))
215+
a = dev(BlockSparseArray{elt}(undef, ([2, 3], [3, 4])))
197216
@views for b in [Block(1, 2), Block(2, 1)]
198-
a[b] = randn(elt, size(a[b]))
217+
a[b] = dev(randn(elt, size(a[b])))
199218
end
200219
b = 2 * a
201-
@test Array(b) 2 * Array(a)
220+
@allowscalar @test Array(b) 2 * Array(a)
202221
@test eltype(b) == elt
203222
@test block_nstored(b) == 2
204223
@test nstored(b) == 2 * 4 + 3 * 3
@@ -213,12 +232,12 @@ using .NDTensorsTestUtils: devices_list, is_supported_eltype
213232
@test block_nstored(b) == 2
214233
@test nstored(b) == 2 * 4 + 3 * 3
215234

216-
a = BlockSparseArray{elt}(undef, ([2, 3], [3, 4]))
235+
a = dev(BlockSparseArray{elt}(undef, ([2, 3], [3, 4])))
217236
@views for b in [Block(1, 2), Block(2, 1)]
218-
a[b] = randn(elt, size(a[b]))
237+
a[b] = dev(randn(elt, size(a[b])))
219238
end
220239
b = a + a
221-
@test Array(b) 2 * Array(a)
240+
@allowscalar @test Array(b) 2 * Array(a)
222241
@test eltype(b) == elt
223242
@test block_nstored(b) == 2
224243
@test nstored(b) == 2 * 4 + 3 * 3
@@ -297,25 +316,28 @@ using .NDTensorsTestUtils: devices_list, is_supported_eltype
297316
@test nstored(b) == nstored(a[Block(1, 2)])
298317
@test block_nstored(b) == 1
299318

300-
a = BlockSparseArray{elt}(undef, ([2, 3], [3, 4]))
319+
a = dev(BlockSparseArray{elt}(undef, ([2, 3], [3, 4])))
301320
@views for b in [Block(1, 2), Block(2, 1)]
302-
a[b] = randn(elt, size(a[b]))
321+
a[b] = dev(randn(elt, size(a[b])))
303322
end
304323
for b in (a[2:4, 2:4], @view(a[2:4, 2:4]))
305-
@test b == Array(a)[2:4, 2:4]
324+
@allowscalar @test b == Array(a)[2:4, 2:4]
306325
@test size(b) == (3, 3)
307326
@test blocksize(b) == (2, 2)
308327
@test nstored(b) == 1 * 1 + 2 * 2
309328
@test block_nstored(b) == 2
310329
for f in (getindex, view)
311-
@test size(f(b, Block(1, 1))) == (1, 2)
312-
@test size(f(b, Block(2, 1))) == (2, 2)
313-
@test size(f(b, Block(1, 2))) == (1, 1)
314-
@test size(f(b, Block(2, 2))) == (2, 1)
315-
@test f(b, Block(1, 1)) == a[Block(1, 1)[2:2, 2:3]]
316-
@test f(b, Block(2, 1)) == a[Block(2, 1)[1:2, 2:3]]
317-
@test f(b, Block(1, 2)) == a[Block(1, 2)[2:2, 1:1]]
318-
@test f(b, Block(2, 2)) == a[Block(2, 2)[1:2, 1:1]]
330+
# TODO: Broken on GPU.
331+
@allowscalar begin
332+
@test size(f(b, Block(1, 1))) == (1, 2)
333+
@test size(f(b, Block(2, 1))) == (2, 2)
334+
@test size(f(b, Block(1, 2))) == (1, 1)
335+
@test size(f(b, Block(2, 2))) == (2, 1)
336+
@test f(b, Block(1, 1)) == a[Block(1, 1)[2:2, 2:3]]
337+
@test f(b, Block(2, 1)) == a[Block(2, 1)[1:2, 2:3]]
338+
@test f(b, Block(1, 2)) == a[Block(1, 2)[2:2, 1:1]]
339+
@test f(b, Block(2, 2)) == a[Block(2, 2)[1:2, 1:1]]
340+
end
319341
end
320342
end
321343

@@ -448,21 +470,23 @@ using .NDTensorsTestUtils: devices_list, is_supported_eltype
448470
end
449471
end
450472

451-
a = BlockSparseArray{elt}([2, 3], [2, 3])
473+
a = dev(BlockSparseArray{elt}([2, 3], [2, 3]))
452474
@views for b in [Block(1, 1), Block(2, 2)]
453475
# TODO: Use `blocksizes(a)[Int.(Tuple(b))...]` once available.
454-
a[b] = randn(elt, size(a[b]))
476+
a[b] = dev(randn(elt, size(a[b])))
455477
end
456478
for I in ([Block(2), Block(1)],)
457479
b = @view a[I, I]
458480
@test b[Block(1, 1)] == a[Block(2, 2)]
459481
@test b[Block(2, 1)] == a[Block(1, 2)]
460482
@test b[Block(1, 2)] == a[Block(2, 1)]
461483
@test b[Block(2, 2)] == a[Block(1, 1)]
462-
@test b[1, 1] == a[3, 3]
463-
@test b[4, 4] == a[1, 1]
464-
b[4, 4] = 44
465-
@test b[4, 4] == 44
484+
@allowscalar begin
485+
@test b[1, 1] == a[3, 3]
486+
@test b[4, 4] == a[1, 1]
487+
b[4, 4] = 44
488+
@test b[4, 4] == 44
489+
end
466490
end
467491

468492
a = BlockSparseArray{elt}(undef, ([2, 3], [3, 4]))
@@ -490,10 +514,10 @@ using .NDTensorsTestUtils: devices_list, is_supported_eltype
490514
end
491515
end
492516

493-
a = BlockSparseArray{elt}(undef, ([3, 3], [3, 3]))
517+
a = dev(BlockSparseArray{elt}(undef, ([3, 3], [3, 3])))
494518
# TODO: Define `block_diagindices`.
495519
@views for b in [Block(1, 1), Block(2, 2)]
496-
a[b] = randn(elt, size(a[b]))
520+
a[b] = dev(randn(elt, size(a[b])))
497521
end
498522
I = mortar([Block(1)[1:2], Block(2)[1:2]])
499523
b = a[:, I]
@@ -557,6 +581,7 @@ using .NDTensorsTestUtils: devices_list, is_supported_eltype
557581
@test iszero(a)
558582
@test iszero(block_nstored(a))
559583

584+
# TODO: Broken on GPU.
560585
a = BlockSparseArray{elt}([2, 3], [3, 4])
561586
for I in (Block.(1:2), [Block(1), Block(2)])
562587
b = @view a[I, I]
@@ -780,43 +805,45 @@ using .NDTensorsTestUtils: devices_list, is_supported_eltype
780805
end
781806
end
782807
@testset "LinearAlgebra" begin
783-
a1 = BlockSparseArray{elt}([2, 3], [2, 3])
784-
a1[Block(1, 1)] = randn(elt, size(@view(a1[Block(1, 1)])))
785-
a2 = BlockSparseArray{elt}([2, 3], [2, 3])
786-
a2[Block(1, 1)] = randn(elt, size(@view(a1[Block(1, 1)])))
808+
a1 = dev(BlockSparseArray{elt}([2, 3], [2, 3]))
809+
a1[Block(1, 1)] = dev(randn(elt, size(@view(a1[Block(1, 1)]))))
810+
a2 = dev(BlockSparseArray{elt}([2, 3], [2, 3]))
811+
a2[Block(1, 1)] = dev(randn(elt, size(@view(a1[Block(1, 1)]))))
787812
a_dest = a1 * a2
788-
@test Array(a_dest) Array(a1) * Array(a2)
813+
@allowscalar @test Array(a_dest) Array(a1) * Array(a2)
789814
@test a_dest isa BlockSparseArray{elt}
790815
@test block_nstored(a_dest) == 1
791816
end
792817
@testset "Matrix multiplication" begin
793-
a1 = BlockSparseArray{elt}([2, 3], [2, 3])
794-
a1[Block(1, 2)] = randn(elt, size(@view(a1[Block(1, 2)])))
795-
a1[Block(2, 1)] = randn(elt, size(@view(a1[Block(2, 1)])))
796-
a2 = BlockSparseArray{elt}([2, 3], [2, 3])
797-
a2[Block(1, 2)] = randn(elt, size(@view(a2[Block(1, 2)])))
798-
a2[Block(2, 1)] = randn(elt, size(@view(a2[Block(2, 1)])))
799-
@test Array(a1 * a2) Array(a1) * Array(a2)
800-
@test Array(a1' * a2) Array(a1') * Array(a2)
801-
@test Array(a1 * a2') Array(a1) * Array(a2')
802-
@test Array(a1' * a2') Array(a1') * Array(a2')
818+
a1 = dev(BlockSparseArray{elt}([2, 3], [2, 3]))
819+
a1[Block(1, 2)] = dev(randn(elt, size(@view(a1[Block(1, 2)]))))
820+
a1[Block(2, 1)] = dev(randn(elt, size(@view(a1[Block(2, 1)]))))
821+
a2 = dev(BlockSparseArray{elt}([2, 3], [2, 3]))
822+
a2[Block(1, 2)] = dev(randn(elt, size(@view(a2[Block(1, 2)]))))
823+
a2[Block(2, 1)] = dev(randn(elt, size(@view(a2[Block(2, 1)]))))
824+
for (a1′, a2′) in ((a1, a2), (a1', a2), (a1, a2'), (a1', a2'))
825+
a_dest = a1′ * a2′
826+
@allowscalar @test Array(a_dest) Array(a1) * Array(a2)
827+
end
803828
end
804829
@testset "TensorAlgebra" begin
805-
a1 = BlockSparseArray{elt}([2, 3], [2, 3])
806-
a1[Block(1, 1)] = randn(elt, size(@view(a1[Block(1, 1)])))
807-
a2 = BlockSparseArray{elt}([2, 3], [2, 3])
808-
a2[Block(1, 1)] = randn(elt, size(@view(a1[Block(1, 1)])))
830+
a1 = dev(BlockSparseArray{elt}([2, 3], [2, 3]))
831+
a1[Block(1, 1)] = dev(randn(elt, size(@view(a1[Block(1, 1)]))))
832+
a2 = dev(BlockSparseArray{elt}([2, 3], [2, 3]))
833+
a2[Block(1, 1)] = dev(randn(elt, size(@view(a1[Block(1, 1)]))))
809834
# TODO: Make this work, requires customization of `TensorAlgebra.fusedims` and
810835
# `TensorAlgebra.splitdims` in terms of `BlockSparseArrays.block_reshape`,
811836
# and customization of `TensorAlgebra.:⊗` in terms of `GradedAxes.tensor_product`.
812837
a_dest, dimnames_dest = contract(a1, (1, -1), a2, (-1, 2))
813-
a_dest_dense, dimnames_dest_dense = contract(Array(a1), (1, -1), Array(a2), (-1, 2))
814-
@test a_dest a_dest_dense
838+
@allowscalar begin
839+
a_dest_dense, dimnames_dest_dense = contract(Array(a1), (1, -1), Array(a2), (-1, 2))
840+
@test a_dest a_dest_dense
841+
end
815842
end
816843
@testset "block_reshape" begin
817-
a = BlockSparseArray{elt}(undef, ([3, 4], [2, 3]))
818-
a[Block(1, 2)] = randn(elt, size(@view(a[Block(1, 2)])))
819-
a[Block(2, 1)] = randn(elt, size(@view(a[Block(2, 1)])))
844+
a = dev(BlockSparseArray{elt}(undef, ([3, 4], [2, 3])))
845+
a[Block(1, 2)] = dev(randn(elt, size(@view(a[Block(1, 2)]))))
846+
a[Block(2, 1)] = dev(randn(elt, size(@view(a[Block(2, 1)]))))
820847
b = block_reshape(a, [6, 8, 9, 12])
821848
@test reshape(a[Block(1, 2)], 9) == b[Block(3)]
822849
@test reshape(a[Block(2, 1)], 8) == b[Block(2)]

0 commit comments

Comments
 (0)