-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathunblockedsubarray.jl
More file actions
96 lines (84 loc) · 2.78 KB
/
unblockedsubarray.jl
File metadata and controls
96 lines (84 loc) · 2.78 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
87
88
89
90
91
92
93
94
95
96
using ArrayLayouts: ArrayLayouts, MemoryLayout
using Base.Broadcast: BroadcastStyle
using BlockArrays: BlockArrays, Block, BlockIndexRange, BlockSlice
using TypeParameterAccessors: TypeParameterAccessors, parenttype, similartype
const UnblockedIndices = Union{
Vector{<:Integer},
BlockSlice{<:Block{1}},
BlockSlice{<:BlockIndexRange{1}},
BlockSlice{<:BlockIndexVector},
}
const UnblockedSubArray{T, N} = SubArray{
T, N, <:AbstractBlockSparseArray{T, N}, <:Tuple{Vararg{UnblockedIndices}},
}
function BlockArrays.blocks(a::UnblockedSubArray)
return SingleBlockView(a)
end
using FunctionImplementations: FunctionImplementations, Style
function FunctionImplementations.Style(arraytype::Type{<:UnblockedSubArray})
return Style(blocktype(parenttype(arraytype)))
end
function ArrayLayouts.MemoryLayout(arraytype::Type{<:UnblockedSubArray})
return MemoryLayout(blocktype(parenttype(arraytype)))
end
function Base.Broadcast.BroadcastStyle(arraytype::Type{<:UnblockedSubArray})
return BroadcastStyle(blocktype(parenttype(arraytype)))
end
function Base.similar(a::UnblockedSubArray)
return similar(a, eltype(a))
end
function Base.similar(a::UnblockedSubArray, elt::Type)
return similar(a, elt, axes(a))
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 Base.copyto!(dst::AbstractArray, src::UnblockedSubArray)
return @invoke copyto!(dst::AbstractArray, src::AbstractArray)
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