1
1
# integration with LinearAlgebra stdlib
2
2
3
- function LinearAlgebra. transpose! (At:: AbstractGPUArray{T, 2} , A:: AbstractGPUArray{T, 2} ) where T
3
+ # # transpose and adjoint
4
+
5
+ function transpose_f! (f, At:: AbstractGPUArray{T, 2} , A:: AbstractGPUArray{T, 2} ) where T
4
6
gpu_call (At, A) do ctx, At, A
5
7
idx = @cartesianidx A ctx
6
- @inbounds At[idx[2 ], idx[1 ]] = A[idx[1 ], idx[2 ]]
8
+ @inbounds At[idx[2 ], idx[1 ]] = f ( A[idx[1 ], idx[2 ]])
7
9
return
8
10
end
9
11
At
10
12
end
11
13
12
- function genperm (I:: CartesianIndex{N} , perm:: NTuple{N} ) where N
13
- CartesianIndex (ntuple (d-> (@inbounds return I[perm[d]]), Val (N)))
14
+ LinearAlgebra. transpose! (At:: AbstractGPUArray , A:: AbstractGPUArray ) = transpose_f! (transpose, At, A)
15
+ LinearAlgebra. adjoint! (At:: AbstractGPUArray , A:: AbstractGPUArray ) = transpose_f! (adjoint, At, A)
16
+
17
+ function Base. copyto! (A:: AbstractGPUArray , B:: Adjoint{T, <: AbstractGPUArray} ) where T
18
+ adjoint! (A, B. parent)
14
19
end
15
20
16
- function LinearAlgebra. permutedims! (dest:: AbstractGPUArray , src:: AbstractGPUArray , perm) where N
17
- perm isa Tuple || (perm = Tuple (perm))
18
- gpu_call (dest, src, perm) do ctx, dest, src, perm
19
- I = @cartesianidx src ctx
20
- @inbounds dest[genperm (I, perm)] = src[I]
21
- return
22
- end
23
- return dest
21
+ function Base. copyto! (A:: AbstractGPUArray , B:: Transpose{T, <: AbstractGPUArray} ) where T
22
+ transpose! (A, B. parent)
24
23
end
25
24
26
25
function Base. copyto! (A:: AbstractArray , B:: Adjoint{<:Any, <:AbstractGPUArray} )
29
28
function Base. copyto! (A:: AbstractArray , B:: Transpose{<:Any, <:AbstractGPUArray} )
30
29
copyto! (A, Transpose (Array (parent (B))))
31
30
end
31
+
32
+
33
+ # # triangular
34
+
32
35
function Base. copyto! (A:: AbstractArray , B:: UpperTriangular{<:Any, <:AbstractGPUArray} )
33
36
copyto! (A, UpperTriangular (Array (parent (B))))
34
37
end
35
38
function Base. copyto! (A:: AbstractArray , B:: LowerTriangular{<:Any, <:AbstractGPUArray} )
36
39
copyto! (A, LowerTriangular (Array (parent (B))))
37
40
end
38
41
39
- function Base. copyto! (A:: AbstractGPUArray , B:: Adjoint{T, <: AbstractGPUArray} ) where T
40
- transpose! (A, B. parent)
41
- end
42
-
43
42
function LinearAlgebra. tril! (A:: AbstractGPUMatrix{T} , d:: Integer = 0 ) where T
44
43
gpu_call (A, d) do ctx, _A, _d
45
44
I = @cartesianidx _A
@@ -65,8 +64,7 @@ function LinearAlgebra.triu!(A::AbstractGPUMatrix{T}, d::Integer = 0) where T
65
64
end
66
65
67
66
68
-
69
- # matrix multiplication
67
+ # # matrix multiplication
70
68
71
69
function generic_matmatmul! (C:: AbstractVecOrMat{R} , A:: AbstractVecOrMat{T} , B:: AbstractVecOrMat{S} ) where {T,S,R}
72
70
if size (A,2 ) != size (B,1 )
@@ -129,3 +127,20 @@ function generic_lmul!(s::Number, X::AbstractGPUArray)
129
127
end
130
128
131
129
LinearAlgebra. lmul! (a:: Number , B:: AbstractGPUArray ) = generic_lmul! (a, B)
130
+
131
+
132
+ # # permutedims
133
+
134
+ function genperm (I:: CartesianIndex{N} , perm:: NTuple{N} ) where N
135
+ CartesianIndex (ntuple (d-> (@inbounds return I[perm[d]]), Val (N)))
136
+ end
137
+
138
+ function LinearAlgebra. permutedims! (dest:: AbstractGPUArray , src:: AbstractGPUArray , perm) where N
139
+ perm isa Tuple || (perm = Tuple (perm))
140
+ gpu_call (dest, src, perm) do ctx, dest, src, perm
141
+ I = @cartesianidx src ctx
142
+ @inbounds dest[genperm (I, perm)] = src[I]
143
+ return
144
+ end
145
+ return dest
146
+ end
0 commit comments