-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathunblockedsubarray.jl
More file actions
86 lines (74 loc) · 2.4 KB
/
unblockedsubarray.jl
File metadata and controls
86 lines (74 loc) · 2.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
using ArrayLayouts: ArrayLayouts, MemoryLayout
using Base.Broadcast: Broadcast, BroadcastStyle
using BlockArrays: BlockArrays, Block, BlockIndexRange, BlockSlice
using TypeParameterAccessors: TypeParameterAccessors, parenttype, similartype
const UnblockedIndices = Union{
Vector{<:Integer},BlockSlice{<:Block{1}},BlockSlice{<:BlockIndexRange{1}}
}
const UnblockedSubArray{T,N} = SubArray{
T,N,<:AbstractBlockSparseArray{T,N},<:Tuple{Vararg{UnblockedIndices}}
}
function BlockArrays.blocks(a::UnblockedSubArray)
return SingleBlockView(a)
end
function DerivableInterfaces.interface(arraytype::Type{<:UnblockedSubArray})
return interface(blocktype(parenttype(arraytype)))
end
function ArrayLayouts.MemoryLayout(arraytype::Type{<:UnblockedSubArray})
return MemoryLayout(blocktype(parenttype(arraytype)))
end
function Broadcast.BroadcastStyle(arraytype::Type{<:UnblockedSubArray})
return BroadcastStyle(blocktype(parenttype(arraytype)))
end
function TypeParameterAccessors.similartype(arraytype::Type{<:UnblockedSubArray}, elt::Type)
return similartype(blocktype(parenttype(arraytype)), elt)
end
function Base.similar(
a::UnblockedSubArray, elt::Type, axes::Tuple{Base.OneTo,Vararg{Base.OneTo}}
)
return similar(similartype(blocktype(parenttype(a)), elt), axes)
end
function Base.similar(a::UnblockedSubArray, elt::Type, size::Tuple{Int,Vararg{Int}})
return similar(a, elt, Base.OneTo.(size))
end
function ArrayLayouts.sub_materialize(a::UnblockedSubArray)
a_cpu = adapt(Array, a)
a_cpu′ = similar(a_cpu)
a_cpu′ .= a_cpu
if typeof(a) === typeof(a_cpu)
return a_cpu′
end
a′ = similar(a)
a′ .= a_cpu′
return a′
end
function Base.map!(
f, a_dest::AbstractArray, a_src1::UnblockedSubArray, a_src_rest::UnblockedSubArray...
)
return invoke(
map!,
Tuple{Any,AbstractArray,AbstractArray,Vararg{AbstractArray}},
f,
a_dest,
a_src1,
a_src_rest...,
)
end
# Fix ambiguity and scalar indexing errors with GPUArrays.
using Adapt: adapt
using GPUArraysCore: GPUArraysCore
function Base.map!(
f,
a_dest::GPUArraysCore.AnyGPUArray,
a_src1::UnblockedSubArray,
a_src_rest::UnblockedSubArray...,
)
a_dest_cpu = adapt(Array, a_dest)
a_srcs_cpu = map(adapt(Array), (a_src1, a_src_rest...))
map!(f, a_dest_cpu, a_srcs_cpu...)
a_dest .= a_dest_cpu
return a_dest
end
function Base.iszero(a::UnblockedSubArray)
return invoke(iszero, Tuple{AbstractArray}, adapt(Array, a))
end