@@ -104,7 +104,7 @@ for (fname, elty) in (
104104 @eval begin
105105 function ormqr! (
106106 side:: Char , trans:: Char , A:: ROCMatrix{$elty} ,
107- τ:: ROCVector{$elty} , C:: ROCVecOrMat {$elty} ,
107+ τ:: ROCVector{$elty} , C:: StridedROCVecOrMat {$elty} ,
108108 )
109109 $ elty <: Complex && trans == ' T' && throw (ArgumentError (
110110 " rocSOLVER.ormqr! supports only 'N' or 'C' for Complex types, " *
@@ -557,51 +557,39 @@ end
557557LinearAlgebra. qr! (A:: ROCMatrix{T} ) where T = QR (geqrf! (A)... )
558558
559559LinearAlgebra. lmul! (
560- A:: QRPackedQ{T,<:ROCArray,<:ROCArray} , B:: ROCVecOrMat {T} ,
560+ A:: QRPackedQ{T,<:ROCArray,<:ROCArray} , B:: StridedROCVecOrMat {T} ,
561561) where T =
562562 ormqr! (' L' , ' N' , A. factors, A. τ, B)
563563
564564LinearAlgebra. lmul! (
565- adjA:: Adjoint{T ,<:QRPackedQ{T,<:ROCArray,<:ROCArray}} ,
566- B:: ROCVecOrMat {T} ,
565+ adjA:: LinearAlgebra.AdjointQ{<:Any ,<:QRPackedQ{T,<:ROCArray,<:ROCArray}} ,
566+ B:: StridedROCVecOrMat {T} ,
567567) where T <: rocBLAS.ROCBLASReal =
568- ormqr! (' L' , ' T' , parent ( adjA) . factors, parent ( adjA) . τ, B)
568+ ormqr! (' L' , ' T' , adjA. Q . factors, adjA. Q . τ, B)
569569
570570LinearAlgebra. lmul! (
571- adjA:: Adjoint{T ,<:QRPackedQ{T,<:ROCArray,<:ROCArray}} ,
572- B:: ROCVecOrMat {T} ,
571+ adjA:: LinearAlgebra.AdjointQ{<:Any ,<:QRPackedQ{T,<:ROCArray,<:ROCArray}} ,
572+ B:: StridedROCVecOrMat {T} ,
573573) where T <: rocBLAS.ROCBLASComplex =
574- ormqr! (' L' , ' C' , parent (adjA). factors, parent (adjA). τ, B)
575-
576- LinearAlgebra. lmul! (
577- trA:: Transpose{T,<:QRPackedQ{T,<:ROCArray,<:ROCArray}} ,
578- B:: ROCVecOrMat{T} ,
579- ) where T <: rocBLAS.ROCBLASFloat =
580- ormqr! (' L' , ' T' , parent (trA). factors, parent (trA). τ, B)
574+ ormqr! (' L' , ' C' , adjA. Q. factors, adjA. Q. τ, B)
581575
582576LinearAlgebra. rmul! (
583- A:: ROCVecOrMat {T} ,
577+ A:: StridedROCVecOrMat {T} ,
584578 B:: QRPackedQ{T,<:ROCArray,<:ROCArray} ,
585579) where T <: rocBLAS.ROCBLASFloat =
586580 ormqr! (' R' , ' N' , B. factors, B. τ, A)
587581
588582LinearAlgebra. rmul! (
589- A:: ROCVecOrMat {T} ,
590- adjB:: Adjoint {<:Any,<:QRPackedQ{T,<:ROCArray,<:ROCArray}} ,
583+ A:: StridedROCVecOrMat {T} ,
584+ adjB:: LinearAlgebra.AdjointQ {<:Any,<:QRPackedQ{T,<:ROCArray,<:ROCArray}} ,
591585) where T <: rocBLAS.ROCBLASReal =
592- ormqr! (' R' , ' T' , parent ( adjB) . factors, parent ( adjB) . τ, A)
586+ ormqr! (' R' , ' T' , adjB. Q . factors, adjB. Q . τ, A)
593587
594588LinearAlgebra. rmul! (
595- A:: ROCVecOrMat {T} ,
596- adjB:: Adjoint {<:Any,<:QRPackedQ{T,<:ROCArray,<:ROCArray}} ,
589+ A:: StridedROCVecOrMat {T} ,
590+ adjB:: LinearAlgebra.AdjointQ {<:Any,<:QRPackedQ{T,<:ROCArray,<:ROCArray}} ,
597591) where T <: rocBLAS.ROCBLASComplex =
598- ormqr! (' R' , ' C' , parent (adjB). factors, parent (adjB). τ, A)
599-
600- LinearAlgebra. rmul! (
601- A:: ROCVecOrMat{T} ,
602- trA:: Transpose{<:Any,<:QRPackedQ{T,<:ROCArray,<:ROCArray}} ,
603- ) where T <: rocBLAS.ROCBLASFloat =
604- ormqr! (' R' , ' T' , parent (trA). factors, parent (adjB). τ, A)
592+ ormqr! (' R' , ' C' , adjB. Q. factors, adjB. Q. τ, A)
605593
606594function LinearAlgebra. ldiv! (_qr:: QR , b:: ROCVector )
607595 m, n = size (_qr)
@@ -626,6 +614,25 @@ function LinearAlgebra.ldiv!(x::ROCArray, _qr::QR, b::ROCArray)
626614 return x
627615end
628616
617+ # Override \ for GPU QR to avoid stdlib's _zeros() allocating CPU arrays.
618+ function Base.:\ (F:: QR{T,<:ROCMatrix,<:ROCVector} , b:: ROCVector{T} ) where T
619+ ldiv! (F, copy (b))
620+ end
621+
622+ function Base.:\ (F:: QR{<:Any,<:ROCMatrix,<:ROCVector} , b:: ROCVector )
623+ factors, τ, b = copy_rocblasfloat (F. factors, F. τ, b)
624+ ldiv! (QR (factors, τ), b)
625+ end
626+
627+ function Base.:\ (F:: QR{T,<:ROCMatrix,<:ROCVector} , B:: ROCMatrix{T} ) where T
628+ ldiv! (F, copy (B))
629+ end
630+
631+ function Base.:\ (F:: QR{<:Any,<:ROCMatrix,<:ROCVector} , B:: ROCMatrix )
632+ factors, τ, B = copy_rocblasfloat (F. factors, F. τ, B)
633+ ldiv! (QR (factors, τ), B)
634+ end
635+
629636# LAPACK
630637
631638for elty in (:Float32 , :Float64 , :ComplexF32 , :ComplexF64 )
@@ -639,7 +646,7 @@ for elty in (:Float32, :Float64, :ComplexF32, :ComplexF64)
639646 LinearAlgebra. LAPACK. getrf! (A:: ROCMatrix{$elty} ) = rocSOLVER. getrf! (A)
640647 LinearAlgebra. LAPACK. getrf! (A:: ROCMatrix{$elty} , ipiv:: ROCVector{Cint} ) = rocSOLVER. getrf! (A, ipiv)
641648 LinearAlgebra. LAPACK. getrs! (trans:: Char , A:: ROCMatrix{$elty} , ipiv:: ROCVector{Cint} , B:: ROCVecOrMat{$elty} ) = rocSOLVER. getrs! (trans, A, ipiv, B)
642- LinearAlgebra. LAPACK. ormqr! (side:: Char , trans:: Char , A:: ROCMatrix{$elty} , tau:: ROCVector{$elty} , C:: ROCVecOrMat {$elty} ) = rocSOLVER. ormqr! (side, trans, A, tau, C)
649+ LinearAlgebra. LAPACK. ormqr! (side:: Char , trans:: Char , A:: ROCMatrix{$elty} , tau:: ROCVector{$elty} , C:: StridedROCVecOrMat {$elty} ) = rocSOLVER. ormqr! (side, trans, A, tau, C)
643650 LinearAlgebra. LAPACK. orgqr! (A:: ROCMatrix{$elty} , tau:: ROCVector{$elty} ) = rocSOLVER. orgqr! (A, tau)
644651 LinearAlgebra. LAPACK. gebrd! (A:: ROCMatrix{$elty} ) = rocSOLVER. gebrd! (A)
645652 LinearAlgebra. LAPACK. gesvd! (jobu:: Char , jobvt:: Char , A:: ROCMatrix{$elty} ) = rocSOLVER. gesvd! (jobu, jobvt, A)
0 commit comments